最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux使用strace和perf進(jìn)行進(jìn)程調(diào)試和性能分析的深度指南

 更新時間:2026年05月28日 08:53:28   作者:STDD  
strace 和 perf 是 Linux 系統(tǒng)性能診斷的兩把利刃:strace 追蹤進(jìn)程的系統(tǒng)調(diào)用,揭示進(jìn)程與內(nèi)核的每次交互;perf 是 Linux 內(nèi)核內(nèi)置的性能分析器,能夠捕獲 CPU 級別的性能事件,本文給大家介紹了Linux使用strace和perf進(jìn)行進(jìn)程調(diào)試和性能分析的深度指南

當(dāng)線上服務(wù)出現(xiàn)莫名的性能下降、神秘的"文件未找到"錯誤或奇怪的網(wǎng)絡(luò)超時,常規(guī)的日志分析往往無法給出答案。這時候需要深入內(nèi)核層面,觀察進(jìn)程的真實(shí)行為。

straceperf 是 Linux 系統(tǒng)性能診斷的兩把利刃:strace 追蹤進(jìn)程的系統(tǒng)調(diào)用,揭示進(jìn)程與內(nèi)核的每次交互;perf 是 Linux 內(nèi)核內(nèi)置的性能分析器,能夠捕獲 CPU 級別的性能事件,生成直觀的火焰圖。掌握這兩個工具,能夠解決 80% 以上的難以排查的線上問題。

服務(wù)器配置

straceperf 是通用的 Linux 診斷工具,適用于任意服務(wù)器。推薦使用 雨云服務(wù)器 rainyun-com 的2 核 4GB 機(jī)型 作為學(xué)習(xí)和實(shí)驗(yàn)環(huán)境,注冊填優(yōu)惠碼 2026off 領(lǐng) 5 折,以最低成本掌握 Linux 性能分析技能。

本文環(huán)境:

  • 操作系統(tǒng):Ubuntu 22.04 LTS(內(nèi)核 5.15+)
  • strace:5.16
  • perf:5.15(隨內(nèi)核版本提供)

安裝工具

安裝 strace

Ubuntu/Debian:

apt install strace -y
strace --version
# strace -- version 5.16

安裝 perf

perf 工具與內(nèi)核版本綁定,需要安裝對應(yīng)版本:

# 查看內(nèi)核版本
uname -r
# 例如:5.15.0-106-generic

# 安裝對應(yīng)版本的 perf
apt install linux-tools-$(uname -r) linux-tools-generic -y

# 驗(yàn)證安裝
perf --version
# perf version 5.15.168

如果出現(xiàn) “WARNING: perf not found for kernel” 錯誤,說明內(nèi)核版本對應(yīng)的包不在倉庫中,可以使用通用包:

apt install linux-tools-generic -y

strace 基礎(chǔ):追蹤系統(tǒng)調(diào)用

基本用法

追蹤一個命令的所有系統(tǒng)調(diào)用:

strace ls /tmp

輸出中每行是一次系統(tǒng)調(diào)用,格式為:

syscall_name(args...) = return_value
execve("/usr/bin/ls", ["ls", "/tmp"], ...) = 0
brk(NULL)                               = 0x5610a8c3b000
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...

附加到運(yùn)行中的進(jìn)程

# 獲取進(jìn)程 PID
pgrep nginx
# 例如:1234

# 附加追蹤
strace -p 1234

過濾特定類別的系統(tǒng)調(diào)用

# 只追蹤網(wǎng)絡(luò)相關(guān)系統(tǒng)調(diào)用
strace -e trace=network nginx

# 只追蹤文件 I/O
strace -e trace=open,read,write,close -p 1234

# 追蹤進(jìn)程與文件系統(tǒng)的交互
strace -e trace=file -p 1234

常用過濾類別:

  • network:socket、connect、send、recv 等
  • file:open、read、write、stat 等
  • process:fork、exec、exit 等
  • memory:mmap、brk、munmap 等
  • signal:kill、sigaction 等

實(shí)戰(zhàn)一:診斷"文件未找到"錯誤

