On Thu, Dec 12, 2013 at 7:09 AM, Francesco Fusco <ffu...@redhat.com> wrote: > Currently OVS uses jhash2() for calculating flow hashes in its > internal flow_hash() function. The performance of the flow_hash() > function is critical, as the input data can be hundreds of bytes > long. > > OVS is largely deployed in x86_64 based datacenters. Therefore, > we argue that the performance critical fast path of OVS should > exploit underlying CPU features in order to reduce the per packet > processing costs. We replace jhash2 with the hash implementation > provided by the kernel hash lib, which exploits the crc32l > instruction to achieve high performance > > Our patch greatly reduces the hash footprint from ~200 cycles of > jhash2() to around ~90 cycles in case of ovs_flow_hash_crc() > (measured with rdtsc over maximum length flow keys on an i7 Intel > CPU). > > Additionally, we wrote a microbenchmark to stress the flow table > performance. The benchmark inserts random flows into the flow > hash and then performs lookups. Our hash deployed on a CRC32 > capable CPU reduces the lookup for 1000 flows, 100 masks from > ~10,100us to ~6,700us, for example. > > Thus, simply use the newly introduced arch_fast_hash2() as a > drop-in replacement. > > Signed-off-by: Francesco Fusco <ffu...@redhat.com> > Signed-off-by: Daniel Borkmann <dbork...@redhat.com> > Signed-off-by: Thomas Graf <tg...@redhat.com>
Acked-by: Jesse Gross <je...@nicira.com> Out of curiosity, did you try using crc32q? OVS data structures are already aligned to 8 bytes. It would also be interesting to know if a parallelized implementation is worthwhile, although my guess is that the OVS flow key is not quite long enough. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev