我们有一个 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
。
我们希望得到以下一些建议:
- 我们如何才能知道缓冲区是否真的溢出了?我们能否知道在某个时间段内分配的缓冲区大小是多少?或者最大缓冲区大小是多少?如果实际最大缓冲区大小为 6 MiB,那么我们可以假设缓冲区已溢出。
- 如果缓冲区溢出,为什么
memory pressure
不设置标志?该memory pressure
标志是否意味着系统无法分配minimum
缓冲区大小? - 和
buffer overruns
总是packet collapses
意味着套接字缓冲区大小不够吗?
谢谢。