Darrell, any comment on this? + and ^ are both valid choices of operator here and it's a little odd that one would be better than the other.
On Thu, Dec 14, 2017 at 08:25:30AM +0000, liucheng (J) wrote: > > > 发件人: liucheng (J) > 发送时间: 2017年12月13日 18:01 > 收件人: '[email protected]' > 主题: [ovs-discuss]conn_key_hash change hash arithmetic > > Hello all, > I run a test with the user conntrack. And I found if I only change the udp > port, then the hash with function “conn_key_hash” is not balance. > I change the hmap num(ct->buckets) to 4096 and ct->n_conn_limit to > 30,000,000. And I print the num of the nodes contained in the hmap’s bucket. > As an example, a result looks like below. Most bucket is empty, and some > bucket contain hundreds of nodes; > ~~~~~~~~~~~~~~~~~hmap 4095 count 4310 mask 4095~~~~~~~~~~~~~~~ > buket 488 content 367 node > buket 1077 content 514 node > buket 1118 content 281 node > buket 1261 content 423 node > buket 1280 content 268 node > buket 1603 content 319 node > buket 1724 content 352 node > buket 2676 content 155 node > buket 2993 content 471 node > buket 3028 content 325 node > buket 3836 content 355 node > buket 4060 content 480 node > > Then I change the code in conn_key_hash as the patch. And test result is the > max nodes in one bucket is 12. > The num of the bucket contained only one node is 5000542. > The num of the bucket contained only two node is 4337097. > The num of the bucket contained only three node is 2588535. > The num of the bucket contained only four node is 1196063. > The num of the bucket contained only five node is 460865. > The num of the bucket contained only six node is 155936. > The num of the bucket contained only seven node is 48727. > Most buckets contain few nodes. > > > diff --git a/lib/conntrack.c b/lib/conntrack.c > index 6d078f5..3edf809 100644 > --- a/lib/conntrack.c > +++ b/lib/conntrack.c > @@ -2034,7 +2034,7 @@ conn_key_hash(const struct conn_key *key, uint32_t > basis) > hdst = ct_endpoint_hash_add(hdst, &key->dst); > > /* Even if source and destination are swapped the hash will be the same. > */ > - hash = hsrc ^ hdst; > + hash = hsrc + hdst; > > /* Hash the rest of the key(L3 and L4 types and zone). */ > hash = hash_words((uint32_t *) (&key->dst + 1), > > _______________________________________________ > discuss mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-discuss _______________________________________________ discuss mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
