如何發現的呢?固然是使用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'; ?>
老高使用strace查看php主進程以及fork出的子進程的系統調用,並輸出到/tmp/output.txt學習
strace -o /tmp/output.txt -T -tt -F -e trace=all -p 31920
將輸出的文件用scp拷貝到本地電腦上,通過分析,併發+插件幾乎拖死了CPU。插件
這篇文章也能夠學習一下 PHP高效率寫法(詳解緣由)日誌