明白,你希望我給出一個 100%詳細、可執行、覆蓋 CPU/內核/TCP/應用的排查流程,可以判斷 HTTP 響應慢的原因(機器負載、網絡不穩、業務阻塞),並且每一項都明確列出 觀測指標、方法、命令、判斷依據,特別強調對 業務進程延遲和網絡延遲的影響。下面我整理成系統化指南。


HTTP 響應慢排查指南(CPU / TCP / 網絡 / 應用)


1️⃣ 採集 TCP 棧函數耗時(內核態耗時分析)

目的:量化 TCP/IP 內核處理耗時,判斷 CPU 對網絡延遲影響

方法 A:ftrace function_graph(內核自帶)

# 1. 開啓 function_graph tracer
echo function_graph > /sys/kernel/debug/tracing/current_tracer

# 2. 設置 TCP 棧關鍵函數過濾
echo tcp_v4_do_rcv > /sys/kernel/debug/tracing/set_ftrace_filter
echo tcp_rcv_established >> /sys/kernel/debug/tracing/set_ftrace_filter
echo tcp_sendmsg >> /sys/kernel/debug/tracing/set_ftrace_filter
echo tcp_cleanup_rbuf >> /sys/kernel/debug/tracing/set_ftrace_filter
echo tcp_ack >> /sys/kernel/debug/tracing/set_ftrace_filter

# 3. 開啓 tracing
echo 1 > /sys/kernel/debug/tracing/tracing_on

# 4. 發起 HTTP 請求進行採樣
curl -s http://yourserver/endpoint

# 5. 查看 trace 輸出
cat /sys/kernel/debug/tracing/trace_pipe

觀察指標及判斷

指標

觀測方法

判斷依據

對延遲影響

TCP 棧函數耗時

trace_pipe 或 trace 文件中每個函數耗時

函數耗時佔 CPU 總時間 > 50%

內核 TCP 處理慢 → Send-Q / Recv-Q 堆積 → 網絡延遲增加

函數調用堆棧深

trace 文件 call graph

函數多層調用且耗時長

CPU 處理 HTTP 請求前的 TCP 數據積壓


方法 B:perf record / perf report(採樣分析)

# 採樣系統內核態 CPU
perf record -e cycles:k -a -g sleep 10
perf report
  • 檢查 tcp_sendmsg, tcp_cleanup_rbuf, tcp_v4_do_rcv 等函數耗時
  • 判斷依據
  • 內核函數佔比高 → CPU 內核成為瓶頸 → HTTP 響應慢由機器負載導致
  • 函數耗時低 → TCP 內核處理正常 → 延遲可能由網絡或業務邏輯導致

2️⃣ 採集 CPU 各核使用率

目的:判斷 CPU 是否成為網絡延遲或業務延遲瓶頸

方法

# 每秒採集各核使用率
mpstat -P ALL 1

# 關鍵字段:
# %usr  -> 用户態佔用,應用邏輯處理佔 CPU 時間
# %sys  -> 內核態佔用,內核 TCP/IP 處理耗時
# %soft -> 軟中斷佔用,網絡處理相關
# %iowait -> I/O 等待,磁盤/網絡 I/O 阻塞
# %idle -> 空閒

判斷 TCP 網絡延遲影響

CPU 指標

觀察方法

影響判斷

%sys 高

mpstat

內核態 CPU 佔用高 → TCP 棧處理慢 → Send-Q/Recv-Q 堆積 → 網絡延遲增加

%soft 高

mpstat + /proc/softirqs

NET_RX / NET_TX 高 → 網絡軟中斷 CPU 成瓶頸 → HTTP 數據包處理慢

單核 %sys/%soft 高

mpstat 分核

CPU 不均衡 → 某核成為瓶頸 → 隊列堆積、HTTP OK 延遲增加

判斷業務延遲影響

CPU 指標

觀察方法

影響判斷

%usr 高

mpstat

用户態佔用高 → 應用處理慢 → HTTP handler 延遲增加

%iowait 高

mpstat

I/O 阻塞 → HTTP 響應慢

%idle 低

mpstat

CPU 飽和 → 業務處理受限


3️⃣ 採集 TCP 隊列、RTT、cwnd、重傳

目的:量化網絡狀況對 HTTP 響應延遲的影響

方法

# 每秒採集
ss -ti

關鍵字段説明:

字段

含義

判斷依據

