• Eric Dumazet's avatar
    tcp: avoid wakeups for pure ACK · 79ffef1f
    Eric Dumazet authored
    TCP prequeue mechanism purpose is to let incoming packets
    being processed by the thread currently blocked in tcp_recvmsg(),
    instead of behalf of the softirq handler, to better adapt flow
    control on receiver host capacity to schedule the consumer.
    
    But in typical request/answer workloads, we send request, then
    block to receive the answer. And before the actual answer, TCP
    stack receives the ACK packets acknowledging the request.
    
    Processing pure ACK on behalf of the thread blocked in tcp_recvmsg()
    is a waste of resources, as thread has to immediately sleep again
    because it got no payload.
    
    This patch avoids the extra context switches and scheduler overhead.
    
    Before patch :
    
    a:~# echo 0 >/proc/sys/net/ipv4/tcp_low_latency
    a:~# perf stat ./super_netperf 300 -t TCP_RR -l 10 -H 7.7.7.84 -- -r 8k,8k
    231676
    
     Performance counter stats for './super_netperf 300 -t TCP_RR -l 10 -H 7.7.7.84 -- -r 8k,8k':
    
         116251.501765 task-clock                #   11.369 CPUs utilized
             5,025,463 context-switches          #    0.043 M/sec
             1,074,511 CPU-migrations            #    0.009 M/sec
               216,923 page-faults               #    0.002 M/sec
       311,636,972,396 cycles                    #    2.681 GHz
       260,507,138,069 stalled-cycles-frontend   #   83.59% frontend cycles idle
       155,590,092,840 stalled-cycles-backend    #   49.93% backend  cycles idle
       100,101,255,411 instructions              #    0.32  insns per cycle
                                                 #    2.60  stalled cycles per insn
        16,535,930,999 branches                  #  142.243 M/sec
           646,483,591 branch-misses             #    3.91% of all branches
    
          10.225482774 seconds time elapsed
    
    After patch :
    
    a:~# echo 0 >/proc/sys/net/ipv4/tcp_low_latency
    a:~# perf stat ./super_netperf 300 -t TCP_RR -l 10 -H 7.7.7.84 -- -r 8k,8k
    233297
    
     Performance counter stats for './super_netperf 300 -t TCP_RR -l 10 -H 7.7.7.84 -- -r 8k,8k':
    
          91084.870855 task-clock                #    8.887 CPUs utilized
             2,485,916 context-switches          #    0.027 M/sec
               815,520 CPU-migrations            #    0.009 M/sec
               216,932 page-faults               #    0.002 M/sec
       245,195,022,629 cycles                    #    2.692 GHz
       202,635,777,041 stalled-cycles-frontend   #   82.64% frontend cycles idle
       124,280,372,407 stalled-cycles-backend    #   50.69% backend  cycles idle
        83,457,289,618 instructions              #    0.34  insns per cycle
                                                 #    2.43  stalled cycles per insn
        13,431,472,361 branches                  #  147.461 M/sec
           504,470,665 branch-misses             #    3.76% of all branches
    
          10.249594448 seconds time elapsed
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Cc: Tom Herbert <therbert@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    79ffef1f
tcp.h 52.4 KB