记一次诡异的php-fpm吃满CPU事件

一切的开始

昨天上午,我如往常一般坐在办公室电脑前,开始备份代码并准备上线新版本

备份完毕,上传代码,看起来一切都很顺利。更新完毕!

The bomb has been planted!

打开官网看看效果。诶怎么一直转圈圈,好慢哦,公司网络又抽风了?

打开微博,一切正常啊。再次打开官网,还是一直转圈圈。尝试用手机和同事电脑,都无法打开官网,顿时我就懵逼了

赶紧从备份中恢复,再试,还是打不开,卧槽,药丸药丸

《21天学通拆弹》

打开日志,没有新的错误被记录

top一下,卧槽CPU炸了,仅仅几个php-fpm就榨干了CPU。IO负载倒是低得很

仔细回想,代码中并没有什么地方需要占用大量的CPU资源啊,就算是不慎导致代码死循环了,也不至于那么多个进程一起死了吧?

重启php-fom,不到一会儿又100%,这TM就很尴尬了

论菜鸟的自我修养

赶紧请来技术大佬开慧哥给看看情况。只见开慧哥芊芊玉指在键盘上翻飞,各种我来不及看或者看不懂的代码如行云流水般出现在屏幕上,一阵噼里啪啦过后,成功开启慢查日志,我仿佛看到开慧哥那宽大光滑的额头散发出了希望的曙光。
选答题:请问上面的自然段中出现了多少种修辞手法?分别是什么?

红 || 蓝 ?

日志显示,问题出在Session类的flock函数。文件锁有问题?不应该啊IO负载明明低得一逼。至此官网已故障20多分钟,本着可用性至上的原则,准备先把Session迁移到Memcache上再说。因为Session类自带Memcache驱动,简单配置即可

直接在线上改代码,比背对CT吸大麻还刺激。保存后,打开官网,秒开!

……

然后报了一个错:Class 'Memcached' not found

接触过缓存的人估计都被MemcacheMemcached折腾过。服务器上只有Memcache而没有Memcached怎么办?恰好有个一键脚本,几下就把Memcached装好了

再次访问官网,不负众望地再次报错,说找不到connect方法。看手册得知Memcached应该使用addServer,于是修改保存,官网顺利打开

凶手竟是!?

刚才安装Memcached时,开慧哥从流瀑般茫茫代码海中似乎发现了一个硬盘空间不足的提示

于是df -hl之,我一看,哇!(葛平腔)系统盘占用100%

虽然从没经历过这样的情况,但我似乎已经知道了flock的问题所在了……

于是删掉最开始的备份文件,大概就是因为磁盘满了导致文件锁卡住吧

祸 ! Singleton

你以为这就完了?Naive!进行别的操作从Memcache服务端获取数据时又报错

错误信息大概是value too long

一顿Google过后,原来是Memcache和Memcached在存取数组上不兼容导致的,蛋疼,似乎还没有解决方法。想要清空所有缓存吧?flush方法还被辣鸡腾讯云给禁用了,虽然登上网页后台有个清空功能,但只有15分钟内还有读写操作就不给清空
大概腾讯以为这个设定可以防止误操作很人性化很良心?卧槽企鹅你是智障吗,想防止误操作你不会二次验证吗?非要来个强制时间限制,既然行不通,也只好换个方案了

不兼容,又不能清空,那就只能重新用回Memcache咯。于是准备到php.ini内启用原本的memcache.so,一看,诶配置项怎么消失了?一搜,压根就没有memcache.so文件了

卧槽一键脚本你也太“智能(zhang)”了吧!?让你给装个memcached你装好后顺便连memcache都删了!?

好吧再编译一个memcache,把addServer改回去,这下总行了吧?

你怎么不上天?

聪明的小朋友们看到这直白的标题,可能已经猜到了……

是的Memcache里缓存的部分数据上天了。如果是一整条一整条数据地丢那还没关系,毕竟缓存不存在的话会自动从数据库读取并缓存起来。蛋疼的是这丢的都是某条数据(数组型)里的某些键,这TM就很尴尬了。经常出现从缓存里读出数据后缺失一些键值导致报错的。辣鸡腾讯又没法清空,只好临时改代码,跳过从缓存读取数据这一步

虽说未来的升级计划有打算将Session移至Memcache中,不过现在还是太乱了,先尽量恢复,后续升级后续再说吧。于是将Session驱动改回文件

至此,网站服务恢复正常

总结

人啊,总是要在扑街之后正确认识到自己扑街的原因才能继续向前嘛

  1. 磁盘空间被占满后会导致flock死锁
  2. flock死锁会导致php-fpm占用飙升
  3. flock不够机智,连个错都不报
  4. 并非只有数据库才有慢查日志,php-fpm也有
  5. MemcacheMemcached至少在连接方式、数组存取上不兼容
  6. 切换使用MemcacheMemcached可能导致数据损坏
  7. 欢迎小伙伴们踊跃补充~

14 条评论

昵称
  1. 米泽由香里

    夸张:芊芊玉指 翻飞 宽大光滑
    比喻:行云流水 希望的曙光

    1. mokeyjay

      [good]服气

  2. 霜酱

    惊悚

  3. asd

    选答题hhhh

  4. 李伟

    这问题出的- -!

    1. mokeyjay

      2333

  5. 米泽由香里

    归根到底是没有升级配置(滑稽

    1. mokeyjay

      [囧]BUG的话,估计16H都能吃满

      1. 米泽由香里

        被吃满是因为你没有给TX充够钱

        1. 蝶恋暗舞

          给够钱开***服务才是壕无人性,但可保证不伺机