netfilter: conntrack: adjust nf_conntrack_buckets default value
authorMarcelo Leitner <mleitner@redhat.com>
Wed, 3 Dec 2014 19:30:19 +0000 (17:30 -0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 23 Dec 2014 13:20:10 +0000 (14:20 +0100)
Manually bumping either nf_conntrack_buckets or nf_conntrack_max has
become a common task as our Linux servers tend to serve more and more
clients/applications, so let's adjust nf_conntrack_buckets this to a
more updated value.

Now for systems with more than 4GB of memory, nf_conntrack_buckets
becomes 65536 instead of 16384, resulting in nf_conntrack_max=256k
entries.

Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
Acked-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Documentation/networking/nf_conntrack-sysctl.txt
net/netfilter/nf_conntrack_core.c

index 70da5086153dbd24a9c9258e73cc16440d247519..f55599c62c9d61335005202146fdad75c8c133b9 100644 (file)
@@ -11,7 +11,8 @@ nf_conntrack_buckets - INTEGER (read-only)
        Size of hash table. If not specified as parameter during module
        loading, the default size is calculated by dividing total memory
        by 16384 to determine the number of buckets but the hash table will
-       never have fewer than 32 or more than 16384 buckets.
+       never have fewer than 32 and limited to 16384 buckets. For systems
+       with more than 4GB of memory it will be 65536 buckets.
 
 nf_conntrack_checksum - BOOLEAN
        0 - disabled
index a11674806707e18fb9d86860ad0717dfda0b0da2..da58cd4f2cb72fb2c7658f2136d7aaaab3da213e 100644 (file)
@@ -1624,13 +1624,18 @@ int nf_conntrack_init_start(void)
        for (i = 0; i < CONNTRACK_LOCKS; i++)
                spin_lock_init(&nf_conntrack_locks[i]);
 
-       /* Idea from tcp.c: use 1/16384 of memory.  On i386: 32MB
-        * machine has 512 buckets. >= 1GB machines have 16384 buckets. */
        if (!nf_conntrack_htable_size) {
+               /* Idea from tcp.c: use 1/16384 of memory.
+                * On i386: 32MB machine has 512 buckets.
+                * >= 1GB machines have 16384 buckets.
+                * >= 4GB machines have 65536 buckets.
+                */
                nf_conntrack_htable_size
                        = (((totalram_pages << PAGE_SHIFT) / 16384)
                           / sizeof(struct hlist_head));
-               if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
+               if (totalram_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE)))
+                       nf_conntrack_htable_size = 65536;
+               else if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
                        nf_conntrack_htable_size = 16384;
                if (nf_conntrack_htable_size < 32)
                        nf_conntrack_htable_size = 32;