学习
实践
活动
专区
工具
TVP
写文章
专栏首页CSIG质量部压测团队【项目实战-11】进程莫名被杀,真相是...
原创

【项目实战-11】进程莫名被杀,真相是...

【摘要】

Yaf框架是一个c语言编写的PHP框架,它更快、更轻、内存占用更低。项目组本着对性能的追求选择了Yaf框架,由于安全的原因PHP升级到7.3.18,为了兼容PHP,将Yaf升级到3.2.3。Yaf框架的bug导致PHP进程core。尽管从表象上看就是一个core,但整个排查解决的过程还是遇到了不少困难,这里记录了这一次线上core的整个排查过程,希望能够帮助遇到类似问题的同学。

【背景】

因为php 7.0.9有安全漏洞,升级到php 7.3.18,PHP的Yaf框架3.2.3版本导致接口服务出现502。

现象:达到2000 qps时有15台机器出现502的问题,重启PHP后问题不重现。

问题影响: 15%的请求会出502

【问题现象】

通过strace attach到进程看到发生了segfault,进程被系统信号SIGSEGV强杀。

【问题分析与排查思路】

进程被SIGSEGV强杀,第一反应是去找coredump,cordump是进程在退出前由操作系统把进程当前的内存转存到一个core文件中。core文件包含程序运行时的内存信息,含寄存器状态、堆栈指针、内存管理信息、操作系统flags。core文件中保留了进程被杀的“凶案”现场,找到core文件几乎就等于抓住了“凶手”。经过一顿搜索并未发现生成core。

core文件未生成的原因:

  1. 系统不允许生成core。
  2. core文件存储路径没有权限。
  3. 进程捕获了SIGSEGV信号。
  4. ...

系统不允许生成core

ulimit -a 显示core file size为unlimited,系统允许生成core文件。排除

core文件存储路径没有权限

查看core文件目标存储路径,确认进程有权限写入。排除

进程捕获了SIGSEGV信号

查看/proc/pid/status发现sigCgt为0x0000000184004a07,SIGSEGV并未被进程捕获。排除

linux支持对每个进程进行dumpable标记,dumpable被设置为SUID_DUMP_DISABLE(0) 的进程不会输出core。PHP 7之后进程默认不会输出core。

修改进程dumpable标记位:

尝试用GDB的方式来设置CORE的标记位,让PHP在异常的情况下能打DUMP gdb -p pid 执行call prctl(4,1)。第一个参数4表示PR_SET_DUMPABLE,第二个参数1表示SUID_DUMP_USER,经验证可以输出coredump

找到了core文件就等于抓住了“凶手”,从堆栈中分析可以看到挂在Yaf。

问题根因

Yaf 3.2.3版本,请求uri中出现两个相同参数,进程会被SIGSEGV信号杀掉。

github issues:

https://github.com/laruence/yaf/issues/490 (请求web服务时, uri参数两个参数名相同出现 502)

https://github.com/laruence/yaf/issues/491 (从yaf3.0.9升级到3.2.4出现php-fpm进程被SIGSEGV信号杀掉)

解决方案

回退yaf版本到3.0.9,该版本经验证没有上述bug且可兼容php 7.3.18版本。

【总结】

项目在使用第三方扩展中遇到问题是经常会出现的问题,在进行选型时要充分了解第三方扩展及使用版本的稳定性避免踩坑。

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • 【必看】社区文章目录

    Nanako
  • 社区精华文章目录

    cailynyu
  • 史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术

    随着Android系统的不断升级,即时通讯网技术群和社区里的IM和推送开发的程序员们,对于进程保活这件事是越来越悲观,必竟系统对各种保活黑科技的限制越来越多了,...

    JackJiang
  • 融云技术分享:融云安卓端IM产品的网络链路保活技术实践

    本文来自融云技术团队原创分享,原文发布于“ 融云全球互联网通信云”公众号,原题《IM 即时通讯之链路保活》,即时通讯网收录时有部分改动。

    JackJiang
  • 记一次诡异的Bug修复——App自启动

    在上一版本App临发版之前,QA和PM同学同时报了一个严重的Bug:App退出之后会自动重新启动,也就是用户关不了App。开发者梦寐以求的应用常驻就这么被莫名其...

    用户2898788
  • 全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)

    本文原作者“minminaya”,作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作了幅修订和改动,感谢原作者。

    JackJiang
  • 容器OOM问题排查思路

    外界的刁难,挑战。。。其实并不是最难的,最难的总是内部难以安抚,OOM。。。内存泄漏,OOM killer了解一下。。。攘外必先安内。。。我可能要死在内...

    SRE运维实践
  • 应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)

    在Android 4.4及以后的系统中,应用能否常驻内存,一直以来都是相当头疼的事情,尤其移动端IM、消息推送这类应用,为了保证“全时在线”的概念,真是费尽了心...

    JackJiang
  • 内核级木马与病毒攻防:Linux可执行文件的ELF格式描述

    要想在Linux系统上实现逆向工程,分析,设计或查杀病毒和恶意代码,你不得不深入掌握其可执行文件的ELF格式,这样你才能了解进程在内存空间的布局和运行的基本规律...

    望月从良
  • Android 双进程守护的实现代码

    最近有在项目中用到高德的定位SDK,功能是每隔一定的时间获取一次用户的地理位置,采取的方案是在后台开启一个 Service,监听高德地图的位置变化。

    砸漏
  • Android进程永生技术终极揭秘:进程被杀底层原理、APP应对被杀技巧

    上个月在知乎上发表的由“袁辉辉”分享的关于TIM进程永生方面的文章(即时通讯网重新整理后的标题是:《史上最强Android保活思路:深入剖析腾讯TIM的进程永生...

    JackJiang
  • Python学习路线图

    Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.

    IT派
  • 教你如何用Jenkins自动化部署项目(教程,从零到搭建完成)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    拓荒者
  • 全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)1、引言2、先总结一下,Android端APP为何要搞保活黑科技?3、相关文章4、常见的Android端保活黑科技方案盘点5、汇

    本文原作者“minminaya”,作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作了幅修订和改动,感谢原作者。

    JackJiang
  • 祝贺 Linux 25 岁:25 个关于 Linux 的惊人真相!

    作者:Javen Fang 链接:https://zhuanlan.zhihu.com/p/22222383 简评:给我的最大的印象时,才 25 年,达到这么惊...

    智能算法
  • Android 进程保活 的两种实现方式

    目前市场上主流的项目应用app,在其进程被杀掉之后,还是可以继续运行在后台(保活);比如,微信,淘宝,钉钉,QQ等。类似耍流氓,保证应用进程不被杀死。当然优雅的...

    包子388321
  • NDK--双进程守护之利用线程轮询实现APP保活

    1.提高优先级 这个办法对普通应用而言, 应该只是降低了应用被杀死的概率,但是如果真的被系统回收了,还是无法让应用自动重新启动!

    aruba

扫码关注腾讯云开发者

领取腾讯云代金券