记录一下xcache导致的php-fpm 502问题

现象是,只要用PHP cli模式跑脚本,网站立马就502。

查看错误日志,看到的是“child 31457 exited on signal 7 (SIGBUS) after 0.384581 seconds from start”

打开ulimit,查看core dump,发现是xcache导致。

网上查了一下,有说xcache是不支持cli模式的,但是在官方wiki里似乎没有看到说明的样子?

ps 对应的php版本是5.4.45,安装的xcache 版本是 3.2.0,没有深入尝试,不知道其他版本有没有这个问题。

对照core dump查看源代码,过程如下:

1 在mod_cacher/xc_cacher.c 495行,执行这一句 if (!cache->cached->disabled && XG(request_time) >= cache->cached->last_gc_expires + (time_t) gc_interval) 时出错,抛出异常。

2 捕获到异常,调用xcache.c 中的 xcache_signal_handler 进行处理,发现设置了“崩溃则禁用”的选项,调用mod_cacher/xc_cacher.c中的xc_cacher_disable来处理进行禁用。

有如下代码段

if (xc_var_caches) {
for (i = 0; i < xc_var_hcache.size; i ++) {
if (xc_var_caches[i].cached) {
xc_var_caches[i].cached->disabled = now;
}
}
}

注意到循环时使用的是xc_var_hcache.size,而并不是xc_var_caches的实际大小,这样是有风险的,除非能确保两者一致。最终,错误发生在xc_var_caches[i].cached->disabled = now;这一句,具体的原因,现在还没有去找,等有时间调试打印一下,,再更新文章,可以的话提交个BUG给xcache。

果断换ZendOptimizerPlus,没有出现问题了。

时间: 2024-12-06 06:14:16

记录一下xcache导致的php-fpm 502问题的相关文章

真实记录linux病毒导致带宽跑满的解决过程

案例描述 早上接到IDC的电话,说我们的一个网段IP不停的向外发包,应该是被攻击了,具体哪个IP不知道,让我们检查一下. 按理分析及解决办法 首先我们要先确定是哪台机器的网卡在向外发包,还好我们这边有zabbix监控,我就一台一台的检查,发现有一台的流量跑满了,问题应该出现在这台机器上面. 我登录到机器里面,查看了一下网卡的流量,我的天啊,居然跑了这个多流量. 这台机器主要是运行了一个tomcat WEB服务和oracle数据库,问题不应该出现在WEB服务和数据库上面,我检查了一下WEB日志,没

存储过程不返回记录集导致ADO程序出错

HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF()       {return m_pRecordset->adoEOF == VARIANT_TRUE;}; m_pRecordset->adoEOF 将执行下面的函数(见msado15.tli) 1    inline VARIANT_BOOL Recordset15::GetadoEOF (

javascrpit开发连连看记录-小游戏

工作之余,总想做点什么有意思的东西.但是苦于不知道做什么,也就一直没有什么动作.在一个午饭后,跟@jedmeng和@墨尘聊天过程中,发现可以写一些小东西来练练手,有以下几点好处: 1. 加强巩固前端相关知识 2. 可以用一些平时项目中想用但没用的新东西 3. 一块儿做相同的东西,可以分享各自不同的想法 先来一张效果图,也可以来这里玩玩~      接下来就介绍一下做这个小游戏,自己的一些步骤和思路: 首先就是熟悉连连看的规则,为此还专门下载了一个app感受了一下,规则简单的说就是:找到两个相同的

SQLite DBRecovery 恢复引擎实现微信等一些手机聊天工具删除记录的快速恢复

概述: SQLite DBRecovery 提供了对开源嵌入式数据库SQLite的数据库损毁数据恢复功能,能够快速恢复SQLite 数据库意外操作.系统故障.文件损坏以及误删除记录等原因导致的数据记录的丢失.主要根据SQLite数据库对于删除的记录并没有真正的物理删除,只是打上了删除标记的逻辑删除.因此如果及时的恢复,可以把损失降到最低.基于 SQLite DBRecovery 恢复引擎,我们做了一个小工具可以实现苹果和安卓手机的微信.短信及QQ聊天记录的数据恢复.以便验证SQLite DBRe

记录一个多核CPU负载不均衡问题(动态绑定进程到指定cpu:taskset -pc $CPU $PID)

昨晚和一位读者朋友讨论了一个问题:在一台多核 CPU 的 Web 服务器上,存在负载不均衡问题,其中 CPU0 的负载明显高于其它 CPUx,进一步调查表明 PHP-FPM 的嫌疑很大.话说以前我曾经记录过软中断导致过类似的问题,但是本例中可以排除嫌疑.让我们在一台四核服务器上采样分析一下数据确认看看是否存在负载不均衡问题:shell> mpstat -P ALL 1 10 CPU    %usr   %nice    %sys %iowait    %irq   %soft ... %idle

正则表达式查找未记录的异常

在旧代码中,有一些地方只是写了catch{} ,但没有把异常信息记录下来,导致了分析查找问题的原因过久,但手动去查找哪儿没有捕获异常,所需要花费的时间又太长,以前有写过一次,但后来丢了,现在又要用到,先蹩脚地记录下来,给自己用的 情景一:catch (Exception ex){ }=>catch (Exception ex){TxtLog.WriteException(string.Format("任务处理错误,错误信息:{0}", ex.Message), ex);}查找内容

Linux下安装php加速组件XCache

这里选择的是稳定版本的1.2.2版本,2.0版本的不稳定.wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gztar -zxf xcache-1.2.2.tar.gzcd xcachephpize./configure --enable-xcachemakemake install记录下xcache的安装目录.编辑php.ini文件,加入Xcache,作为Zend扩展.[xcache-common];; in

mysql —日志记录

日志 事务日志: transaction log 中继日志: reley log错误日志: error log 通用日志: general log 慢查询日志: slow query log 二进制日志: binary log 事务日志 transaction log:事务型存储引擎自行管理和使用 在一个事务提交后还没有存到磁盘的情况下会记录到事务日志,这个时候如果系统断电,再次开机后会自动将已提交的事务重做(redo log)写入磁盘:如果事务还没有提交的情况下断电重启后会执行撤销操作(und

Salesforce 小知识:大量“子记录”的处理方法

大量"子记录"的存放 例子:系统中导入了很多"联系人"(Contact)记录,它们没有具体所属的"客户"(Account)记录.那么我们就要将它们作为"子记录"临时保存在一个Account记录下. 问题:当保存Contact和Account的关系时,系统会同时锁定这两条记录.那么如果要利用多线程同时保存大量的Contact记录到同一个Account记录下,很有可能会出错. 解决方案: 尽可能的在同一个Account记录下保存少