在故障排除和调整过程中,我经常会考虑以下 Linux 内核设置:
net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn
除了fs.file-max
、net.ipv4.ip_local_port_range
、net.core.rmem_max
、net.core.wmem_max
、net.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