排查PHP-FPM佔用CPU太高

發現

如何發現的呢?固然是使用top命令,發現系統的load average>3,這說明系統已經處於比較高的負載中。php

嘗試解決

當我把php-fpm重啓後,沒過一下子又開始cpu狂飆!這是什麼鬼?緩存

開始排查

首先,咱們開啓在php-fmp.conf中開啓錯誤日誌,慢執行日誌還有常規日誌併發

error_log = /var/log/php/error.log
access.log = /var/log/php/access.$pool.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %{system}C%%"
slowlog = /var/log/php/slow.$pool.log
request_slowlog_timeout = 3s

重啓php-fpm後咱們開始監視日誌php-fpm

# 查看慢執行日誌

[15-May-2015 12:50:22]  [pool www] pid 1819
script_filename = /home/ftp/phpergao/wwwroot/index.php
[0x00007f2d286c2790] replace() /home/ftp/phpergao/wwwroot/usr/plugins/CdnHelper/Plugin.php:72
[0x00007fff78ab00f0] replace() unknown:0
[0x00007f2d286c2420] call_user_func_array() /home/ftp/phpergao/wwwroot/var/Typecho/Plugin.php:489
[0x00007fff78ab0430] __call() unknown:0
[0x00007f2d286c1f78] contentEx() /home/ftp/phpergao/wwwroot/var/Widget/Abstract/Contents.php:141
[0x00007f2d286c1b78] ___content() /home/ftp/phpergao/wwwroot/var/Typecho/Widget.php:385
[0x00007fff78ab0850] __get() unknown:0
[0x00007f2d286c1870] content() /home/ftp/phpergao/wwwroot/var/Widget/Abstract/Contents.php:783
[0x00007f2d286c1628] content() /home/ftp/phpergao/wwwroot/var/Widget/Archive.php:1401
[0x00007f2d286c14d0] content() /home/ftp/phpergao/wwwroot/usr/themes/just/index.php:32
[0x00007f2d286c10f8] +++ dump failed

[15-May-2015 19:18:48]  [pool www] pid 5597
script_filename = /home/ftp/phpergao/wwwroot/index.php
[0x00007ff17fcf0168] __call() /home/ftp/phpergao/wwwroot/var/Typecho/Plugin.php:483
[0x00007fff915493c0] __call() unknown:0
[0x00007ff17fcefca8] ___title() /home/ftp/phpergao/wwwroot/var/Typecho/Widget.php:387
[0x00007fff915497e0] __get() unknown:0
[0x00007ff17fcef960] title() /home/ftp/phpergao/wwwroot/var/Widget/Abstract/Contents.php:809
[0x00007ff17fcef6d0] title() /home/ftp/phpergao/wwwroot/usr/themes/just/index.php:23
[0x00007ff17fcef2f8] +++ dump failed

其中contentEx引發了個人注意,這個方法是一個鉤子,系統在獲取到文章內容後執行,老高的有幾個插件都掛載在此,忽然就有想法了。工具

因而當即暫停有關的插件,過一陣負載變爲load average: 0.39, 0.29, 0.42。性能

記錄程序運行細節

記錄程序運行時間

<?php
$start = microtime(true);

//index.php

$end = microtime(true);
$time = number_format(($end - $start), 2);

echo 'This page loaded in ', $time, ' seconds';
?>

跟蹤php的系統調用

老高使用strace查看php主進程以及fork出的子進程的系統調用,並輸出到/tmp/output.txt學習

strace -o /tmp/output.txt -T -tt -F -e trace=all -p 31920

將輸出的文件用scp拷貝到本地電腦上,通過分析,併發+插件幾乎拖死了CPU。插件

結論

  1. 某些數據的展現與否最好把性能也考慮上
  2. 正則的效率不高,能不用盡可能不用
  3. 主題中若是同一個變量要使用屢次,請將其先保存至一個臨時變量
  4. 緩存很重要
  5. strace是個好工具

這篇文章也能夠學習一下 PHP高效率寫法(詳解緣由)日誌

相關文章
相關標籤/搜索