现在,我们的系统通过/proc/net/sockstat
发现挂起和tcp mem越来越大。 当挂起出现时,将打印:
"TCP:孤立套接字太多">
从sockstat
,我们知道套接字很少,但消耗1500页内存,为什么?
所以我有两个问题:
- 如何知道哪个进程消耗 tcp 套接字内存?
- 如何避免"tcp:孤立套接字太多"?
(1(
~ # cat /proc/net/sockstat
sockets: used 56
TCP: inuse 6 orphan 0 tw 1 alloc 8 mem 1510
UDP: inuse 8 mem 6
UDPLITE: inuse 0
RAW: inuse 4
FRAG: inuse 0 memory 0
(二(
~ # cat /proc/sys/net/ipv4/tcp_mem
900 1200 1800
~ # cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 87380
~ # cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 65536
对于 #1,套接字的内存消耗是
- 套接字描述符
- 内核内发送队列(等待 NIC 发送的内容(
- 内核内接收队列(已接收但尚未被用户空间读取的内容(。
(这篇文章在这里是相关的(
对于 /proc/net/sockstat
的示例输出,套接字的数量很少,因此请检查其发送/接收队列的大小。 您可以使用 netstat -tanp
或 ss -tp
等命令执行此操作。请记住,发送和接收缓冲区大小显示,例如 ss -m
是最大值(受 tcp_rmem
和 'tcp_wmem 约束(,而不是当前分配的值。
对于#2,这篇文章解释说,"太多的孤儿套接字"是由孤儿数量增加超过/proc/sys/net/ipv4/tcp_max_orphans
值引起的,尽管某些类型的"坏"套接字比其他套接字受到的惩罚更大,因此即使您比限制低2倍或4倍,您也可能遇到错误。