如何检查 rx 环、max_backlog 和 max_syn_backlog 大小

如何检查 rx 环、max_backlog 和 max_syn_backlog 大小

在故障排除和调整过程中,我经常会考虑以下 Linux 内核设置:

net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn

除了fs.file-maxnet.ipv4.ip_local_port_rangenet.core.rmem_maxnet.core.wmem_maxnet.ipv4.tcp_rmem和 之外net.ipv4.tcp_wmem,当您调整盒子以实现高并发性时,它们似乎是需要调整的重要旋钮。

我的问题:如何检查每个队列中有多少项目?通常人们只是将它们设置得非常高,但我想记录这些队列大小,以帮助预测未来的故障并在问题以用户明显的方式显现之前捕获它们。

答案1

我也想知道这个问题,并被你的问题所激励!

我收集了我可以接近您列出的每个队列的信息,以及与每个队列相关的一些信息。我欢迎评论/反馈,任何对监控的改进都会使事情更容易管理!

网络核心.somaxconn

net.ipv4.tcp_max_syn_backlog

net.core.netdev_max_backlog

$ netstat -an | grep -c SYN_RECV 

将显示队列中当前的全局连接计数,如果您想从监控应用程序轮询它,您可以将其分解为每个端口并将其放入 snmpd.conf 的 exec 语句中。

从:

netstat -s

这些将显示您看到来自队列的请求的频率:

146533724 packets directly received from backlog
TCPBacklogDrop: 1029
3805 packets collapsed in receive queue due to low socket buffer

fs.文件最大

从:

http://linux.die.net/man/5/proc

$ cat /proc/sys/fs/file-nr
2720    0       197774

该(只读)文件给出当前打开的文件数。它包含三个数字:已分配的文件句柄数、空闲文件句柄数和最大文件句柄数。

net.ipv4.ip_local_port_range

如果您可以构建服务的排除列表(netstat -an | grep LISTEN),那么您可以推断有多少连接用于临时活动:

netstat -an | egrep -v "MYIP.(PORTS|IN|LISTEN)"  | wc -l

还应该监控(从 SNMP):

TCP-MIB::tcpCurrEstab.0

收集有关此树中看到的所有状态的统计信息(builted/time_wait/fin_wait/etc)也可能很有趣:

TCP-MIB::tcpConnState.*

网络核心.rmem_max

网络核心.wmem_max

您必须对系统进行 dtrace/strace 以获取 setsockopt 请求。我认为不会以其他方式跟踪这些请求的统计数据。根据我的理解,这并不是一个真正会改变的值。您部署的应用程序可能会要求标准金额。我认为您可以使用 strace 来“分析”您的应用程序并相应地配置该值。 (讨论?)

net.ipv4.tcp_rmem

net.ipv4.tcp_wmem

要跟踪您与限制的接近程度,您必须(定期)查看 tx_queue 和 rx_queue 字段的平均值和最大值:

# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0FB1 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262030037 1 ffff810759630d80 3000 0 0 2 -1                
   1: 00000000:A133 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262029925 1 ffff81076d1958c0 3000 0 0 2 -1                

要跟踪与此相关的错误:

# netstat -s
    40 packets pruned from receive queue because of socket buffer overrun

还应该监视全局“缓冲”池(通过 SNMP):

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 74172456
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 51629704

答案2

我认为您也许可以使用 SystemTap 获取该数据。这里是红帽参考手册(pdf)。还有一个初学者指南(pdf)

该工具看起来足够通用,可以让您获取该数据,特别是probe::netdev.rx看起来可以为您提供有关传入条目的信息,现在您“仅”需要找到缓冲区中队列的净大小,或者可以对事物进行计数的东西离开队列…

相关内容