• Tom Herbert's avatar
    tcp: Fix slowness in read /proc/net/tcp · a8b690f9
    Tom Herbert authored
    This patch address a serious performance issue in reading the
    TCP sockets table (/proc/net/tcp).
    
    Reading the full table is done by a number of sequential read
    operations.  At each read operation, a seek is done to find the
    last socket that was previously read.  This seek operation requires
    that the sockets in the table need to be counted up to the current
    file position, and to count each of these requires taking a lock for
    each non-empty bucket.  The whole algorithm is O(n^2).
    
    The fix is to cache the last bucket value, offset within the bucket,
    and the file position returned by the last read operation.   On the
    next sequential read, the bucket and offset are used to find the
    last read socket immediately without needing ot scan the previous
    buckets  the table.  This algorithm t read the whole table is O(n).
    
    The improvement offered by this patch is easily show by performing
    cat'ing /proc/net/tcp on a machine with a lot of connections.  With
    about 182K connections in the table, I see the following:
    
    - Without patch
    time cat /proc/net/tcp > /dev/null
    
    real	1m56.729s
    user	0m0.214s
    sys	1m56.344s
    
    - With patch
    time cat /proc/net/tcp > /dev/null
    
    real	0m0.894s
    user	0m0.290s
    sys	0m0.594s
    Signed-off-by: default avatarTom Herbert <therbert@google.com>
    Acked-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a8b690f9
tcp_ipv4.c 66.6 KB