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的具体原因,有碰到的朋友么,给点建议,非常感谢!

当你的才华撑不起你的野心的时候,你就必须静下心来学习
xin6841414
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

老哥 你这个问题当初怎么解决的,我也遇到了

3年前 评论
xin6841414

@wanzi 很多情况会导致这个内存问题,首先需要排除负载压力问题内存爆满, 如果你能拿到coredump文件最好,用gdb分析一下。我到现在也没拿到coredump。 :joy:

换了另一种方式,调整php-fpm子进程数量为1个,pm.max_children, 设置为1是为了让所有请求都用这个处理方便追踪进程,使用命令 strace -p -tt 你的这个php-fpm进程id 追踪,例(strace -p -tt 32145),如果线上正式环境 不方便动php-fpm的配置的话,只能同时追踪多个php-fpm 我开了多个ssh窗口,一个窗口一个,然后发网页请求或者接口请求,重现问题, 重现后 strace命令会退出,通过页面的输出大致就能分析了, 我们那个是redis链接的问题, 上个图让你看下

Laravel

以下来自某位大佬的分析

1、6文件描述符为redis socket 文件,数据发送成功

2、但接受redis socket的时候,对端关闭
SEGV它是一个中断信号,跟进程的内存有关, 此中断信号会让当前进程终止

我这边用了redis 长链接, 设置配置里的 persistent=true , 改成短链接后 没有这个问题了,具体原因还不清楚,以后有空了再整他,供你参考,给你个快速定位的思路,你注意看php-fpm日志,看看是从什么时候开始出现的,如果是修改代码后,先从代码入手,当然最直观的还是分析报错,导致SEGV的原因很多,祝好运!

3年前 评论
wanzi 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!