针对缓冲区溢出和数据包崩溃的内核 TCP 调优

针对缓冲区溢出和数据包崩溃的内核 TCP 调优

我们有一个 Nginx+Ruby 应用程序,其中 Nginx 和应用程序之间的数据通过套接字进行交互。

作为性能改进的一部分,当我们分析netstat应用程序端的统计数据时,我们发现了以下内容:

    5334 packets pruned from receive queue because of socket buffer overrun
    2299951 packets collapsed in receive queue due to low socket buffer
    227365 delayed acks sent

假设rmem缓冲容量是问题所在,我们发现:

$ sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096    87380   6291456

然而,看看cat /proc/net/protocols

protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re sp bi br ha uh gp em
PINGv6    1120      0      -1   NI       0   yes  ipv6        y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAWv6     1120      0      -1   NI       0   yes  ipv6        y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
UDPLITEv6 1280      0       3   NI       0   yes  ipv6        y  y  y  n  y  y  y  n  y  y  y  y  n  n  n  y  y  y  n
UDPv6     1280      0       3   NI       0   yes  ipv6        y  y  y  n  y  y  y  n  y  y  y  y  n  n  n  y  y  y  n
TCPv6     2152      4      52   no     256   yes  ipv6        y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
PACKET    1408      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
UNIX      1024     24      -1   NI       0   yes  kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
UDP-Lite  1088      0       3   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  n  n  y  y  y  n
PING       912      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAW        920      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
UDP       1088      4       3   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  n  n  y  y  y  n
TCP       1992    209      52   no     256   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
NETLINK   1048      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n

我们看到没有memory pressure

我们希望得到以下一些建议:

  1. 我们如何才能知道缓冲区是否真的溢出了?我们能否知道在某个时间段内分配的缓冲区大小是多少?或者最大缓冲区大小是多少?如果实际最大缓冲区大小为 6 MiB,那么我们可以假设缓冲区已溢出。
  2. 如果缓冲区溢出,为什么memory pressure不设置标志?该memory pressure标志是否意味着系统无法分配minimum缓冲区大小?
  3. buffer overruns总是packet collapses意味着套接字缓冲区大小不够吗?

谢谢。

相关内容