• J
    ipv4: Fix fib_trie rebalancing, part 4 (root thresholds) · 345aa031
    Jarek Poplawski 提交于
    Pawel Staszewski wrote:
    <blockquote>
    Some time ago i report this:
    http://bugzilla.kernel.org/show_bug.cgi?id=6648
    
    and now with 2.6.29 / 2.6.29.1 / 2.6.29.3 and 2.6.30 it back
    dmesg output:
    oprofile: using NMI interrupt.
    Fix inflate_threshold_root. Now=15 size=11 bits
    ...
    Fix inflate_threshold_root. Now=15 size=11 bits
    
    cat /proc/net/fib_triestat
    Basic info: size of leaf: 40 bytes, size of tnode: 56 bytes.
    Main:
            Aver depth:     2.28
            Max depth:      6
            Leaves:         276539
            Prefixes:       289922
            Internal nodes: 66762
              1: 35046  2: 13824  3: 9508  4: 4897  5: 2331  6: 1149  7: 5
    9: 1  18: 1
            Pointers: 691228
    Null ptrs: 347928
    Total size: 35709  kB
    </blockquote>
    
    It seems, the current threshold for root resizing is too aggressive,
    and it causes misleading warnings during big updates, but it might be
    also responsible for memory problems, especially with non-preempt
    configs, when RCU freeing is delayed long after call_rcu.
    
    It should be also mentioned that because of non-atomic changes during
    resizing/rebalancing the current lookup algorithm can miss valid leaves
    so it's additional argument to shorten these activities even at a cost
    of a minimally longer searching.
    
    This patch restores values before the patch "[IPV4]: fib_trie root
    node settings", commit: 965ffea4 from
    v2.6.22.
    
    Pawel's report:
    <blockquote>
    I dont see any big change of (cpu load or faster/slower
    routing/propagating routes from bgpd or something else) - in avg there
    is from 2% to 3% more of CPU load i dont know why but it is - i change
    from "preempt" to "no preempt" 3 times and check this my "mpstat -P ALL
    1 30"
    always avg cpu load was from 2 to 3% more compared to "no preempt"
    [...]
    cat /proc/net/fib_triestat
    Basic info: size of leaf: 20 bytes, size of tnode: 36 bytes.
    Main:
            Aver depth:     2.44
            Max depth:      6
            Leaves:         277814
            Prefixes:       291306
            Internal nodes: 66420
              1: 32737  2: 14850  3: 10332  4: 4871  5: 2313  6: 942  7: 371  8: 3  17: 1
            Pointers: 599098
    Null ptrs: 254865
    Total size: 18067  kB
    </blockquote>
    
    According to this and other similar reports average depth is slightly
    increased (~0.2), and root nodes are shorter (log 17 vs. 18), but
    there is no visible performance decrease. So, until memory handling is
    improved or added parameters for changing this individually, this
    patch resets to safer defaults.
    Reported-by: NPawel Staszewski <pstaszewski@itcare.pl>
    Reported-by: NJorge Boncompte [DTI2] <jorge@dti2.net>
    Signed-off-by: NJarek Poplawski <jarkao2@gmail.com>
    Tested-by: NPawel Staszewski <pstaszewski@itcare.pl>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    345aa031
fib_trie.c 61.8 KB