centos8平台使用strace跟蹤系統調用


一,strace的用途

strace  是最常用的跟蹤進程系統調用的工具。

 

說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest

         對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/

 說明:作者:劉宏締 郵箱: 371125307@qq.com

 

二,查看strace所屬的包及安裝

1,strace所屬的包

[root@blog ~]# whereis strace
strace: /usr/bin/strace /usr/share/man/man1/strace.1.gz

[root@blog ~]# rpm -qf /usr/bin/strace
strace-4.24-5.el8.x86_64

 

2,如果找不到strace命令,可以使用yum安裝

[root@blog ~]# yum install strace   

 

三,查看strace的版本和幫助

1,查看版本

[root@blog ~]# strace -V
strace -- version 4.24
Copyright (c) 1991-2018 The strace developers <https://strace.io>.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Optional features enabled: stack-trace=libdw stack-demangle m32-mpers mx32-mpers

 

2,查看幫助

[root@blog ~]# strace -h 

 

四,strace常用參數

 

# -f表示跟蹤由fork調用所產生的子進程和子線程

# -T 顯示每一次調用所耗的時間長

# -t 在輸出中的每一行前加上時間信息. 

# -tt表示顯示跟蹤時間, 微秒級別的時間戳

# -e 展示特定的系統調用(例如,open,write等等)

# -o 把strace命令的輸出結果保存到指定的文件中

# -r 系統調用之間的相對時間戳

# -c 統計每一系統調用的所執行的時間,次數和出錯的次數等

 

五,strace的應用例子:

1,追蹤指定pid的進程:

# -p : 指定進程的pid

[root@blog ~]# strace -p 7491

 

2,追蹤一個進程時加上線程:

# -f表示跟蹤子進程和子線程

#-T表示顯示系統調用的時長,

#-tt表示顯示跟蹤時間

[root@blog ~]# strace -f -T -tt -p 8240 

說明:調用的時長:顯示為形如:<0.059084>

單位是秒,精確到微秒級別

 

3,只追蹤指定的操作:

# -f表示跟蹤子進程和子線程

#-T表示顯示系統調用的時長,

#-tt表示顯示跟蹤時間

#-e 指定特定的系統調用

[root@blog ~]# strace -f -p 8240 -T -tt -e fdatasync

 

4,追蹤一個指定命令的執行

[root@blog ~]# strace ls

 

5,把跟蹤結果保存到指定的文件中

#-o  指定輸出文件的路徑

[root@blog ~]# strace -p 8240 -o /data/logs/stra_ls.txt

 

6,輸出系統調用的統計結果,即每個命令的占比

[root@blog ~]# strace -p 8240 -c
strace: Process 8240 attached
strace: Process 8240 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 30.22    0.000679           4       143        72 read
 26.57    0.000597           8        71           openat
 24.25    0.000545           7        71           epoll_wait
 10.81    0.000243           3        71           close
  8.14    0.000183           2        71           getpid
------ ----------- ----------- --------- --------- ----------------
100.00    0.002247                   427        72 total

 

六,-e參數trace的常用例子:

 

-e trace=ipc 進程見同學相關,比如shmget等

-e trace=set 只跟蹤指定的系統 調用.例如:-e trace=open. 

-e trace=desc  和文件描述符相關,比如write/read/select/epoll等    

-e trace=file 只跟蹤有關文件操作的系統調用.    

-e trace=process 只跟蹤有關進程控制的系統調用.   

 -e trace=network 跟蹤與網絡有關的所有系統調用.    

-e trace=signal 跟蹤所有與系統信號有關的 系統調用    

-e trace=ipc 跟蹤所有與進程通訊有關的系統調用    

 

例:跟蹤與網絡有關的系統調用

[root@blog ~]# strace -Te trace=network curl

 

七,strace結果中的常見分析

1,如果應用打開分區時使用O_DIRECT,O_DIRECT 表示以直接讀取的方式打開,這會繞過系統的緩存。

    直接從磁盤讀寫的速度,自然遠慢於對緩存的讀寫。會導致速度變慢

2,write(3, "2018-12-05 15:23:01,709 - __main"..., 314572844 

) = 314572844 

表示進程向文件描述符編號為 3 的文件中,寫入了 300MB 的數據

3,write 或者 fdatasync都屬於對磁盤的寫操作

 

 八,查看centos的版本: 

[root@blog ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM