PHP数据文件过大,导致PHP加速器eaccelerator在PHP5.2版本下崩溃

PHP数据文件,可以作为一个数据存储方案。但是,这种方案仅仅适合数据量小的情况,数据量大的情况下容易出现性能的下降。这次,发现了一个隐藏的比较深的BUG。一般来说,PHP文件数据量太大,会造成超出内存限制而发生错误,服务器会返回500错误。但是,这次服务器返回的是502错误,PHP错误并无日志。初步定位后,发现这个问题跟PHP数据文件有关,只要include该数据文件,即报502错误。

502错误(Bad Gateway)网关错误,可以猜出php-cgi进程已经挂掉了,检查php-fpm日志

1)检查php-fpm日志

Nov 18 11:49:12.553181 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD 
Nov 18 11:49:12.554976 [WARNING] fpm_children_bury(), line 215: child 13585 (pool default) exited on signal 11 SIGSEGV (core dumped) after 588684.743947 seconds from start 
Nov 18 11:49:12.559363 [NOTICE] fpm_children_make(), line 352: child 9021 (pool default) started

果然,php-cgi进程发生了异常,宕掉了。

2)检查系统错误日志
tail -f /var/log/messages 
Nov 18 12:02:55 localhost abrtd: Directory 'ccpp-2015-11-18-12:02:54-13391' creation detected 
Nov 18 12:02:55 localhost abrt[26465]: Saved core dump of pid 13391 (/usr/local/webserver/php/bin/php-cgi) to /var/spool/abrt/ccpp-2015-11-18-12:02:54-13391 (137519104 bytes) 
Nov 18 12:02:55 localhost abrtd: Package 'custom-php' isn't signed with proper key 
Nov 18 12:02:55 localhost abrtd: 'post-create' on '/var/spool/abrt/ccpp-2015-11-18-12:02:54-13391' exited with 1 
Nov 18 12:02:55 localhost abrtd: Corrupted or bad directory /var/spool/abrt/ccpp-2015-11-18-12:02:54-13391, deleting
发现php-cgi是产生了系统错误而导致终止,而不是正常终止

3)对php-cgi进程进行gdb调试
Program terminated with signal 11, Segmentation fault. 
#0 0x00007f370e35f443 in optimize_bb (bb=0x7fffc4e16ce0, op_array=0x19988f8, 
global=0x7fffc4e14c80 "", pass=0) at /home/tmp/ex/eaccelerator/optimize.c:1664 
初步定位是由于
eaccelerator引发的问题

4)检查 eaccelerator源代码

1664行对Ts指针内存区域进行初始化,却引发了 Segmentation fault错误,猜测Ts为野指针
检查do_alloca函数
先查看PHP5.2版本的

由于alloca是在栈上申请内存,是有大小限制的,在PHP5.4下加载配置文件,通过 memory_get_peak_usage输出峰值内存为 64842976
通过简单程序去验证:

编译执行:
[root@dev_121_201_30_137_zs lizhibin]# ./stack.debug 64842976 
Segmentation fault
同样也会stack overflow
(PS:后来验证,栈内存临界值在11M左右)
再看看PHP5.4版本的

注意红框的地方,当申请内存超过32*1024b的时候,使用emalloc在堆上申请内存,可以支持更大的内存空间申请

验证程序: [root@dev_121_201_30_137_zs lizhibin]# ./heap 64842976 
[root@dev_121_201_30_137_zs lizhibin]#
内存申请成功

总结:

1)尽可能避免使用PHP文件来存储大数据

2)适当升级PHP版本,新版本原则上更多bug被发现,性能也更好


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值