PHP網站打開太慢,用slow log追蹤具體文件和函數

原因有太多可能,比如代碼改動、異常訪問、網絡波動、服務器硬件故障等等。

引起性能問題的原因有這麼多,那如何定位呢?

給大家介紹一個性能追蹤的方法,這個方法在我運維職業生涯裏屢試不爽,幫了我不少大忙。

                                       — slow log追蹤 —

我們可以通過slow log很方便地追蹤到問題點。先來看配置方法吧。

1)編輯配置文件

假設php安裝路徑爲/usr/local/php,配置文件路徑/usr/local/php/etc/php-fpm.conf)

vim /usr/local/php/etc/php-fpm.conf #更改或增加兩行內容

slowlog = /data/logs/php-slow.log
request_slowlog_timeout = 2
說明:slowlog定義日誌路徑和名字,request_slowlog_timeout定義超時時間,單位秒,即一個php腳本執行時間超過了該時間,則會記錄日誌。

2)重啓php-fpm服務

具體重啓命令,根據你自己的環境來決定。配置文件修改後,不重啓或者不重載服務是不生效的。

3)測試

在測試站點裏新建一個test.php文件,寫入如下內容:

<?php
echo "1";
sleep (5);
echo "2";
然後在瀏覽器裏或者使用curl命令去訪問

curl http://ip/test.php

4)結果分析

訪問test.php時,我們能感覺到它短暫卡死,大概5秒後出現結果。此時到/data/logs/php-slow.log裏查看,有如下內容:

[pool www] pid 6368
script_filename = /data/wwwroot/aminglinux.cc/test.php
[0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3
這個slow log,不僅可以記錄哪一個文件慢,而且也可以記錄具體哪一行的什麼函數。

有了它,一旦網站訪問卡頓,我們就非常方便地找到問題點了。

                               — 線上生產環境演示案例 —

問題描述:

網站訪問變卡頓了,不是不能訪問,而是變慢了。

解決過程:

1)登錄服務器查看負載,結果不到1,並不高

2)vmstat 1查看發現r列時不時出現不高於5的數字,說明有些進程比較忙

3)用top命令查看,php-fpm進程排在前面

4)查看slow log,結果如下:

[29-1月-2019 16:54:59] [pool www] pid 20287

script_filename = /data/wwwroot/www.example.com/redirect.php
[0x00000000031d83c0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84
[0x00000000031d6bb0] query() /data/wwwroot/www.example.com/redirect.php:105

[29-1月-2019 16:54:59] [pool www] pid 23066
script_filename = /data/wwwroot/www.example.com/redirect.php
[0x000000000319b5a0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84
[0x0000000003199d90] query() /data/wwwroot/www.example.com/redirect.php:122

通過slow log發現是redirect.php裏面有查詢數據庫的操作慢導致網站訪問卡頓。

所以,還需要登錄數據庫服務器近一步分析爲什麼MySQL查詢慢,這個就涉及到了MySQL的慢查詢日誌,具體詳細的操作我不再闡述。

或者使用Xdebug+Webgrind
https://blog.51cto.com/14199566/2382732

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章