kernel - Reduce the size of the callout wheel
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 10 Dec 2012 23:11:46 +0000 (15:11 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 14 Dec 2012 03:16:16 +0000 (19:16 -0800)
* The callout wheel is per-cpu but ncallout is calculated based on memory.
  A system with many cpus tended to allocate an excessive amount of memory
  in aggregate for the callout wheels.

* Reduce the size of the per-cpu callout wheel by approximately a factor
  of (ncpus).  On a 16G machine with 8 cores, aggregate callout wheel
  allocations is reduced from 128MB to 16MB.

sys/kern/kern_timeout.c

index 68d2f05..26fc6ba 100644 (file)
@@ -142,12 +142,18 @@ swi_softclock_setup(void *arg)
 {
        int cpu;
        int i;
+       int target;
 
        /*
         * Figure out how large a callwheel we need.  It must be a power of 2.
+        *
+        * ncallout is primarily based on available memory, don't explode
+        * the allocations if the system has a lot of cpus.
         */
+       target = ncallout / ncpus + 16;
+
        callwheelsize = 1;
-       while (callwheelsize < ncallout)
+       while (callwheelsize < target)
                callwheelsize <<= 1;
        callwheelmask = callwheelsize - 1;