php子进程频繁报 exited on signal 11 (SIGSEGV - core dumped) ?
最近站点接口频繁502
排查
查看php日志发现很多warning,(child 24801 exited on signal 11 (SIGSEGV - core dumped))
[06-Jan-2021 15:41:19] WARNING: [pool www] child 24801 exited on signal 11 (SIGSEGV - core dumped) after 19140.416792 seconds from start
就这些东东搞的,查资料说这个和内存有关,有很多,
如图
排查1
想定位问题,但是并没有生成core文件,于是ssh执行 ulimit -c
发现是0,得 没开呗,没关系,打开,执行 ulimit -c unlimited
,然后 重启了 php-fpm,等待记录,当那个signal 11
再次出现的时候,core文件还是没有生成。
排查2
上面那个命令仅对当前终端有效,暴力点,来个永久的设置,于是,执行 vim /etc/profile
在尾部加上了 ulimit -c 1073741824
,继续执行 source /etc/profile
这次貌似设置有效,我关闭了终端,重连,执行 ulimit -a
,结果是好的,
core file size (blocks, -c) 1073741824
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31760
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31760
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
重启 php-fpm, 等待 signal 11 然而又打脸, core还是没有生成,
问题 怎么让php-fpm 生成 core文件
我现在的一些配置及日志
/proc/sys/kernel/core_pattern
内容
|/usr/share/apport/apport %p %s %c %d %P %E
/usr/share/apport/apport
内容太长了 我放在这里
貌似只有 /var/log/apport.log
里有点内容,如下
ERROR: apport (pid 12454) Wed Jan 6 10:02:55 2021: called for pid 25484, signal 11, core limit 0, dump mode 2
ERROR: apport (pid 12454) Wed Jan 6 10:02:55 2021: not creating core for pid with dump mode of 2
ERROR: apport (pid 12454) Wed Jan 6 10:02:55 2021: executable: /www/server/php/72/sbin/php-fpm (command line "php-fpm:\ pool\ www")
ERROR: apport (pid 12454) Wed Jan 6 10:02:55 2021: executable does not belong to a package, ignoring
ERROR: apport (pid 13003) Wed Jan 6 10:03:08 2021: called for pid 25489, signal 11, core limit 0, dump mode 2
ERROR: apport (pid 13003) Wed Jan 6 10:03:08 2021: not creating core for pid with dump mode of 2
ERROR: apport (pid 13003) Wed Jan 6 10:03:08 2021: executable: /www/server/php/72/sbin/php-fpm (command line "php-fpm:\ pool\ www")
ERROR: apport (pid 13003) Wed Jan 6 10:03:08 2021: executable does not belong to a package, ignoring
ERROR: apport (pid 13007) Wed Jan 6 10:03:24 2021: called for pid 25498, signal 11, core limit 0, dump mode 2
ERROR: apport (pid 13007) Wed Jan 6 10:03:24 2021: not creating core for pid with dump mode of 2
ERROR: apport (pid 13007) Wed Jan 6 10:03:24 2021: executable: /www/server/php/72/sbin/php-fpm (command line "php-fpm:\ pool\ www")
ERROR: apport (pid 13007) Wed Jan 6 10:03:24 2021: executable does not belong to a package, ignoring
看上面的日志内容 貌似core limit并没有设置成功,线上机器,不允许重启,没办法了,没有生成 core 文件。
环境 ubuntu16.04,laravel5.8,php7.2,使用的宝塔面板7.2
求助
现在可以肯定的是 php-fpm子进程被干掉导致的502,急需定位502的具体原因,有碰到的朋友么,给点建议,非常感谢!
老哥 你这个问题当初怎么解决的,我也遇到了
@wanzi 很多情况会导致这个内存问题,首先需要排除负载压力问题内存爆满, 如果你能拿到coredump文件最好,用gdb分析一下。我到现在也没拿到coredump。
换了另一种方式,调整php-fpm子进程数量为1个,
pm.max_children
, 设置为1是为了让所有请求都用这个处理方便追踪进程,使用命令strace -p -tt 你的这个php-fpm进程id
追踪,例(strace -p -tt 32145
),如果线上正式环境 不方便动php-fpm的配置的话,只能同时追踪多个php-fpm 我开了多个ssh窗口,一个窗口一个,然后发网页请求或者接口请求,重现问题, 重现后 strace命令会退出,通过页面的输出大致就能分析了, 我们那个是redis链接的问题, 上个图让你看下以下来自某位大佬的分析
1、6文件描述符为redis socket 文件,数据发送成功
2、但接受redis socket的时候,对端关闭
SEGV它是一个中断信号,跟进程的内存有关, 此中断信号会让当前进程终止
我这边用了redis 长链接, 设置配置里的
persistent=true
, 改成短链接后 没有这个问题了,具体原因还不清楚,以后有空了再整他,供你参考,给你个快速定位的思路,你注意看php-fpm日志,看看是从什么时候开始出现的,如果是修改代码后,先从代码入手,当然最直观的还是分析报错,导致SEGV的原因很多,祝好运!