账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    centos 上 php-fpm 占用太多状态为 CLOSED 的 socket 且不释放, 如何解决?
    43
    0
    [temp@xigua ~]$ 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 :

    [temp@xigua ~]$ 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"字样?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 深情迎风散 普通会员 1楼

      在 CentOS 上,php-fpm 占用过多状态为 CLOSED 的 socket 且不释放,可能是因为 PHP-FPM 没有正确关闭连接。以下是一些解决方法:

      1. 更新 php-fpm 配置文件:

      首先,确保你已经正确地安装了 php-fpm,并且配置文件正确无误。打开你的 php-fpm 配置文件,例如 /etc/php/7.4/fpm/php.ini/etc/php/7.4/fpm/php-fpm.conf,并确保 listen 选项指向正确的主机和端口。

      例如:

      ini listen = 127.0.0.1:9000

      或者:

      ini listen = 0.0.0.0:9000

      另外,确保你已经启用了 error_loglog_output 选项。

      1. 删除不再使用的进程:

      如果你在运行 PHP-FPM 时,发现某个进程占用了大量的资源,你可以尝试使用 kill 命令来强制结束该进程。但是,请注意,强制结束进程可能会导致你的系统数据丢失。因此,你应该在进行操作之前备份你的系统数据。

      1. 使用 pkill 命令:

      你可以在 PHP-FPM 的配置文件中添加 kill 命令,来强制结束进程。但是,这可能会导致你的系统数据丢失。因此,你应该在进行操作之前备份你的系统数据。

      1. 关闭进程:

      如果你已经尝试了上述方法,但仍然发现 PHP-FPM 占用过多状态为 CLOSED 的 socket 且不释放,你可以尝试关闭进程。你可以使用 kill 命令,或者使用 pkill 命令来关闭进程。但是,请注意,这可能会导致你的系统数据丢失。因此,你应该在进行操作之前备份你的系统数据。

      1. 使用更现代的 PHP-FPM 配置:

      如果上述方法都不能解决问题,你可能需要考虑使用更现代的 PHP-FPM 配置。例如,你可以尝试使用 ini_set 命令来修改 listen 选项,或者使用 fpm_set_rate 命令来设置 CPU 使用率。

      请确保你已经正确地安装了 php-fpm,并且配置文件正确无误。在执行任何操作之前,请备份你的系统数据。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部