故障排查工具-strace,tcpdump的簡單使用

littlexiaoshuishui發表於2020-08-17

定位程式

top //檢視程式佔用資源 cpu,mem

ps -aux|grep php-fpm //檢視php-fpm相關程式

分析程式

[root@izwz97ww79qca7m2kxb6hqz ~]# ll /proc/28770/fd  //檢視程式28770中所有操作的檔案fd
total 0
lrwx------ 1 root root 64 Jul 20 16:56 0 -> /dev/null
lrwx------ 1 root root 64 Jul 20 16:56 1 -> /dev/null
l-wx------ 1 root root 64 Jul 20 16:56 2 -> /usr/local/php/var/log/php-fpm.log
l-wx------ 1 root root 64 Jul 20 16:56 3 -> /usr/local/php/var/log/php-fpm.log
lrwx------ 1 root root 64 Jul 20 16:56 4 -> socket:[64487945]
lrwx------ 1 root root 64 Jul 20 16:56 6 -> socket:[64487946]
lrwx------ 1 root root 64 Jul 20 16:56 7 -> socket:[64487487]
lrwx------ 1 root root 64 Jul 20 16:56 8 -> anon_inode:[eventpoll]
[root@izwz97ww79qca7m2kxb6hqz ~]# ll /proc/28770/exe //程式2877程式連結
lrwxrwxrwx 1 root root 0 Jul 20 16:55 /proc/28770/exe -> /usr/local/php/sbin/php-fpm

strace的使用

監控使用者空間程式和核心的互動,比如系統呼叫、訊號傳遞、程式狀態變更等。 簡單來說就是顯示程式中所有的系統呼叫。顯示的是系統呼叫函式,引數,返回結果,所以要熟悉linux的系統呼叫函式。

linux系統呼叫

檔案和裝置訪問類 比如open/close/read/write/chmod等
程式管理類 fork/clone/execve/exit/getpid等
訊號類 signal/sigaction/kill 等
記憶體管理 brk/mmap/mlock等
程式間通訊IPC shmget/semget * 訊號量,共享記憶體,訊息佇列等
網路通訊 socket/connect/sendto/sendmsg 等
其他

strace command 直接加上命令

strace php index.php //追蹤index.php指令碼執行

strace -p pid 動態追蹤正在執行的程式

strace -p 28770 //每秒鐘檢測程式的系統呼叫資訊

strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
-tt 在每行輸出的前面,顯示毫秒級別的時間
-T 顯示每次系統呼叫所花費的時間
-v 對於某些相關呼叫,把完整的環境變數,檔案stat結構等打出來。
-f 跟蹤目標程式,以及目標程式建立的所有子程式
-e 控制要跟蹤的事件和跟蹤行為,比如指定要跟蹤的系統呼叫名稱
-o 把strace的輸出單獨寫到指定的檔案
-s 當系統呼叫的某個引數是字串時,最多輸出指定長度的內容,預設是32個位元組
-p 指定要跟蹤的程式pid, 要同時跟蹤多個pid, 重複多次-p選項即可。
​
-e trace=file     跟蹤和檔案訪問相關的呼叫(引數中有檔名)
-e trace=process  和程式管理相關的呼叫,比如fork/exec/exit_group
-e trace=network  和網路通訊相關的呼叫,比如socket/sendto/connect
-e trace=signal    訊號傳送和處理相關,比如kill/sigaction
-e trace=desc  和檔案描述符相關,比如write/read/select/epoll等
-e trace=ipc 程式間通訊相關,比如shmget等

可以發現strace顯示出來,每一行都是一個系統呼叫,=左邊是傳參和系統函式,右邊是返回結果。

網路相關

tcpdump工具

linux.cn/article-3967-1-qqmail.htm...

指定埠

tcpdump port 80

指定主機

  • 抓取所有經過 eth1,目的或源地址是 192.168.1.1 的網路資料
  • 源地址
  • 目的地址

指定網路卡

tcpdump -i eth0

指定協議

tcpdump -i eth0 ip
tcpdump -i eth0 tcp
tcpdump -i eth0 udp

解讀tcpdump返回的資訊

[root@izwz97ww79qca7m2kxb6hqz ~]# tcpdump port 80 and host 14.18.135.82
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
​
14:37:46.803400 IP 14.18.155.82.50365 > izwz97ww79qca7m2kxb6hqz.http: Flags [S], seq 1624071665, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
​
14:37:46.803466 IP izwz97ww79qca7m2kxb6hqz.http > 14.18.155.82.50365: Flags [S.], seq 2906330048, ack 1624071666, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
​
14:37:46.803626 IP 14.18.155.82.50364 > izwz97ww79qca7m2kxb6hqz.http: Flags [S], seq 2880783494, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
​
14:37:46.803642 IP izwz97ww79qca7m2kxb6hqz.http > 14.18.155.82.50364: Flags [S.], seq 3344087554, ack 2880783495, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
​
14:37:46.810872 IP 14.18.155.82.50364 > izwz97ww79qca7m2kxb6hqz.http: Flags [.], ack 1, win 16425, length 0 
​
14:37:46.811612 IP 14.18.155.82.50365 > izwz97ww79qca7m2kxb6hqz.http: Flags [.], ack 1, win 16698, length 0

14:37:46.803400 IP 14.18.155.82.50365 > izwz97ww79qca7m2kxb6hqz.http: Flags [S], seq 1624071665, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0

14:37:46.810872 :時間 時分秒毫秒
IP : 是IP包
14.18.155.82.50364 : 表示這個包的源IP為14.18.155.82,源埠為50364
“ > ” : 表示資料包的傳輸方向
izwz97ww79qca7m2kxb6hqz.http :主機名和埠
Flags:
[S]: SYN(開始連線)
[.]: 沒有 Flag
[P]: PSH(推送資料)
[F]: FIN (結束連線)
[R]: RST(重置連線)
win:滑動視窗大小為8192
mss 大小為1460(即可接收的最大包長度,通常為MTU減40位元組,IP頭和TCP頭各20位元組)

注意:三次握手中,SYN的引數seq=j, 對應的返回seq=i;ACK=j+1,但是第三次握手中,ACK=1,而不是i+1,主要原因是tcpdump簡化了顯示。真實的值還是i+1。如果要顯示絕對數值,加一個-S即可

SYN包會有個序列號seq=j,而應答這個SYN包,ack=j+1,對應的序列號加1;FIN包也是一樣,也有一個序列號seq.

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章