Recv-Q

接收隊列長度

隊列堆積 → 應用未及時讀 → 業務延遲

Send-Q

發送隊列長度

隊列持續堆積 → 內核或應用阻塞 → 網絡延遲

rtt

平均 RTT

RTT 高 → 網絡不穩

cwnd

擁塞窗口

cwnd 縮小 → 網絡擁塞

retrans

重傳段

retrans 多 → 網絡丟包 → HTTP 延遲增加

分析邏輯

  1. 隊列堆積 + %sys/%soft 高 → CPU/內核瓶頸 → 網絡延遲
  2. RTT 高 + retrans 多 + CPU 不高 → 網絡不穩 → 網絡延遲
  3. Send-Q 高 + %usr 高 → 應用處理慢 → 業務延遲

4️⃣ 採集應用 handler latency / 線程狀態

目的:判斷業務邏輯是否導致 HTTP 響應慢

方法 A:Web 服務器慢日誌

  • Nginx:
log_format latency '$remote_addr $request_time $upstream_response_time';
access_log /var/log/nginx/access.log latency;
  • Go HTTP:
start := time.Now()
// handle request
elapsed := time.Since(start)
log.Printf("handler latency: %v", elapsed)

方法 B:線程阻塞狀態

語言/工具

命令

觀察指標

判斷依據

Linux

strace -p -tt -T -e trace=write,read,send,recv

syscall 耗時

syscall 阻塞 → 應用延遲

Go

go tool pprof http://localhost:6060/debug/pprof/goroutine

RUNNABLE / IO_WAIT

goroutine 阻塞 → handler 延遲

Java

jstack

RUNNABLE / WAITING

線程阻塞 → handler 延遲


5️⃣ 軟/硬中斷影響觀察(網絡延遲)

# 軟中斷統計
cat /proc/softirqs | grep NET_RX
cat /proc/softirqs | grep NET_TX

# NIC 中斷
cat /proc/interrupts

判斷依據

  • NET_RX / NET_TX 佔用高 → CPU 內核成為網絡處理瓶頸 → HTTP 響應延遲
  • 中斷在單核集中 → 處理能力受限 → 網絡延遲增加

6️⃣ 綜合判斷邏輯

HTTP 響應慢
    |
    |-- TCP 棧函數耗時佔內核CPU高 + TCP 隊列堆積 → 機器負載瓶頸
    |-- RTT 高 / retrans 多 + CPU 不高 → 網絡不穩
    |-- Send-Q 堆積 + 用户態 handler latency 高 → 業務邏輯阻塞

場景

核心指標

判斷依據

延遲類型

機器負載瓶頸

%sys/%soft 高 + TCP 棧耗時高 + 隊列堆積

內核處理 TCP 數據慢

網絡延遲

網絡不穩

RTT 高 + retrans 多 + 隊列正常

TCP 擁塞/丟包

網絡延遲

業務阻塞

%usr 高 + Send-Q 堆積 + handler latency 高

應用處理慢 / 阻塞

業務延遲


7️⃣ 建議觀測流程

  1. 每秒採集 CPU 各核 (mpstat -P ALL 1)
  2. 每秒採集 TCP 隊列/RTT/cwnd/retrans (ss -ti)
  3. Trace TCP 棧函數耗時 (ftraceperf)
  4. 採集應用 handler latency / 線程阻塞 (strace / pprof / jstack)
  5. 觀察軟/硬中斷 NET_RX/NET_TX (/proc/softirqs / /proc/interrupts)
  6. 結合表格判斷延遲來源

💡 總結

  • 網絡延遲來源:內核 TCP 棧處理慢(機器負載) 或 網絡擁塞/丟包(RTT/retrans)
  • 業務延遲來源:應用處理慢 / 阻塞 (%usr 高 + handler latency 高 + Send-Q 堆積)
  • CPU 使用率與延遲關係
  • %sys/%soft 高 → 網絡延遲
  • %usr 高 → 業務延遲
  • %iowait 高 → I/O 阻塞延遲

如果你需要,我可以幫你寫一個 完整自動化採集腳本

  • 每秒採集:
  • TCP 棧函數耗時
  • CPU 各核 us/sy/soft/iowait
  • TCP 隊列 / RTT / cwnd / retrans
  • 應用 handler latency
  • 輸出 CSV
  • 自動標記延遲來源(機器負載 / 網絡 / 業務阻塞)