PHP7线上system time飙高问题

最近刚刚全量上线PHP7,经过一晚发现个别机器的PHP-FPM占用CPU很高,整机top查看system time非常高。

通过strace查看PHP-FPM的系统调用发现存在频繁mmap/munmap 2MB内存的现象:

通过google找到了相关的怀疑对象:How to troubleshoot high load caused by php7,普遍聚焦在PHP7的一个huge page特性。

进一步google找到了鸟哥的博客,非常清楚的说明了Huge page的来由和作用:让你的PHP7更快之Hugepage 。

确认huge page的大小恰好就是2MB,与strace发现的调用相符,于是开始怀疑Huge page问题。后来被swoole韩天峰指正,上述mmap并没有携带HUGE_PAGE的flag,也就是说我抓的现场并不是分配huge page,之前的猜测是有问题的。

在PHP内核讨论群中提问,相关经验的同学提示我们可能是”透明大页”的问题,它是红帽系统的一个特殊机制,可以参考《新浪微博PHP7升级实践》中的介绍。它相当于把大页分配这个事情对应用透明化,会有一个独立的内核进程把我们普通分配的4KB页内存替换为huge page,可能造成性能问题。

因此结论是:

  1. 开启huge page是一个可选项,它是opcache的一个特性,一定程度优化PHP性能。
  2. 关闭”透明大页’是必选项,它是redhat的特性,可能造成性能骤降进入万劫不复。

末尾附扩展阅读《huge page是否是拯救性能的万能良药?

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~