應(yīng)用報告無法找到配置文件,但文件明明存在。使用 strace 追蹤文件打開操作:

strace -e trace=openat,stat -p $(pgrep my-app) 2>&1 | grep -E "(ENOENT|config)"

典型輸出:

openat(AT_FDCWD, "/etc/my-app/config.yaml", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/app/.config/my-app.yaml", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/etc/my-app.yaml", O_RDONLY) = 5

從輸出可以清晰看出:進(jìn)程按順序查找多個路徑,前兩個返回 ENOENT,第三個成功。如果三個都失敗,就能知道應(yīng)用實(shí)際在哪些路徑尋找配置文件,而不是猜測。

實(shí)戰(zhàn)二:調(diào)試網(wǎng)絡(luò)連接超時

服務(wù)偶發(fā)性地?zé)o法連接數(shù)據(jù)庫,使用 strace 分析網(wǎng)絡(luò)行為:

# -T 顯示每次系統(tǒng)調(diào)用的耗時
strace -T -e trace=network -p $(pgrep my-service) 2>&1 | grep -E "(connect|poll|select)"

輸出:

connect(5, {sa_family=AF_INET, sin_port=htons(5432), sin_addr=inet_addr("10.0.0.5")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=5, events=POLLOUT|POLLERR}], 1, 5000) = 0 (Timeout) <5.000342>

poll 返回 0 (Timeout) 且耗時 5 秒,說明連接超時。結(jié)合 connect 顯示的目標(biāo) IP 和端口,可以確認(rèn)是否網(wǎng)絡(luò)路由或防火墻問題。

實(shí)戰(zhàn)三:統(tǒng)計系統(tǒng)調(diào)用熱點(diǎn)

分析某個進(jìn)程在 30 秒內(nèi)最頻繁調(diào)用的系統(tǒng)調(diào)用:

# -c 統(tǒng)計系統(tǒng)調(diào)用次數(shù),-p 附加進(jìn)程
timeout 30 strace -c -p $(pgrep nginx) 2>&1

輸出:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 45.23    0.234567           5     46914           epoll_wait
 25.11    0.130234           4     32558     156    read
 18.45    0.095672           3     31891           write
  8.32    0.043156          12      3596           sendfile
...

epoll_wait 占 45% 的時間是正常的(Nginx 事件循環(huán)),但如果 futex(鎖等待)或 nanosleep(主動等待)占比過高,則說明程序存在競爭或輪詢問題。

perf 基礎(chǔ):硬件性能計數(shù)器

perf stat:分析 CPU 效率

# 分析運(yùn)行命令的性能計數(shù)器
perf stat ls /tmp

# 附加到運(yùn)行中的進(jìn)程(收集 10 秒)
perf stat -p $(pgrep nginx) sleep 10

輸出:

 Performance counter stats for process id '1234':

      10,234.56 msec task-clock                #    1.000 CPUs utilized
             45      context-switches          #    4.398 /sec
              8      cpu-migrations            #    0.781 /sec
            234      page-faults               #   22.863 /sec
 28,456,789,012      cycles                    #    2.781 GHz
 18,234,567,890      instructions              #    0.64  insn per cycle
    456,789,012      branches                  #   44.635 M/sec
     12,345,678      branch-misses             #    2.70% of all branches

關(guān)鍵指標(biāo)解讀:

  • insn per cycle(IPC):每時鐘周期執(zhí)行的指令數(shù)。低于 1.0 說明存在大量等待(緩存缺失、分支預(yù)測失敗等)
  • branch-misses:分支預(yù)測失誤率,超過 5% 需要關(guān)注
  • cache-misses:添加 -e cache-references,cache-misses 查看緩存命中率

perf top:實(shí)時 CPU 熱點(diǎn)

# 查看全系統(tǒng)的 CPU 熱點(diǎn)函數(shù)(類似 htop 但到函數(shù)級別)
perf top

# 只關(guān)注特定進(jìn)程
perf top -p $(pgrep nginx)

輸出類似:

Samples: 50K of event 'cpu-cycles', 4000 Hz, Event count
Overhead  Shared Object           Symbol
  18.23%  nginx                   [.] ngx_http_process_request
  12.45%  libc-2.35.so            [.] __memcpy_avx_unaligned
   8.91%  nginx                   [.] ngx_regex_exec
   6.78%  [kernel]                [k] copy_user_generic_string

Overhead 列顯示函數(shù)占總 CPU 時間的百分比,可快速定位性能熱點(diǎn)函數(shù)。

實(shí)戰(zhàn)四:perf record 生成調(diào)用圖

perf top 只能看到單個函數(shù),無法知道調(diào)用鏈。使用 perf record 錄制帶調(diào)用圖的性能數(shù)據(jù):

# 錄制 30 秒的調(diào)用圖(-g 啟用 call graph)
perf record -g -p $(pgrep my-service) sleep 30

# 生成報告
perf report --call-graph=graph

交互式報告中可以展開調(diào)用鏈,查看函數(shù)的調(diào)用者和被調(diào)用者。

實(shí)戰(zhàn)五:生成火焰圖(Flame Graph)

火焰圖由 Brendan Gregg 發(fā)明,是可視化 CPU 性能熱點(diǎn)的最佳工具。X 軸表示 CPU 時間占比,Y 軸表示調(diào)用棧深度。

步驟一:安裝 FlameGraph 工具

git clone https://github.com/brendangregg/FlameGraph.git /opt/flamegraph

步驟二:錄制性能數(shù)據(jù)

# 錄制 60 秒,采樣頻率 99Hz
perf record -F 99 -g -p $(pgrep my-service) sleep 60

步驟三:生成火焰圖

# 將 perf.data 轉(zhuǎn)換為折疊格式
perf script | /opt/flamegraph/stackcollapse-perf.pl > out.folded

# 生成 SVG 火焰圖
/opt/flamegraph/flamegraph.pl out.folded > flamegraph.svg

步驟四:下載并查看

# 用 scp 下載到本地(在本地終端執(zhí)行)
scp root@server-ip:/root/flamegraph.svg ~/Desktop/

# 用瀏覽器打開 SVG 文件,可以點(diǎn)擊放大

解讀火焰圖

  • 寬塊:CPU 時間集中的函數(shù),是優(yōu)化重點(diǎn)
  • 平頂:表示該函數(shù)本身消耗大量 CPU(非其調(diào)用的子函數(shù))
  • 高塔:深層調(diào)用棧,通常是遞歸或復(fù)雜庫調(diào)用
  • 顏色:隨機(jī)分配,沒有特別含義(紅/黃不代表問題)

perf sched:分析調(diào)度延遲

系統(tǒng)響應(yīng)延遲但 CPU 利用率不高?可能是調(diào)度延遲問題:

# 錄制調(diào)度事件
perf sched record sleep 10

# 生成延遲報告
perf sched latency

輸出會顯示各任務(wù)的最大調(diào)度延遲和平均延遲,幫助識別 RT 任務(wù)或 I/O 密集型任務(wù)導(dǎo)致的調(diào)度不公平問題。

strace 與 perf 的使用場景對比

場景推薦工具原因
文件找不到strace追蹤 openat 系統(tǒng)調(diào)用
網(wǎng)絡(luò)連接失敗strace追蹤 connect/poll 行為
CPU 使用率高perf top + 火焰圖定位熱點(diǎn)函數(shù)
響應(yīng)延遲高但 CPU 不高strace -T + perf sched找出耗時的系統(tǒng)調(diào)用或調(diào)度延遲
緩存命中率低perf stat查看硬件緩存計數(shù)器

straceperf 是每位 Linux 工程師必須掌握的核心工具。strace 讓你看到進(jìn)程與內(nèi)核的每次對話,解決"為什么失敗"的問題;perf 和火焰圖讓你看到 CPU 時間的分布,解決"為什么慢"的問題。兩者結(jié)合,幾乎沒有無法排查的性能問題。

