今天压测一个thinkphp开发站点,10000次访问大概620多次左右502,压了很多次都有这个问题
nginx那边报Connection reset by peer,php-fpm里
child exited on signal 7 (SIGBUS)
基本上就是php-fpm进程崩溃,nginx 那边fastcgi_pass中断....
那么,如何定位php进程崩溃原因呢,首当其冲当然是gdb core文件了
首先,要打开core。
php-fpm是由root启动的,所以先要打开root的core
/etc/security/limits.conf 里加root
@root soft core unlimited
最好php-fpm的实际运行账户也加上,比如nginx
@nginx soft core unlimited
@nginx hard core unlimited
最好用
unlimited,我尝试过好几个数值,发现都不够大,php的dump文件特别大
改动好以后重新登录,改php-fpm的配置文件,对应的pool里
rlimit_core = unlimited
root启动的php-fpm的limit由系统配置文件决定,也就是说php-fpm的master进程的limit参数是系统配置文件定的
fork出来的php-fpm进程limit继承了master的进程的limit上限。
master进程会更具每个pool配置文件里的rlimit_core来设置fork出来的php-fpm进程的core大小
设置好以后,重启php-fpm,通过cat /proc/pid/limits(pid为任意pool的进程pid,不要检查master进程的pid)来确认limit设置
然后,设置core生成位置
接触过c++程序的都知道,core都是直接生成在执行启动的二进制文件旁边,那么php-fpm的core生成在哪里呢
前面limit配置对了以后,还是不能生成core文件的,因为php-fpm运行的目录应该是/或者/usr/sbin,这两目录都是root才能写的
我们产生core的进程一般都是非root比如nginx的,所以正常设置了core也产生不了core文件,所以还先要修改core文件生成的位置
通过
echo '/tmp/core-%e.%p' > /proc/sys/kernel/core_pattern
把core文件都生成在/tmp里,这样就能正常生成core文件了
core生成完记得还原设置
echo "|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e" > /proc/sys/kernel/core_pattern
/etc/security/limits.conf里的core内容也注释掉
压测,生成1~2个core文件以后立刻关掉压测,不然core要写爆硬盘。
gdb分析下core文件......额需要php-debuginfo,安装好以后大致能看到和网上的一样挂在lex_scan函数
那么更具那个哥们的办法
我们用strace -p pid 来跟踪pool的任意一个pid(因为随机抽个进程,所以最好把pool的进程数稍微改少点容易捕捉到)
然后再继续压测
这时候,strace会跟踪到进程崩溃,然后我们可以看见,崩溃的时候的文件在runtime/cache下的随机php文件.....
问php开发这个文件是搞什么的,因为php分析这个文件的时候,这个文件被改动了。
开发一想.........擦没有关调试模式,thinkphp在调试模式开启的时候,会反复刷新缓存文件.......
关闭调试模式继续压测,ok,不再出现问题..........................草,为了解决这个问题又蛋痛了2小时
参考http://blog.druggo.org/post/2013/05/02/%E4%B8%80%E4%BE%8Bphp%E8%BF%9B%E7%A8%8B%E7%9A%84SIGBUS%E6%95%85%E9%9A%9C
顺便,centos6.2以后,可以动态修改进程的soft limit
http://blog.163.com/yanenshun@126/blog/static/128388169201331991452328/
例如
echo -n 'Max processes=1024:1024' > limits
阅读(6848) | 评论(0) | 转发(0) |