Linux lsof 調(diào)試 PHP

1 簡介

lsof(list open files) 是一個列出當(dāng)前系統(tǒng)打開文件的工具。

在 linux 環(huán)境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規(guī)數(shù)據(jù),還可以訪問網(wǎng)絡(luò)連接和硬件。所以如傳輸控制協(xié)議 (TCP) 和用戶數(shù)據(jù)報(bào)協(xié)議 (UDP) 套接字等,系統(tǒng)在后臺都為該應(yīng)用程序分配了一個文件描述符,無論這個文件的本質(zhì)如何,該文件描述符為應(yīng)用程序與基礎(chǔ)操作系統(tǒng)之間的交互提供了通用接口。因?yàn)閼?yīng)用程序打開文件的描述符列表提供了大量關(guān)于這個應(yīng)用程序本身的信息,因此通過 lsof 工具能夠查看這個列表對系統(tǒng)監(jiān)測以及排錯將是很有幫助的。

2 命令使用

lsof [選項(xiàng)] [絕對路徑的文件名]

選項(xiàng):

-a:列出打開文件存在的進(jìn)程;
-c<進(jìn)程名>:列出指定進(jìn)程所打開的文件;
-g:列出GID號進(jìn)程詳情;
-d<文件號>:列出占用該文件號的進(jìn)程;
+d<目錄>:列出目錄下被打開的文件;
+D<目錄>:遞歸列出目錄下被打開的文件;
-n<目錄>:列出使用NFS的文件;
-i<條件>:列出符合條件的進(jìn)程。(4、6、協(xié)議、:端口、 @ip )
-p<進(jìn)程號>:列出指定進(jìn)程號所打開的文件;
-u:列出UID號進(jìn)程詳情;
-h:顯示幫助信息;
-v:顯示版本信息。

顯示示例:

[root@localhost public]# lsof /usr/local/php71/sbin/php-fpm 
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
php-fpm 1544 root txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1545  www txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1546  www txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1547  www txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1548  www txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1549  www txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1550  www txt    REG  253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
......

每行顯示一個打開的文件,默認(rèn)如果后面不跟任何東西,將打開系統(tǒng)打開的所有文件。

參數(shù) 說明
COMMAND 進(jìn)程名稱
PID 進(jìn)程標(biāo)識符
USER 進(jìn)程所有者
FD 文件描述符,應(yīng)用程序通過文件描述符識別到該文件。如 cwd、txt 等。
TYPE 文件類型,如 REG、DIR、CHR、BLK、UNIX、FIFO、IPV4。
DEVICE 指定磁盤名稱
SIZE 文件大小。單位(字節(jié))。

補(bǔ)充:FD 列中的文件描述 cwd 值表示應(yīng)用程序的當(dāng)前工作目錄,這是該程序啟動的目錄,除非它本身對這個目錄進(jìn)行更改。txt 類型的是程序代碼,如應(yīng)用程序二進(jìn)制文件本身或者共享庫。其次數(shù)值表示應(yīng)用程序的文件描述符,這是打開文件時一個返回的一個整數(shù)。

3 TYPE 說明

參數(shù) 說明
REG 文件。
DIR 目錄。
CHR 字符設(shè)備。命令行終端。
BLK 塊設(shè)備。如硬盤、內(nèi)存。
UNIX UNIX 域套接字。
FIFO 先進(jìn)先出 (FIFO) 隊(duì)列。
IPV4 網(wǎng)際協(xié)議 (IP) 套接字。
NODE 索引節(jié)點(diǎn)(文件在磁盤上的標(biāo)識) 。

4 FD 說明

參數(shù) 說明
cwd 表示current work dirctory,即:應(yīng)用程序的當(dāng)前工作目錄,這是該應(yīng)用程序啟動的目錄,除非它本身對這個目錄進(jìn)行更改 。
txt 該類型的文件是程序代碼,如應(yīng)用程序二進(jìn)制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序 。
lnn library references (AIX)。
er FD information error (see NAME column) 。
jld jail directory (FreeBSD) 。
ltx shared library text (code and data) 。
mxx hex memory-mapped type number xx。
m86 DOS Merge mapped file。
mem memory-mapped file。
mmap memory-mapped device。
pd parent directory。
rtd root directory。
tr kernel trace file (OpenBSD) 。
v86 VP/ix mapped file。
0 表示標(biāo)準(zhǔn)輸出。
1 表示標(biāo)準(zhǔn)輸入。
2 表示標(biāo)準(zhǔn)錯誤。

