关于php:linux-进程跟踪-之phpfpm异常退出重启

4次阅读

共计 2010 个字符,预计需要花费 6 分钟才能阅读完成。

异样形容

公司一台测试服务器, 应用 json_decode() 办法,php-fpm 异样退出报错日志信息如下:

php-fpm child 7970 exited with code 1 after 34534.452342 seconds from start

NGINX 日志报错也只是说和 php-fpm 断开通信. 导致 502

自我解决思路

刚开始的也是毫无思路, 始终认为是 json 扩大的问题, 通过申请 phpinfo(), 和 cli 的 php -m 发现都有 json 的扩大, 机器的内存也是够用的, 发现这就奇了怪了, 到底是什么起因呢?
而后也是网上一顿搜.

  • 网上办法 1
 有说查看 /var/log/syslog 和 /var/log/message 日志. 可咱们这台机器,/var/log 下并没有这 2 个文件 (零碎是 CentOS), 也不晓得是不是哪里设置没有关上?
  • 网上办法 2
 批改 www.conf 里的参数
解释: 起因就是没有 pm.start_servers 这个参数没有依照上面的这个公式来:
pm.start_servers= min_spare_servers + (max_spare_servers - min_spare_servers) / 2
个别 min_spare_servers 设置为 20

操作之后也并不好使. 应用问题不在这.

解决问题

应用 strace 跟踪 php-fpm 过程并输入日志到文件.

ps -ef|grep php-fpm|awk '{print" -p "$2" -s 10000 -o /tmp/strace_"$2".log"}'|xargs strace
监控所有的子过程 pid, 并写入相应的 trace.log

查看日志发现是, 公司前共事用 c 封装的一个类型, 写入某个文件没有权限导致的. 发现问题就好解决了, 给该文件加上读写权限即可. 至此该 bug 已解决.

strace 罕用参数

-c 统计每一零碎调用的所执行的工夫, 次数和出错的次数等.
-d 输入 strace 对于规范谬误的调试信息.
-f 跟踪由 fork 调用所产生的子过程.
-ff 如果提供 -o filename, 则所有过程的跟踪后果输入到相应的 filename.pid 中,pid 是各过程的过程号.
-F 尝试跟踪 vfork 调用. 在 - f 时,vfork 不被跟踪.
-h 输入简要的帮忙信息.
-i 输入零碎调用的入口指针.
-q 禁止输入对于脱离的音讯.
-r 打印出绝对工夫对于,, 每一个零碎调用.
-t 在输入中的每一行前加上工夫信息.
-tt 在输入中的每一行前加上工夫信息, 微秒级.
-ttt 微秒级输入, 以秒了示意工夫.
-T 显示每一调用所耗的工夫.
-v 输入所有的零碎调用. 一些调用对于环境变量, 状态, 输入输出等调用因为应用频繁, 默认不输入.
-V 输入 strace 的版本信息.
-x 以十六进制模式输入非标准字符串
-xx 所有字符串以十六进制模式输入.
-a column 设置返回值的输入地位. 默认 为 40.
-e expr 指定一个表达式, 用来管制如何跟踪. 格局:[qualifier=][!]value1[,value2]...
qualifier 只能是 trace,abbrev,verbose,raw,signal,read,write 其中之一.value 是用来限定的符号或数字. 默认的 qualifier 是 trace. 感叹号是否定符号. 例如:-eopen 等价于 -e trace=open, 示意只跟踪 open 调用. 而 -etrace!=open 示意跟踪除了 open 以外的其余调用. 有两个非凡的符号 all 和 none. 留神有些 shell 应用! 来执行历史记录里的命令, 所以要应用 \\.
-e trace=set 只跟踪指定的零碎 调用. 例如:-e trace=open,close,rean,write 示意只跟踪这四个零碎调用. 默认的为 set=all.
-e trace=file 只跟踪无关文件操作的零碎调用.
-e trace=process 只跟踪无关过程管制的零碎调用.
-e trace=network 跟踪与网络无关的所有零碎调用.
-e strace=signal 跟踪所有与零碎信号无关的 零碎调用
-e trace=ipc 跟踪所有与过程通信无关的零碎调用
-e abbrev=set 设定 strace 输入的零碎调用的后果集.-v 等与 abbrev=none. 默认为 abbrev=all.
-e raw=set 将指定的零碎调用的参数以十六进制显示.
-e signal=set 指定跟踪的零碎信号. 默认为 all. 如 signal=!SIGIO(或者 signal=!io), 示意不跟踪 SIGIO 信号.
-e read=set 输入从指定文件中读出 的数据. 例如: -e read=3,5
-e write=set 输入写入到指定文件中的数据.
-o filename 将 strace 的输入写入文件 filename
-p pid 跟踪指定的过程 pid.
-s strsize 指定输入的字符串的最大长度. 默认为 32. 文件名始终全副输入.
-u username 以 username 的 UID 和 GID 执行被跟踪的命令 
正文完
 0