Linux:proc/net/sockstat tcp mem 越来越大



现在,我们的系统通过/proc/net/sockstat发现挂起和tcp mem越来越大。 当挂起出现时,将打印:

"TCP:孤立套接字太多">

sockstat,我们知道套接字很少,但消耗1500页内存,为什么?

所以我有两个问题:

  1. 如何知道哪个进程消耗 tcp 套接字内存?
  2. 如何避免"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 -tanpss -tp 等命令执行此操作。请记住,发送和接收缓冲区大小显示,例如 ss -m是最大值(受 tcp_rmem 和 'tcp_wmem 约束(,而不是当前分配的值。

对于#2,这篇文章解释说,"太多的孤儿套接字"是由孤儿数量增加超过/proc/sys/net/ipv4/tcp_max_orphans值引起的,尽管某些类型的"坏"套接字比其他套接字受到的惩罚更大,因此即使您比限制低2倍或4倍,您也可能遇到错误。

最新更新