一般在標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤、標(biāo)準(zhǔn)輸入后還跟著文件狀態(tài)模式

參數(shù) 說明
u 表示該文件被打開并處于讀取/寫入模式。
r 表示該文件被打開并處于只讀模式。
w 表示該文件被打開并處于寫入模式。
空格 表示該文件的狀態(tài)模式為 unknow,且沒有鎖定。
- 表示該文件的狀態(tài)模式為 unknow,且被鎖定。

5 調(diào)試 PHP

以下示例來源于網(wǎng)絡(luò)整理。目的是解決進(jìn)程卡死的情況。經(jīng)驗(yàn)證,示例當(dāng)中步驟以及命令無誤。

5.1) 首先獲取該進(jìn)程 ID

ps -aux | grep QueryABC.php
 
sync360  11115  0.0  0.0   6564   864 ?        Ss   14:00   0:00 /bin/sh -c /usr/local/bin/php /home/QueryABC.php BILL99DF 10-8>> /home
sync360  11124  0.0  0.4 361628 17296 ?        S    14:00   0:04 /usr/local/bin/php /home/QueryABC.php BILL99DF 10-8
sync360  25230  0.0  0.0  63384   872 pts/0    S+   15:28   0:00 grep QueryABC.php

5.2) strace 查看該進(jìn)程正在持續(xù)的狀態(tài)

sudo strace -T -tt -e trace=all -p 11124
[sudo] password for ancongcong: 
Process 11124 attached - interrupt to quit
15:33:07.259044 read(9, 

5.3) lsof 查看進(jìn)程的所有使用的文件

lsof -p 11124
 
....
php     11124 sync360  mem    REG        8,1    23736    3211320 /lib64/libnss_dns-2.5.so
php     11124 sync360    0r  FIFO        0,6          1522728709 pipe
php     11124 sync360    1w   REG        8,1  4088819    1869737 /home/logs/QueryABC.log
php     11124 sync360    2w  FIFO        0,6          1522728710 pipe
php     11124 sync360    3w   CHR        1,3                 982 /dev/null
php     11124 sync360    4u  IPv4 1522728838                 TCP 211.151.122.234:46004->10.117.128.47:rtmp-port (CLOSE_WAIT)
php     11124 sync360    5wW  REG        8,1        0    2704363 /home/lockfile/QueryABC.php.BILL99DF.10-8
php     11124 sync360    6u  IPv4 1522728841                 TCP 211.151.122.234:51019->10.117.128.46:rtmp-port (CLOSE_WAIT)
php     11124 sync360    7w   REG        8,1 31960384    1869789 /home/logs/XXXX_info.log.20180118
php     11124 sync360    8w   REG        8,1 18151722    1869806 /home/logs/XXXX_QRY_info.log.20180118
php     11124 sync360    9u  IPv4 1522729884                 TCP 211.151.122.234:54976->61.152.114.130:https (ESTABLISHED)
sudo netstat -tunpa | grep 11124
tcp        0      0 211.151.122.234:54976       61.152.114.130:443          ESTABLISHED 11124/php           
tcp        1      0 211.151.122.234:51019       10.117.128.46:3500          CLOSE_WAIT  11124/php           
tcp        1      0 211.151.122.234:46004       10.117.128.47:3500          CLOSE_WAIT  11124/php

可以發(fā)現(xiàn)最終是停留在 https 的鏈接建立,等待獲取數(shù)據(jù),查看此處代碼 :

ini_set('default_socket_timeout',30);
$scOptions = array('connection_timeout' => 30);
$clientObj = new SoapClient( $wsdl , $scOptions);

當(dāng)前版本 php 較老,這里是有個 bug 的在 https 鏈接請求時 SOAPClient 的超時時間是不生效。導(dǎo)致一直連接不釋放,當(dāng)請求量上來的時候,會導(dǎo)致服務(wù)器陷入高負(fù)載狀態(tài)。

6 查詢 PHP 進(jìn)程狀態(tài)

所謂狀態(tài),指的是我們在啟動 PHP 的時候,PHP-FPM 加載的系統(tǒng)庫、PHP 擴(kuò)展、以及其他日志文件等的狀態(tài)信息。

6.1) 查詢 PHP-FPM 進(jìn)程的 PID

