linux socket关闭并释放资源,【linux】centos 上 php-fpm 占用太多状态为 CLOSED 的 socket 且不释放, 如何解决?...

[[email protected] ~]$ ss -s

Total: 83678 (kernel 0)

TCP: 84982 (estab 127, closed 84812, orphaned 0, synrecv 0, timewait 1485/0), ports 0

Transport Total IP IPv6

* 0 - -

RAW 0 0 0

UDP 4 3 1

TCP 170 168 2

INET 174 171 3

FRAG 0 0 0

这里可以看到 CLOSED 状态的socket 有8w+ (closed 84812), 同时查看某个 fpm :

[[email protected] ~]$ ss -s $ lsof -p ${fpm-pid}|grep 'protocol: TCP'|wc -l

1043

fpm 进程一共有 8 0个, 所以几乎可以肯定全是 fpm 导致的上述占用过多 CLOSED socket, 主要是我不理解为啥 fpm

不释放这些 socket, CLOSED 状态下的 socket 不是应该转瞬就被系统回收了吗?

这些状态为 CLOSED 的 socket 仍然占用较多内存, 当超过 tcp 上限(cat /proc/sys/net/ipv4/tcp_mem)的时候会报错 : out of memory — consider tuning tcp_mem

请问我需要怎么进一步解决呢?

P.S. 2019年2月26日17:53:34 进一步的信息补充 :

$ ls -l /proc/${pfm}/fd|wc -l

1059

检查 sockstat :

cat /proc/net/sockstat

sockets: used 84442

TCP: inuse 168 orphan 0 tw 3052 alloc 84262 mem 84093

UDP: inuse 3 mem 1

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n

1 established)

1 Foreign

8 LISTEN

28 CLOSE_WAIT

138 ESTABLISHED

782 TIME_WAIT

fpm 的配置 :

pm.max_children = 80

pm.max_requests = 100000

某次重启前

$ cat /proc/net/sockstat

sockets: used 29901

TCP: inuse 168 orphan 0 tw 3618 alloc 29720 mem 29563

UDP: inuse 3 mem 1

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

$ free -m

total used free shared buff/cache available

Mem: 7821 824 250 418 6746 6064

Swap: 511 98 413

重启后

$ cat /proc/net/sockstat

sockets: used 387

TCP: inuse 167 orphan 0 tw 3504 alloc 207 mem 42

UDP: inuse 3 mem 1

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

$ lsof -p ${fpm-pid}|less

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

php-fpm 17699 temp 71u sock 0,7 0t0 552415632 protocol: TCP

php-fpm 17699 temp 72u sock 0,7 0t0 552428529 protocol: TCP

php-fpm 17699 temp 73u sock 0,7 0t0 552450479 protocol: TCP

php-fpm 17699 temp 74u sock 0,7 0t0 552462900 protocol: TCP

php-fpm 17699 temp 75u sock 0,7 0t0 552523600 protocol: TCP

php-fpm 17699 temp 76u sock 0,7 0t0 552542925 protocol: TCP

php-fpm 17699 temp 77u sock 0,7 0t0 552613133 protocol: TCP

php-fpm 17699 temp 78u sock 0,7 0t0 552639299 protocol: TCP

php-fpm 17699 temp 79u sock 0,7 0t0 552646395 protocol: TCP

php-fpm 17699 temp 80u sock 0,7 0t0 552659030 protocol: TCP

发现大量的 “protocol: TCP” 字样, 请教大家这是什么意思?为何不展示出 tcp 连接的双端ip, 端口信息而是省略成了”TCP”字样?

回答

closed状态应该是关闭了,从你的说法估计是说socket已经关闭,但是协议栈被没有释放资源?

你用ls -l /proc/fpm进程ID/fd|wc -l 看看

能否提供更多信息, 例如

fpm 进程的最大文件数. cat /proc/$(pidof fpm)/limits

CLOSED 状态 socket 的客户端和服务器地址信息. lsof -n -p $(pidof fpm)

php 应用是否含有 sockets 类操作, 如有, 贴出相关服务的地址.

在不重启 fpm 进程情况下, CLOSED 状态的连接是否一直存在, 是否由 TIMEWAIT 进入该状态.

重启 fpm 的初始阶段, 是否 TIMEWAIT 数量大于 CLOSED 数量.

内核参数. sysctl -a | grep tcp

感觉需要优化 TCP .

根据题主提供的最新信息

cat /proc/net/sockstat

sockets: used 84442

TCP: inuse 168 orphan 0 tw 3052 alloc 84262 mem 84093

UDP: inuse 3 mem 1

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n

1 established)

1 Foreign

8 LISTEN

28 CLOSE_WAIT

138 ESTABLISHED

782 TIME_WAIT

我很肯定这是 tcp 优化问题, 这种情况通常出现在高负载的服务器, 即 tcp 创建速度(用户态)远高于销毁速度(内核).

你需要酌情调整如下内核参数

net.ipv4.ip_local_port_range

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_tw_reuse

会不会是php-fpm配置了静态模式?在配置pm = static的情况下php-fpm不会释放进程的。

你这个php-fpm 存在多个进程共享同一个socket的情况么?

closed没关闭,我能想到的就是内核sock->refcnt不为0,所以不会释放

cat /proc/net/tcp | awk ‘{print $11}’ 可以看下tcp socket的引用计数

你好,这个问题定位了吗?我这也出现相同的问题,目前也没有分析的思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值