以上就是Linux使用strace和perf進(jìn)行進(jìn)程調(diào)試和性能分析的深度指南的詳細(xì)內(nèi)容,更多關(guān)于Linux strace和perf進(jìn)程調(diào)試和性能分析的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Ubuntu14.04安裝、配置與卸載QT5的步驟詳解

    Ubuntu14.04安裝、配置與卸載QT5的步驟詳解

    這篇文章主要介紹了Ubuntu14.04安裝、配置與卸載QT5詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • centos6超20TB磁盤的分區(qū)格式化的示例代碼

    centos6超20TB磁盤的分區(qū)格式化的示例代碼

    這篇文章主要介紹了centos6超20TB磁盤的分區(qū)格式化的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Linux磁盤空間占用率100%的排查方法

    Linux磁盤空間占用率100%的排查方法

    使用 Linux 操作系統(tǒng)時,可能會遇到磁盤空間不足的錯誤,這種錯誤通常會導(dǎo)致系統(tǒng)運(yùn)行緩慢或崩潰,本文將介紹磁盤排查的方法,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Ubuntu環(huán)境下使用G++編譯CPP文件

    Ubuntu環(huán)境下使用G++編譯CPP文件

    今天小編就為大家分享一篇關(guān)于Ubuntu環(huán)境下使用G++編譯CPP文件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Apache偽靜態(tài)Rewrite詳解

    Apache偽靜態(tài)Rewrite詳解

    這篇文章主要介紹了Apache偽靜態(tài)Rewrite的相關(guān)知識以及使用方法和使用實(shí)例,需要的朋友可以參考下
    2014-03-03
  • Linux下正確快速刪除海量文件的方法分享

    Linux下正確快速刪除海量文件的方法分享

    linux服務(wù)器運(yùn)行久了,可能會出現(xiàn)海量的垃圾文件去刪除,下面這篇文章就給大家分享了在Linux下正確快速刪除海量文件的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • 安全檢測Unix和Linux服務(wù)器安全設(shè)置入門精講

    安全檢測Unix和Linux服務(wù)器安全設(shè)置入門精講

    盡管為服務(wù)器設(shè)計軟件的軟件工程師們想方設(shè)法提高系統(tǒng)的安全性,然而由于系統(tǒng)管理員的水平參差不齊或安全意識底下,往往給黑客提供了入侵的機(jī)會。
    2008-05-05
  • Linux進(jìn)程間通信(IPC)的幾種方式總結(jié)

    Linux進(jìn)程間通信(IPC)的幾種方式總結(jié)

    進(jìn)程間通信是指至少兩個進(jìn)程或線程間傳送數(shù)據(jù)或信號的一些技術(shù)或方法,每個進(jìn)程都有自己的一部分獨(dú)立的系統(tǒng)資源,彼此是隔離的,為了能使不同的進(jìn)程互相訪問資源并進(jìn)行協(xié)調(diào)工作,才有了進(jìn)程間通信,本文就給大家介紹幾種Linux進(jìn)程間通信的方式,需要的朋友可以參考下
    2023-09-09
  • Linux編輯器之vim使用詳解

    Linux編輯器之vim使用詳解

    介紹Linuxyum軟件包管理器的安裝、更新、刪除、搜索及緩存清理命令,詳解vim的三種模式(普通/插入/末行)操作技巧,包括光標(biāo)移動、文本編輯、保存退出等,并提及配置文件的使用方法
    2025-09-09
  • Linux特殊變量與路徑使用及說明

    Linux特殊變量與路徑使用及說明

    這篇文章主要介紹了Linux特殊變量與路徑使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-11-11

最新評論

滕州市| 伊金霍洛旗| 耒阳市| 武汉市| 金川县| 昌黎县| 巴东县| 侯马市| 永德县| 正安县| 永仁县| 常德市| 阳高县| 廉江市| 蕲春县| 高雄市| 梁山县| 横山县| 河南省| 陈巴尔虎旗| 尚义县| 山阴县| 宾川县| 同德县| 剑河县| 科尔| 天气| 甘肃省| 三门县| 朔州市| 驻马店市| 乌兰浩特市| 鄢陵县| 叶城县| 屯门区| 宜兰市| 枣强县| 上思县| 肥城市| 青冈县| 儋州市|