[root@localhost ~]# ps -aux|grep php-fpm
root      1544  0.0  0.8 291448 16244 ?        Ss   Jul30   0:06 php-fpm: master process
www       1545  0.0  0.9 291920 17340 ?        S    Jul30   0:00 php-fpm: pool www
www       1546  0.0  0.9 292136 17856 ?        S    Jul30   0:00 php-fpm: pool www
www       1547  0.0  0.9 291908 17336 ?        S    Jul30   0:00 php-fpm: pool www
www       1548  0.0  0.9 291916 17308 ?        S    Jul30   0:00 php-fpm: pool www
www       1549  0.0  0.9 292272 17880 ?        S    Jul30   0:00 php-fpm: pool www
www       1550  0.0  0.9 292616 18132 ?        S    Jul30   0:00 php-fpm: pool www
......

可以獲知我們的 PHP-FPM 主進(jìn)程的 PID 為 1544。

6.2) 查詢進(jìn)程狀態(tài)

[root@localhost ~]# lsof -p 1544
COMMAND  PID USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
php-fpm 1544 root  cwd       DIR              253,0       271       64 /
php-fpm 1544 root  rtd       DIR              253,0       271       64 /
php-fpm 1544 root  txt       REG              253,0  40770864  1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1544 root  mem       REG              253,0     62184   482957 /usr/lib64/libnss_files-2.17.so
php-fpm 1544 root  mem       REG              253,0   4194305 16881237 /tmp/phptrace.ctrl
php-fpm 1544 root  mem       REG              253,0   1850464    41259 /usr/lib64/libdb-5.3.so
php-fpm 1544 root  mem       REG              253,0     28216 33654797 /usr/lib64/sasl2/libsasldb.so.3.0.0
php-fpm 1544 root  mem       REG              253,0     19968 33654794 /usr/lib64/sasl2/libanonymous.so.3.0.0
php-fpm 1544 root  DEL       REG                0,4              18634 /dev/zero
php-fpm 1544 root  mem       REG              253,0    159600 51987804 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/trace.so
php-fpm 1544 root  mem       REG              253,0   4414480 50968175 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/mongodb.so
php-fpm 1544 root  mem       REG              253,0    851128 50666307 /usr/local/lib/libevent_core-2.1.so.6.0.2
php-fpm 1544 root  mem       REG              253,0    502032 50666311 /usr/local/lib/libevent_extra-2.1.so.6.0.2
php-fpm 1544 root  mem       REG              253,0    116088 50666319 /usr/local/lib/libevent_openssl-2.1.so.6.0.2
php-fpm 1544 root  mem       REG              253,0    883440 52435182 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/event.so
php-fpm 1544 root  mem       REG              253,0    121320    41640 /usr/lib64/libsasl2.so.3.0.0
php-fpm 1544 root  mem       REG              253,0   5662520 51023034 /usr/local/lib/librdkafka.so.1
php-fpm 1544 root  mem       REG              253,0    440512 51861780 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/rdkafka.so
php-fpm 1544 root  mem       REG              253,0   4408400 50919001 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/swoole.so
php-fpm 1544 root  mem       REG              253,0   1426032 52419266 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/yaf.so
php-fpm 1544 root  mem       REG              253,0   3618280 51005421 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/fileinfo.so
php-fpm 1544 root  mem       REG              253,0   1734168 52419246 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/redis.so
php-fpm 1544 root  mem       REG              253,0   1310320 51861871 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
php-fpm 1544 root  mem       REG              253,0   1631520 51851520 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/opcache.so
php-fpm 1544 root  mem       REG              253,0 106070960 50918862 /usr/lib/locale/locale-archive
php-fpm 1544 root  mem       REG              253,0    402384    41228 /usr/lib64/libpcre.so.1.2.0
php-fpm 1544 root  mem       REG              253,0    155784   264930 /usr/lib64/libselinux.so.1
php-fpm 1544 root  mem       REG              253,0     15688    43432 /usr/lib64/libkeyutils.so.1.5
php-fpm 1544 root  mem       REG              253,0     58728  1528050 /usr/lib64/libkrb5support.so.0.1
php-fpm 1544 root  mem       REG              253,0    210840    44058 /usr/lib64/libk5crypto.so.3.1
php-fpm 1544 root  mem       REG              253,0     15848     1299 /usr/lib64/libcom_err.so.2.1
php-fpm 1544 root  mem       REG              253,0    963576   177761 /usr/lib64/libkrb5.so.3.3
php-fpm 1544 root  mem       REG              253,0    320408  1349437 /usr/lib64/libgssapi_krb5.so.2.2
php-fpm 1544 root  mem       REG              253,0    157424     1300 /usr/lib64/liblzma.so.5.2.2
php-fpm 1544 root  mem       REG              253,0    144792   524665 /usr/lib64/libpthread-2.17.so
php-fpm 1544 root  mem       REG              253,0     19384    41444 /usr/lib64/libgpg-error.so.0.10.0
php-fpm 1544 root  mem       REG              253,0    535064    41239 /usr/lib64/libgcrypt.so.11.8.2
php-fpm 1544 root  mem       REG              253,0     11464     1231 /usr/lib64/libfreebl3.so
php-fpm 1544 root  mem       REG              253,0   2173512     1485 /usr/lib64/libc-2.17.so
php-fpm 1544 root  mem       REG              253,0     88720  1499604 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
php-fpm 1544 root  mem       REG              253,0   1419360 51389508 /usr/local/lib/libiconv.so.2.6.0
php-fpm 1544 root  mem       REG              253,0    258344  1577528 /usr/lib64/libxslt.so.1.1.28
php-fpm 1544 root  mem       REG              253,0     57136  1579626 /usr/lib64/libicuio.so.50.1.2
php-fpm 1544 root  mem       REG              253,0  20789896  1579622 /usr/lib64/libicudata.so.50.1.2
php-fpm 1544 root  mem       REG              253,0   1539392  1579636 /usr/lib64/libicuuc.so.50.1.2
php-fpm 1544 root  mem       REG              253,0   2096056  1579624 /usr/lib64/libicui18n.so.50.1.2
php-fpm 1544 root  mem       REG              253,0    691736  1349410 /usr/lib64/libfreetype.so.6.10.0
php-fpm 1544 root  mem       REG              253,0    472672 51303927 /usr/local/lib/libcurl.so.4.4.0
php-fpm 1544 root  mem       REG              253,0   2512832  1528053 /usr/lib64/libcrypto.so.1.0.2k
php-fpm 1544 root  mem       REG              253,0    470360  1528055 /usr/lib64/libssl.so.1.0.2k
php-fpm 1544 root  mem       REG              253,0   1509376    41480 /usr/lib64/libxml2.so.2.9.1
php-fpm 1544 root  mem       REG              253,0    117680   482950 /usr/lib64/libnsl-2.17.so
php-fpm 1544 root  mem       REG              253,0   1139680   177756 /usr/lib64/libm-2.17.so
php-fpm 1544 root  mem       REG              253,0    285296     5399 /usr/lib64/libjpeg.so.62.1.0
php-fpm 1544 root  mem       REG              253,0    179296     5419 /usr/lib64/libpng15.so.15.13.0
php-fpm 1544 root  mem       REG              253,0    995840  1337428 /usr/lib64/libstdc++.so.6.0.19
php-fpm 1544 root  mem       REG              253,0     19776      858 /usr/lib64/libdl-2.17.so
php-fpm 1544 root  mem       REG              253,0    662504 50758820 /usr/local/lib/libmcrypt.so.4.4.8
php-fpm 1544 root  mem       REG              253,0     44448     1254 /usr/lib64/librt-2.17.so
php-fpm 1544 root  mem       REG              253,0    106848   524736 /usr/lib64/libresolv-2.17.so
php-fpm 1544 root  mem       REG              253,0     87368  1577526 /usr/lib64/libexslt.so.0.8.17
php-fpm 1544 root  mem       REG              253,0     90664    41257 /usr/lib64/libz.so.1.2.7
php-fpm 1544 root  mem       REG              253,0     41080      854 /usr/lib64/libcrypt-2.17.so
php-fpm 1544 root  mem       REG              253,0    164240  1517336 /usr/lib64/ld-2.17.so
php-fpm 1544 root  DEL       REG                0,4              20579 /dev/zero
php-fpm 1544 root    0u      CHR                1,3       0t0     1028 /dev/null
php-fpm 1544 root    1u      CHR                1,3       0t0     1028 /dev/null
php-fpm 1544 root    2w      REG              253,0   1998396 36911463 /usr/local/php71/var/log/php71-fpm.log
php-fpm 1544 root    3w      REG              253,0   1998396 36911463 /usr/local/php71/var/log/php71-fpm.log
php-fpm 1544 root    4u     unix 0xffff886c38c9c000       0t0    20580 socket
php-fpm 1544 root    5r     FIFO                0,9       0t0    20585 pipe
php-fpm 1544 root    6u     unix 0xffff886c38c9d400       0t0    20581 socket
php-fpm 1544 root    7u     unix 0xffff886c38c9c800       0t0    20582 /dev/shm/php71-cgi.sock
php-fpm 1544 root    8u  a_inode               0,10         0     6123 [eventpoll]

