一,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)
