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

时间:2017-03-24 06:18:20

标签: linux sockets tcp

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

  

“tcp:太多的孤立套接字”

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

所以我有两个问题:

  1. 如何知道哪个进程占用tcp套接字内存?
  2. 如何避免“tcp:太多的孤立套接字”?
  3. (1)

    ~ # cat /proc/net/sockstat
    

    套接字:使用56

    TCP:inuse 6 orphan 0 tw 1 alloc 8 mem 1510

    UDP:inuse 8 mem 6

    UDPLITE:inuse 0

    RAW:使用4

    FRAG:使用0内存0

    (2)

    ~ # 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 个答案:

答案 0 :(得分:0)

对于#1,套接字的内存消耗是

的总和
  • 套接字描述符
  • 内核中发送队列(等待NIC发送的东西)
  • 内核接收队列(已收到的内容,但尚未被用户空间读取)。

this post与此相关)

对于/proc/net/sockstat的示例输出,套接字的数量很小,因此请检查其发送/接收队列的大小。您可以使用netstat -tanpss -tp等命令执行此操作。请记住,发送和接收缓冲区大小显示为例如ss -m是最大值(受tcp_rmem和`tcp_wmem约束),而不是当前分配的值。

对于#2,this post解释了"过多的孤儿套接字"是由于孤儿的数量增加超过/proc/sys/net/ipv4/tcp_max_orphans中的值,尽管某些类型的"坏"套接字比其他套接字更受惩罚,因此即使你比限制条件低2倍或4倍,你也可能会遇到错误。