通過以上信息,我們可以明確知道我們的這個進(jìn)程對應(yīng)的 PHP-FPM 的絕對路徑。以及它加載了系統(tǒng)的哪些類庫,和加載了 PHP 的哪些類庫。

php-fpm 1544 root    0u      CHR                1,3       0t0     1028 /dev/null
php-fpm 1544 root    1u      CHR                1,3       0t0     1028 /dev/null
php-fpm 1544 root    2w      REG              253,0   1998396 36911463 /usr/local/php71/var/log/php71-fpm.log

通過此項(xiàng),我們可以看到,標(biāo)準(zhǔn)輸出(0u)丟棄了(/dev/null)。標(biāo)準(zhǔn)轉(zhuǎn)入(1u)也丟棄了(/dev/null)。標(biāo)準(zhǔn)的錯誤(2w)轉(zhuǎn)出到了 /usr/local/php71/var/log/php71-fpm.log 文件。

7 其它用法

7.1) 列出所有打開的文件:

lsof

備注: 如果不加任何參數(shù),就會打開所有被打開的文件,建議加上一下參數(shù)來具體定位。通常我們不會這樣直接用。

7.2) 查看誰正在使用某個文件:

lsof /usr/local/php53/var/log/php-fpm.log

7.3) 遞歸查看某個目錄的文件信息:

