一次 Linux 高負載 (Load) 異常問題排查實錄

一次 Linux 高負載(Load)異常排查實錄

    • 一、背景及排查過程材料
    • 二、排查分析
      • 2.1Load 的真正含義
      • 2.2:確認異常進程
      • 2.3:線程卡在哪(wchan)
      • 2.4:perf 采樣(用戶態/內核態熱點)
      • 2.5:熱點文件路徑(誰在被頻繁訪問)
      • 2.6:打開文件數(以 /proc 為準)
      • 2.7:火焰圖分析(生成 + 示意圖)
      • 2.8:結論(本次事件)
      • 2.9:優化建議(可落地)
      • A. 線程狀態與等待點巡檢(watch)
      • B. 確認 lookup_slow 與 fstatat 熱點路徑
      • C. 進程級路徑熱點統計(openat/fstatat)
      • D. 聚焦前 N 個 lookup_slow 線程(內核棧 + 快速 syscalls)
    • 三、本次排查總結

一、背景及排查過程材料

  • 生產環境一臺 64 核 Linux 服務器,load5 突然飆升至 500+。
  • 通過 top 觀察,CPU idle 仍約 90%,CPU 未被打滿。
  • 自動化告警展示異常節點的 top5 進程,定位到 backend 組件。

疑問:CPU 很閑,為何 Load 還在飆升?


在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

