Skip to content
  • Christoph Lameter's avatar
    [PATCH] ZVC: Scale thresholds depending on the size of the system · df9ecaba
    Christoph Lameter authored
    
    
    The ZVC counter update threshold is currently set to a fixed value of 32.
    This patch sets up the threshold depending on the number of processors and
    the sizes of the zones in the system.
    
    With the current threshold of 32, I was able to observe slight contention
    when more than 130-140 processors concurrently updated the counters.  The
    contention vanished when I either increased the threshold to 64 or used
    Andrew's idea of overstepping the interval (see ZVC overstep patch).
    
    However, we saw contention again at 220-230 processors.  So we need higher
    values for larger systems.
    
    But the current default is already a bit of an overkill for smaller
    systems.  Some systems have tiny zones where precision matters.  For
    example i386 and x86_64 have 16M DMA zones and either 900M ZONE_NORMAL or
    ZONE_DMA32.  These are even present on SMP and NUMA systems.
    
    The patch here sets up a threshold based on the number of processors in the
    system and the size of the zone that these counters are used for.  The
    threshold should grow logarithmically, so we use fls() as an easy
    approximation.
    
    Results of tests on a system with 1024 processors (4TB RAM)
    
    The following output is from a test allocating 1GB of memory concurrently
    on each processor (Forking the process.  So contention on mmap_sem and the
    pte locks is not a factor):
    
                           X                   MIN
    TYPE:               CPUS       WALL       WALL        SYS     USER     TOTCPU
    fork                   1      0.552      0.552      0.540    0.012      0.552
    fork                   4      0.552      0.548      2.164    0.036      2.200
    fork                  16      0.564      0.548      8.812    0.164      8.976
    fork                 128      0.580      0.572     72.204    1.208     73.412
    fork                 256      1.300      0.660    310.400    2.160    312.560
    fork                 512      3.512      0.696   1526.836    4.816   1531.652
    fork                1020     20.024      0.700  17243.176    6.688  17249.863
    
    So a threshold of 32 is fine up to 128 processors. At 256 processors contention
    becomes a factor.
    
    Overstepping the counter (earlier patch) improves the numbers a bit:
    
    fork                   4      0.552      0.548      2.164    0.040      2.204
    fork                  16      0.552      0.548      8.640    0.148      8.788
    fork                 128      0.556      0.548     69.676    0.956     70.632
    fork                 256      0.876      0.636    212.468    2.108    214.576
    fork                 512      2.276      0.672    997.324    4.260   1001.584
    fork                1020     13.564      0.680  11586.436    6.088  11592.523
    
    Still contention at 512 and 1020. Contention at 1020 is down by a third.
    256 still has a slight bit of contention.
    
    After this patch the counter threshold will be set to 125 which reduces
    contention significantly:
    
    fork                 128      0.560      0.548     69.776    0.932     70.708
    fork                 256      0.636      0.556    143.460    2.036    145.496
    fork                 512      0.640      0.548    284.244    4.236    288.480
    fork                1020      1.500      0.588   1326.152    8.892   1335.044
    
    [akpm@osdl.org: !SMP build fix]
    Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    df9ecaba