lsof +D /usr/local/php53/var/log/

備注: 使用了+D,對應(yīng)目錄下的所有子目錄和文件都會被列出

7.4) 列出某個用戶打開的文件信息

lsof -u www

備注: -u 選項(xiàng),u 其實(shí)是 user 的縮寫。該示例在筆者電腦上是列出 nginx/php-fpm 打開的文件信息。

7.5) 列出某個程序所打開的文件信息

lsof -c mysql
lsof -c php-fpm

備注: -c 選項(xiàng)將會列出所有以 mysql 開頭的程序的文件。

7.6) 列出多個程序多打開的文件信息

lsof -c mysql -c apache

7.7) 列出某個用戶以及某個程序所打開的文件信息

lsof -u root -c mysql

7.8) 列出除了某個用戶外的被打開的文件信息

lsof -u ^root

備注:^這個符號在用戶名之前,將會把是 root 用戶打開的進(jìn)程不讓顯示。

7.9) 通過某個進(jìn)程號顯示該進(jìn)行打開的文件

lsof -p 進(jìn)程 ID

7.10) 列出多個進(jìn)程號對應(yīng)的文件信息

lsof -p 進(jìn)程ID,進(jìn)程ID,進(jìn)程ID

7.11) 列出除了某個進(jìn)程號,其他進(jìn)程號所打開的文件信息

lsof -p ^1

7.12) 列出所有的網(wǎng)絡(luò)連接

lsof -i

7.13) 列出所有 tcp 網(wǎng)絡(luò)連接信息

lsof -i tcp

7.14) 列出所有udp網(wǎng)絡(luò)連接信息

lsof -i udp

7.15) 列出誰在使用某個端口

[root@localhost ~]# lsof -i :6379
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 1344 redis    4u  IPv4  19521      0t0  TCP localhost:6379 (LISTEN)

7.16) 列出誰在使用某個特定的udp端口

lsof -i udp:55

7.17) 列出誰在使用某個特定的tcp端口

lsof -i tcp:80

7.18) 列出某個用戶的所有活躍的網(wǎng)絡(luò)端口

lsof -a -u root -i

7.19) 列出所有網(wǎng)絡(luò)文件系統(tǒng)

lsof -N

7.20) 域名 socket 文件

lsof -u

8 總結(jié)

lsof 命令可以用來查看我們的進(jìn)程打開的文件、目錄、網(wǎng)絡(luò)設(shè)置、網(wǎng)絡(luò)連接等。在排查 PHP 性能問題的時候,可以起到一個直接或間接的佐證工具。讓我們能快速定位問題并解決問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容