[root@kyserver-xxxx ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                64
On-line CPU(s) list:   0-63
Thread(s) per core:    2
Core(s) per socket:    16
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 85
Model name:            Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
Stepping:              7
CPU MHz:               2300.000
BogoMIPS:              4600.00
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
L3 cache:              22528K
NUMA node0 CPU(s):     0-15,32-47
NUMA node1 CPU(s):     16-31,48-63
[root@kyserver-xxxxx ~]# free  -gtotal        used        free      shared  buff/cache   available
Mem:            251          41          53           3         156          75
Swap:             0           0           0

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述


# 卡在 lookup_slow → link_path_walk → path_lookupat → vfs_fstatat
[root@kyserver-21-024 mmwei3]# ./top_thread.sh 36334 5 10
=== 2025-09-03 09:59:52 ===
進程 36334, 抓取前 5 個 lookup_slow 線程>>> 線程 TID=36343 內核調用棧 (/proc/36343/stack):
[<ffffffff816a1313>] lookup_slow+0x33/0xa7
[<ffffffff8120e9cf>] link_path_walk+0x80f/0x8b0
[<ffffffff8120ebcb>] path_lookupat+0x6b/0x7b0
[<ffffffff8120f33b>] filename_lookup+0x2b/0xc0
[<ffffffff81212e47>] user_path_at_empty+0x67/0xc0
[<ffffffff81212eb1>] user_path_at+0x11/0x20
[<ffffffff81206463>] vfs_fstatat+0x63/0xc0
[<ffffffff81206a84>] SYSC_newfstatat+0x24/0x60
[<ffffffff81206cce>] SyS_newfstatat+0xe/0x10
[<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff>>> 線程 TID=36343 strace 抓取 10s:
strace: Process 36343 attached with 586 threads
[pid 63559] futex(0xc015e21948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43629] futex(0xc01d484148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37798] futex(0xc017812148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37791] futex(0xc015a16148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37790] futex(0xc01570f148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37786] futex(0xc015492948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37783] futex(0xc01570e948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37779] futex(0xc015b12148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37758] futex(0xc01519a148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37753] futex(0xc014f84148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37749] futex(0xc010d6c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37682] futex(0xc0167ec148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37679] futex(0xc015748148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37672] futex(0xc016f06148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37670] futex(0xc0166f4148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37667] futex(0xc016616148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37661] futex(0xc016704148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37660] futex(0xc016ab2148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37653] futex(0xc0168c4148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>>>> 線程 TID=36344 內核調用棧 (/proc/36344/stack):
[<ffffffff810f5126>] futex_wait_queue_me+0xc6/0x130
[<ffffffff810f5deb>] futex_wait+0x17b/0x280
[<ffffffff810f7b26>] do_futex+0x106/0x5a0
[<ffffffff810f8040>] SyS_futex+0x80/0x180
[<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff>>> 線程 TID=36344 strace 抓取 10s:
strace: Process 36344 attached with 586 threads
[pid 200441] futex(0xc04501c948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 200440] futex(0xc04501c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 200439] futex(0xc00e47d948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 87025] futex(0xc016f80948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 85361] futex(0xc00d049948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 85360] futex(0xc015e3c948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 63559] futex(0xc015e21948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 45979] futex(0xc00e2a6148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 44863] futex(0xc02f980148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43635] futex(0xc01bce6148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43634] futex(0xc01dfea148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43633] futex(0xc028984148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43632] futex(0xc028540148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43631] restart_syscall(<... resuming interrupted futex ...> <unfinished ...>
[pid 43630] futex(0xc01c98a148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43629] futex(0xc01d484148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 38629] futex(0xc017472148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 38628] futex(0xc01810c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37808] futex(0xc01532c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>>>> 線程 TID=36345 內核調用棧 (/proc/36345/stack):
[<ffffffff810f5126>] futex_wait_queue_me+0xc6/0x130
[<ffffffff810f5deb>] futex_wait+0x17b/0x280
[<ffffffff810f7b26>] do_futex+0x106/0x5a0
[<ffffffff810f8040>] SyS_futex+0x80/0x180
[<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff>>> 線程 TID=36345 strace 抓取 10s:
strace: Process 36345 attached with 586 threads
[pid 200441] futex(0xc04501c948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 200440] futex(0xc04501c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 200439] futex(0xc00e47d948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 87025] futex(0xc016f80948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 85361] futex(0xc00d049948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 85360] futex(0xc015e3c948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 63559] futex(0xc015e21948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 45979] futex(0xc00e2a6148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 44863] futex(0xc02f980148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43635] futex(0xc01bce6148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43634] futex(0xc01dfea148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43633] futex(0xc028984148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43632] futex(0xc028540148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43631] futex(0xc01b9ee148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43630] futex(0xc01c98a148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43629] futex(0xc01d484148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 38629] futex(0xc017472148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 38628] futex(0xc01810c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 37808] futex(0xc01532c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>>>> 線程 TID=36354 內核調用棧 (/proc/36354/stack):
[<ffffffff810f5126>] futex_wait_queue_me+0xc6/0x130
[<ffffffff810f5deb>] futex_wait+0x17b/0x280
[<ffffffff810f7b26>] do_futex+0x106/0x5a0
[<ffffffff810f8040>] SyS_futex+0x80/0x180
[<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff>>> 線程 TID=36354 strace 抓取 10s:
strace: Process 36354 attached with 586 threads
[pid 200441] getsockname(910,  <unfinished ...>
[pid 200440] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP <unfinished ...>
[pid 200439] futex(0xc00e47dd28, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 87025] futex(0xc016f80948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 85361] openat(AT_FDCWD, "/proc/36334/fd", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 85360] write(864, "+\1\0\0\33\377\267\1\0\0\0\0\335\7\0\0\0\0\1\0\0\26\1\0\0\20hello\0\1\0\0\0\10helloOk\0\1\3topologyVersion\0-\0\0\0\7processId\0f\341M\f \357\266\300\241qi\244\22counter\0\23\0\0\0\0\0\0\0\0\22maxAwaitTimeMS\0\20'\0\0\0\0\0\0\3$clusterTime\0X\0\0\0\21clusterTime\0\2\0\0\0\217\241\267h\3signature\0003\0\0\0\5hash\0\24\0\0\0\0\230\36\262"..., 299 <unfinished ...>
[pid 63559] read(667,  <unfinished ...>
[pid 45979] accept4(267,  <unfinished ...>
[pid 44863] futex(0xc02f980148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43633] write(45, "{\"level\":\"debug\",\"time\":\"2025-09-03 10:01:52.105\",\"caller\":\"imp/imp_mysql.go:659\",\"msg\":\"sql: SELECT dls_task_status.user_id,dls_task_status.sid,\\n\\tdls_task_status.task_name,dls_task_status.status,dl"..., 550 <unfinished ...>
[pid 43632] read(556,  <unfinished ...>
[pid 43630] futex(0xc01c98a148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 38629] openat(AT_FDCWD, "/proc/36334/fd", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 38628] read(559,  <unfinished ...>
[pid 37807] futex(0xc016bb6528, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 37806] futex(0xc011f74528, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 37805] read(157,  <unfinished ...>
[pid 37797] write(860, "+\1\0\0\34\377\267\1\0\0\0\0\335\7\0\0\0\0\1\0\0\26\1\0\0\20hello\0\1\0\0\0\10helloOk\0\1\3topologyVersion\0-\0\0\0\7processId\0eU\232\350N5\317\224dy\7\23\22counter\0\35\0\0\0\0\0\0\0\0\22maxAwaitTimeMS\0\20'\0\0\0\0\0\0\3$clusterTime\0X\0\0\0\21clusterTime\0\2\0\0\0\217\241\267h\3signature\0003\0\0\0\5hash\0\24\0\0\0\0\230\36\262"..., 299 <unfinished ...>
[pid 37796] futex(0xc016584948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>>>> 線程 TID=36355 內核調用棧 (/proc/36355/stack):
[<ffffffff810f5126>] futex_wait_queue_me+0xc6/0x130
[<ffffffff810f5deb>] futex_wait+0x17b/0x280
[<ffffffff810f7b26>] do_futex+0x106/0x5a0
[<ffffffff810f8040>] SyS_futex+0x80/0x180
[<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff>>> 線程 TID=36355 strace 抓取 10s:
strace: Process 36355 attached with 586 threads
[pid 200441] read(1128,  <unfinished ...>
[pid 200440] futex(0xc04501c148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 200439] futex(0xc00e47dd28, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 85361] futex(0xc00d049948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 45979] read(1405,  <unfinished ...>
[pid 44863] read(1062,  <unfinished ...>
[pid 43634] futex(0xc01dfea148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 43633] write(996, "\1\0\0\0\1", 5 <unfinished ...>
[pid 43630] futex(0xc01c98a528, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 43629] write(1053, "\1\0\0\0\1", 5 <unfinished ...>
[pid 38629] read(1406,  <unfinished ...>
[pid 38628] write(949, "\1\0\0\0\1", 5 <unfinished ...>
[pid 37808] read(927,  <unfinished ...>
[pid 37807] read(1252,  <unfinished ...>
[pid 37806] futex(0xc011f74528, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 37805] epoll_pwait(4,  <unfinished ...>
[pid 37804] futex(0xc01688e528, FUTEX_WAIT_PRIVATE, 4294967295, NULL <unfinished ...>
[pid 37798] epoll_pwait(4,  <unfinished ...>
[pid 37797] epoll_pwait(4,  <unfinished ...>

二、排查分析

2.1Load 的真正含義

  • Linux 的 loadavg 表示:
    • 可運行隊列(R 狀態)中的進程/線程數;
    • 不可中斷等待(D 狀態,IO/鎖等待)中的進程/線程數。
  • 關鍵認知:
    • CPU 忙 → R 多 → Load 高;
    • IO/鎖等待嚴重 → D 多 → Load 同樣高,即使 CPU 很閑。

補充定義(便于閱讀):

- R(Running/Runable):可運行隊列,等 CPU 或正在執行
- D(Uninterruptible sleep):不可中斷等待,多見于 IO 與鎖
- S(Sleeping):可中斷睡眠
- futex(Fast Userspace Mutex):用戶態互斥鎖,競爭/等待會進入內核等待點

2.2:確認異常進程

查看線程數:

ps -eLf | grep 36334 | wc -l

結果:

586

統計線程狀態:

ps -eLf | awk '{print $2,$3,$5}' | sort | uniq -c | grep 36334

輸出:

586 Sl

含義:backend 進程有 586 個線程,大多數處于輕度睡眠(Sl),并非瘋狂跑 CPU。


2.3:線程卡在哪(wchan)

查看線程等待點:

ps -eLo pid,tid,state,wchan:32,cmd | grep 36334 | awk '{print $4}' | sort | uniq -c | sort -nr | head

結果:

581 futex_wait_queue_me2 ep_poll1 hrtimer_nanosleep

👉 絕大多數線程卡在 futex_wait_queue_me,典型的“等鎖”。


2.4:perf 采樣(用戶態/內核態熱點)

對進程進行熱點采樣:

perf top -p 36334

輸出熱點(片段):

55.83%  backend   [.] runtime.(*stkframe).getStackMap
15.95%  [kernel]  [k] down_read_trylock
15.95%  [kernel]  [k] osq_lock
12.22%  backend   [.] runtime.greyobject

分析:

  • 用戶態熱點集中在 Go GC 路徑(runtime.*);
  • 內核態熱點集中在鎖(down_read_trylock / osq_lock)。

若需要低風險取樣并生成火焰圖,見下文“Step 7:火焰圖分析”。


2.5:熱點文件路徑(誰在被頻繁訪問)

統計進程 FD 指向的熱點路徑:

ls -l /proc/36334/fd | awk '{print $NF}' | sort | uniq -c | sort -nr | head

結果(片段):

5129 config.toml
5113 ./ky_backend.log90 /train28/cog8/permanent/jingye1117 ./backend.log12 /opt/dls_cli/config_3000p

解讀:頻繁訪問配置文件與日志文件;部分路徑位于分布式存儲(/train28/...),更易導致 IO 延遲抖動。


2.6:打開文件數(以 /proc 為準)

精確統計(基于 /proc):

ls /proc/36334/fd | wc -l

輸出:

803

lsof 統計(會放大):

lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -5

輸出:

472667 36334

👉 lsof 默認按線程展開,存在重復統計。準確數字應以 /proc/<pid>/fd 為準。


2.7:火焰圖分析(生成 + 示意圖)

低風險采樣生成火焰圖:

# 1) 錄制 30 秒的采樣(49Hz,抓取調用棧)
perf record -F 49 -p 36334 -g -- sleep 30# 2) 將 perf 數據折疊為火焰圖輸入
perf script | ./FlameGraph/stackcollapse-perf.pl > out.folded# 3) 生成火焰圖 SVG
./FlameGraph/flamegraph.pl out.folded > flame.svg

權限與環境注意:

# 若提示權限不足,可臨時放寬(root 執行):
sysctl -w kernel.perf_event_paranoid=-1
sysctl -w kernel.kptr_restrict=0# 或通過 /proc 接口(臨時):
echo -1 > /proc/sys/kernel/perf_event_paranoid
echo 0  > /proc/sys/kernel/kptr_restrict

火焰圖 ASCII 示意(僅結構參考):

^ 棧深度(越上層越深)
|
|             ██████████████ runtime.greyobject
|             ████████       runtime.gcDrain
|        ████ ████████       runtime.scanobject
|   ████ ████ ████████       futex_wait_queue_me
|   ████ ████ ████████       osq_lock
+----------------------------------------------> 采樣時間占比(越長越寬)結論:
- 用戶態:GC 相關路徑明顯(runtime.* 系列)。
- 內核態:futex/鎖等待顯著(`futex_wait_queue_me`、`osq_lock`)。

2.8:結論(本次事件)

  1. backend 進程開啟 ~586 個線程;
  2. 大量線程阻塞在 futex_wait_queue_me(鎖等待);
  3. 程序頻繁進行 openat/fstatat(配置 + 日志 + 分布式存儲路徑);
  4. 分布式存儲響應慢,線程堆積,GC 活躍加劇鎖競爭;
  5. 導致 load5 飆升至 500+,但 CPU idle 仍然很高。

2.9:優化建議(可落地)

  • 減少頻繁文件 IO:

    • 對配置文件做緩存(內存+變更訂閱或定期校驗),避免每次請求都 stat/open
    • 日志改為異步寫/批量 flush,控制日志級別與切分策略,避免熱日志放大;
    • 合理合并小文件訪問,盡量減少路徑解析與權限校驗次數。
  • 檢查與隔離存儲性能:

    • 對分布式存儲掛載路徑做延遲/帶寬基線評估與報警(fio/oss 工具);
    • 關鍵小文件下沉本地緩存(鏡像內置或啟動時下發),減少遠端抖動影響;
    • IO 讀多寫少場景,優先本地讀,異步刷新遠端。
  • 線程池與鎖競爭控制:

    • 限制線程池上限與排隊策略,避免“線程海”在 IO 上等待;
    • 細化臨界區,拆大鎖或使用 RWLock/無鎖結構,降低 futex 沖突;
    • 避免在高并發路徑上持有全局共享資源(如全局 logger)的長臨界區。
  • Go GC 調優(針對 Go 服務):

    • 打開 GC trace:
      GODEBUG=gctrace=1 ./backend
      
    • 評估 GOGC(目標堆增長百分比),減少短生命周期對象分配,復用緩沖;
    • 避免在 GC 敏感區內進行大量阻塞 IO。

A. 線程狀態與等待點巡檢(watch)

# check_thread.sh
#!/bin/bash
# 用法: ./check_thread.sh <pid> [interval]
# 默認間隔 1 秒,實時統計線程狀態與前10個 wchanPID=$1
INTERVAL=${2:-1}if [ -z "$PID" ]; thenecho "用法: $0 <pid> [interval]"exit 1
fiwhile true; doclearecho "=== $(date '+%F %T') ==="echo "進程 $PID 的線程狀態統計:"ps -eLo pid,tid,stat,wchan:20,comm | awk -v pid=$PID '$1==pid {print $3}' | sort | uniq -c | sort -nrechoecho "前10個等待點 (wchan):"ps -eLo pid,tid,stat,wchan:20,comm | awk -v pid=$PID '$1==pid {print $4}' | sort | uniq -c | sort -nr | head -10sleep $INTERVAL
done

B. 確認 lookup_slow 與 fstatat 熱點路徑

# confirm_lookup_slow.sh
#!/bin/bash
# 用法: ./confirm_lookup_slow.sh <pid> [topN] [seconds]
# 例: ./confirm_lookup_slow.sh 36334 5 10PID=$1
TOPN=${2:-5}
DURATION=${3:-10}if [ -z "$PID" ]; thenecho "用法: $0 <pid> [topN] [seconds]"exit 1
fiecho "=== $(date '+%F %T') ==="
echo "進程 $PID, 抓取前 $TOPN 個 lookup_slow 線程, 每個采樣 ${DURATION}s"# 找出 lookup_slow 的前 N 個線程
TIDS=$(ps -eLo pid,tid,wchan | awk -v pid=$PID '$1==pid && $3=="lookup_slow" {print $2}' | head -$TOPN)for tid in $TIDS; doechoecho ">>> TID=$tid 內核棧:"cat /proc/$tid/stackechoecho ">>> TID=$tid fstatat 調用路徑 (采樣 ${DURATION}s):"timeout $DURATION strace -p $tid -e trace=fstat,fstatat,newfstatat,fstat64 -s 200 2>&1 \| grep -E 'fstat|fstatat|newfstatat' \| grep -oE '\".*\"' \| tr -d '"' \| sort | uniq -c | sort -nr | head -20
done

C. 進程級路徑熱點統計(openat/fstatat)

# trace_lookup_paths.sh
#!/bin/bash
# 用法: ./trace_lookup_paths.sh <pid> [seconds]
# 用 strace 抓取 openat/fstatat 調用并統計最熱路徑PID=$1
DURATION=${2:-10}if [ -z "$PID" ]; thenecho "用法: $0 <pid> [seconds]"exit 1
fiecho "=== $(date '+%F %T') ==="
echo "進程 $PID, 采樣 ${DURATION}s, 統計路徑熱點"# 只 trace 路徑相關 syscall,減少干擾
timeout $DURATION strace -e trace=openat,newfstatat,fstatat64 -s 200 -fp $PID 2>&1 \| grep -E 'openat|fstatat|newfstatat' \| awk -F\" '{print $2}' \| sort | uniq -c | sort -nr | head -20

D. 聚焦前 N 個 lookup_slow 線程(內核棧 + 快速 syscalls)

# trace_lookup_slow.sh
#!/bin/bash
# 用法: ./trace_lookup_slow.sh <pid> [topN] [trace_seconds]
# 例如: ./trace_lookup_slow.sh 36334 5 10PID=$1
TOPN=${2:-5}
TRACE_SEC=${3:-5}if [ -z "$PID" ]; thenecho "用法: $0 <pid> [topN] [trace_seconds]"exit 1
fiecho "=== $(date '+%F %T') ==="
echo "進程 $PID, 抓取前 $TOPN 個 lookup_slow 線程"# 找出 lookup_slow 的 TID
TIDS=$(ps -eLo pid,tid,stat,wchan:30,comm | \awk -v pid=$PID '$1==pid && $3 ~ /^D/ && $4=="lookup_slow" {print $2}' | \head -n $TOPN)if [ -z "$TIDS" ]; thenecho "沒有找到 lookup_slow 線程"exit 0
fifor tid in $TIDS; doechoecho ">>> 線程 TID=$tid 內核調用棧 (/proc/$tid/stack):"cat /proc/$tid/stack 2>/dev/null || echo "  (無法讀取 stack,可能內核不支持)"echoecho ">>> 線程 TID=$tid strace 抓取 ${TRACE_SEC}s:"timeout $TRACE_SEC strace -s 200 -fp $tid 2>&1 | head -20
done

三、本次排查總結

  • 本次問題根因:backend 頻繁訪問配置/日志文件 + 部分 IO 落在分布式存儲導致延遲;配合 Go GC 活躍與鎖競爭,線程大量阻塞于 futex_wait_queue_me,最終引發 Load 飆升但 CPU 仍閑。
  • 經驗要點:
    • Load 高 ≠ CPU 忙;優先排查 IO/鎖等待;
    • 先看線程狀態與 wchan 快速定向;
    • 再用 perf/strace 與火焰圖定位熱點;
    • /proc/<pid>/fd 獲取真實 FD 數;
    • 方案從“緩存/異步/隔離/限并發/調 GC”多層優化落地。

📌 經驗教訓:遇到 Load 高問題,不要只盯 CPU 使用率;更多時候是 IO + 鎖 在背后搗鬼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96470.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96470.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺析Linux進程信號處理機制:基本原理及應用

文章目錄概述信號類型可靠信號與不可靠信號Fatal信號與Non Fatal信號不可捕獲/忽略信號信號工作機制信號處理方式信號嵌套處理信號使用信號發送kill命令注冊信號處理函數信號安全與函數可重入性可重入函數線程安全與可重入性相關參考概述 Linux信號機制是進程間通信的一種方式…

【學習K230-例程19】GT6700-TCP-Client

B站視頻 TCP TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;傳輸控制協議/網際協議&#xff09;是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP 協議不僅僅指的是 TCP和 IP 兩個協議&#xff0c;而是指一個由 FTP、SMTP、TCP、UDP、I…

o2oa待辦流程和已辦流程表

在o2oa系統中每個用戶有兩種唯一標識&#xff1a;第一種是姓名個人釘釘ID&#xff08;或者o2oa創建該用戶時設置的id&#xff09;ORG_PERSON.xdistinguishedName劉準3013692136672430P第二種是姓名所在部門的釘釘id個人釘釘idORG_IDENTITY.xdistinguishedName劉準966488616_301…

QT零基礎入門教程

基礎篇第一章 QT 基礎認知1.1 什么是 QT&#xff08;What&#xff09;?定義&#xff1a;跨平臺 C 應用開發框架&#xff0c;不僅用于 UI 設計&#xff0c;還包含核心功能&#xff08;如事件、網絡、數據庫&#xff09;。?核心特性&#xff1a;?跨平臺&#xff1a;一套代碼支…

遠程依賴管理新范式:cpolar賦能Nexus全球協作

文章目錄 前言一. Docker安裝Nexus二. 本地訪問Nexus三. Linux安裝Cpolar四. 配置Nexus界面公網地址五. 遠程訪問 Nexus界面六. 固定Nexus公網地址七. 固定地址訪問Nexus 前言 Nexus作為一款企業級倉庫管理工具&#xff0c;其核心功能在于集中管理各類軟件依賴&#xff0c;提供…

Prompt技術深度解析:從基礎原理到前沿應用的全面指南

引言 在人工智能技術飛速發展的今天&#xff0c;Prompt技術&#xff08;提示詞工程&#xff09;已成為連接人類智慧與機器智能的重要橋梁。隨著GPT-4、Claude、Gemini等大型語言模型的廣泛應用&#xff0c;如何有效地與這些AI系統進行交互&#xff0c;已成為決定AI應用成功與否…

性能測試工具Jmeter之java.net.BindException: Address already in use

首先請參考連接&#xff1a;https://blog.csdn.net/weixin_46190208/article/details/115229733 。配置完注冊表后一般就能解決問題。但并未解決我的問題 注冊表的MaxUserPort&#xff0c;TcpTimedWaitDelay兩個參數我只能配置MaxUserPort&#xff0c;設置TcpTimedWaitDelay后&…

JDK 新特性

JDK 新特性引入模塊Java 9 開始引入了模塊&#xff08;Module&#xff09;&#xff0c;目的是為了管理依賴。使用模塊可以按需打包 JRE 和進一步限制類的訪問權限。接口支持私有方法JAVA 9 開始&#xff0c;接口里可以添加私有方法&#xff0c;JAVA 8 對接口增加了默認方法的支…

如何高效應對網站反爬蟲策略?

現在大型網站的反爬策略越來越高明了&#xff0c;不僅是對IP訪問頻率、User-Agent請求頭進行異常識別&#xff0c;還會分析IP地址、瀏覽器指紋、JS動態加載、API逆向、行為模式等方式各種設卡&#xff0c;動不動跳出五花八門的驗證碼&#xff0c;非常難搞。 怎么應對反爬是個系…

c++ shared_ptr理解

不是一個智能指針對于一個計數器嗎&#xff1f;怎么變成共有資源的計數器了&#xff1f;你的意思是多個對象共用一個計數器&#xff1f;你問到了 std::shared_ptr 最核心、最精妙的設計機制&#xff01;你的問題非常深刻&#xff1a;“不是一個智能指針對應一個計數器嗎&#x…

002 Rust環境搭建

Rust環境搭建 現在很多集成開發環境(IDE)基本上都支持Rust開發。官方公布的支持工具&#xff1a;https://www.rust-lang.org/zh-CN/tools 這里以Windows 10 64位系統 Visual Studio Code為例來搭建Rust開發環境。 Rust安裝 Rust 的編譯工具依賴 C 語言的編譯工具&#xff0…

【Unity進階】Unity發布PC端,隱藏并自定義默認標題欄

開發環境&#xff1a; Unity2019.3.16f1c1 - 個人版 Visual Studio Community 2019 Windows10 專業版 x64嘿&#xff0c;各位朋友們&#xff01;當咱們歡歡喜喜地把項目打包成PC平臺的exe窗口程序&#xff0c;準備在電腦上一展游戲風采時&#xff0c;卻發現冒出來個Windows風格…

國產延時芯片EH3B05上電延時3秒開關機芯片方案超低功耗

EH3B05-4941-24A1延時開關芯片是一款專為低功耗電子產品設計的高效時序控制器件&#xff0c;其核心功能在于提供精確的多通道延時信號輸出。該芯片采用SOT23-6超小封裝&#xff0c;體積僅為2.9mm2.8mm1.3mm&#xff0c;特別適合空間受限的便攜式設備。其工作電壓范圍覆蓋2.0V至…

大數據與財務管理專業如何轉型做金融科技?

在數字經濟加速演進的今天&#xff0c;金融行業的邊界正在被數據與技術重新定義。傳統金融崗位正經歷深刻變革&#xff0c;而"金融科技"&#xff08;FinTech&#xff09;作為技術與金融深度融合的產物&#xff0c;已成為行業轉型升級的核心引擎。越來越多具備數據背景…

Windows、Linux 系統 nodejs 和 npm 版本更新及錯誤修復

一、推薦使用 nvm 工具&#xff0c;直接通過命令行安轉和切換各個版本 無論是 Windows 平臺&#xff0c;還是 Linux 平臺&#xff0c;都推薦使用 nvm 工具。 nvm&#xff08;Node.js Version Management&#xff09;&#xff0c;是一個 nodejs 的版本管理工具。它是專門為解決…

【系列文章】Linux中的并發與競爭[03]-自旋鎖

【系列文章】Linux中的并發與競爭[03]-自旋鎖 該文章為系列文章&#xff1a;Linux中的并發與競爭中的第3篇 該系列的導航頁連接&#xff1a; 【系列文章】Linux中的并發與競爭-導航頁 文章目錄【系列文章】Linux中的并發與競爭[03]-自旋鎖一、自旋鎖二、實驗程序的編寫2.1驅動…

開始 ComfyUI 的 AI 繪圖之旅-Cosmos Predict2世界模型文生圖(全網首發,官網都沒有更新)(十三)

文章標題一、Cosmos-Predict21.Cosmos Predict2 Text2Image 工作流1.1 下載工作流文件1.2 手動模型安裝1.3 按步驟完成工作流運行本文介紹了如何在 ComfyUI 中完成 Cosmos-Predict2 文生圖的工作流 一、Cosmos-Predict2 Cosmos-Predict2 是由 NVIDIA 推出的新一代物理世界基礎模…

深度學習優化器進化史:從SGD到AdamW的原理與選擇

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;優化器——深度學習的引擎 在深度學習…

工商業屋頂分布式光伏監控系統助力園區企業錯峰有序用電

一、行業痛點與需求分析分布式光伏發電作為清潔能源的重要形式&#xff0c;近年來在工商業屋頂、戶用場景中快速普及。然而&#xff0c;其“小而散”的特性導致電網適應性、運維效率、安全管控等方面面臨顯著挑戰&#xff1a;1.電網適應性難題&#xff1a;高滲透率場景下&#…

華為初級認證培訓需要嗎?HCIA考試考什么內容?自學還是報班?

大家好&#xff0c;這里是G-LAB IT實驗室。 在信息技術發展日新月異的今天&#xff0c;華為的ICT認證逐漸成為了行業內重要的技術標桿。而HCIA&#xff08;Huawei Certified ICT Associate&#xff09;作為華為初級認證&#xff0c;對于ICT技術從業者來說&#xff0c;既是職業發…