加群聯系作者vx:xiaoda0423
倉庫地址:https://webvueblog.github.io/JavaPlusDoc/
https://1024bat.cn/
https://github.com/webVueBlog/fastapi_plus
https://webvueblog.github.io/JavaPlusDoc/
? 一、查看端口是否被占用的常用命令
1???lsof
?命令(最推薦)
lsof -i :端口號
示例:
lsof -i :8080
輸出:
COMMAND ? PID ?USER ? FD ? TYPE ?DEVICE SIZE/OFF NODE NAME
java ? ? 1278 ?root ? 45u ?IPv6 ?123456 ? ? ?0t0 ?TCP *:http-alt (LISTEN)
表示:Java 進程正在監聽 8080 端口。
2???netstat
?命令(傳統方式)
netstat -tunlp | grep :端口號
示例:
netstat -tunlp | grep :8080
輸出:
tcp6 ?0 ?0 :::8080 ?:::* ?LISTEN ?1278/java
3???ss
?命令(更快更現代)
ss -ltnp | grep :端口號
示例:
ss -ltnp | grep :8080
輸出:
LISTEN 0 128 :::8080 :::* users:(("java",pid=1278,fd=45))
? 二、查看哪個程序占用了端口
命令組合:
lsof -i :端口號
# 或
netstat -tunlp | grep :端口號
# 或
ss -ltnp | grep :端口號
你會看到:
PID
:進程 IDCOMMAND
:進程名fd
:文件描述符LISTEN
?狀態:表示該端口是服務端監聽中
? 三、查看端口是否能訪問(遠程端口)
本地 telnet(測試遠程是否通):
telnet ip port
示例:
telnet 127.0.0.1 8080
如果顯示?
Connected to 127.0.0.1.
,說明端口是開放的。
? 四、沒有?lsof
?/?netstat
?時怎么辦?
安裝命令:
# Debian/Ubuntu
sudo apt install lsof net-tools# CentOS/RHEL
sudo yum install lsof net-tools
? 五、進階工具(可選)
工具 | 用途 |
---|---|
nmap | 掃描本機或遠程端口是否開放 |
fuser | 快速找出哪個 PID 占用端口 |
nc -zv | 測試端口連通性 |
`ss -anp | grep LISTEN` |
查看端口是否被占用,我通常使用?
lsof -i :端口
?或?ss -ltnp
,能直接定位是哪一個進程監聽該端口。實際中如果是端口沖突導致服務啟動失敗,可以結合?kill PID
?或?fuser -k
?來釋放端口。
先宏觀、后細節:先看全局指標再聚焦具體進程 / 線程 / 調用棧
先“活數據”,后“冷分析”?:先用實時工具捕捉異常,再用離線日志或 Dump 深挖
留證據、可復現:執行高頻采樣時先確認磁盤空間、權限和對業務的影響
0 事前準備
動作 | 目的 |
---|---|
記錄時間線 (報警觸發點、峰值出現點) | 方便對比前后基線 |
確認變更 (發布、配置、流量) | 排除代碼 / 業務層面因素 |
確保 root / sudo + perf/ebpf 權限 | 避免臨時被卡權限 |
1 快速橫向體檢(1–2 分鐘)
uptime ? ? ? ? ? ?# load & run-queue
top -b -n 1 ? ? ??# CPU/Load/Swap 一眼看
free -m ? ? ? ? ??# 內存概覽
df -hT ? ? ? ? ? ?# 容量/只讀分區
iostat -xz 1 3 ? ?# 磁盤 util% / await
sar -n DEV 1 3 ? ?# 網卡收發速率/丟包
判斷優先級:
load≈CPU 核數且 %sy/%wa 高 → 先查 CPU 或磁盤
free 可用內存低 + swpd 增長 → 查內存泄漏 / OOM
iostat %util 常年 >80% 或 await > 50 ms → 查磁盤
網絡丟包 / re-trans 增長 → 查網絡
2 CPU 排查
步驟 | 命令 | 說明 |
---|---|---|
① 進程定位 | top -H ?/? | 找到高 CPU PID 或線程 (TID) |
② 線程源碼歸位 | ps -Lp <PID> | 將 TID ? 線程名 |
③ 調用棧抓取 | perf top -p <PID> ?或? | 取熱點函數 |
④ Java 專用 | jstack -l <PID> ?/ async-profiler | 對應線程狀態、死循環、GC 卡頓 |
⑤ 內核搶占 | mpstat -P ALL 1 、 | context-switch、cpu steal 判斷虛機噪音 |
3 內存排查
步驟 | 命令 | 說明 |
---|---|---|
① ??初判 | free -m 、 | 緩存/緩存回收、swap in/out |
② 進程級 | top -o %MEM 、 | 找占用最大的進程 |
③ 映射明細 | pmap -x <PID> ?/? | 堆 / 共享庫 / 匿名頁 |
④ Java 堆 | jmap -heap <PID> 、 | 老年代溢出、類加載飆升 |
⑤ 堆 Dump | jmap -dump:live,format=b,file=heap.hprof <PID> ,MAT / VisualVM 分析 | 根因定位(集合持有 / 緩存未清) |
⑥ 內核緩存 | slabtop 、 | 罕見但要排除 driver 泄漏 |
4 磁盤 & IO 排查
步驟 | 命令 | 說明 |
---|---|---|
① 負載概覽 | iostat -xz 1 | %util 、 |
② 進程級 | pidstat -d 1 、 | 哪個進程讀寫大 |
③ 磁盤延遲 | blktrace /dev/sdX ?+? | 隊列/設備層延遲 |
④ 文件定位 | lsof +D /path ?或? | 頻繁訪問文件路徑 |
⑤ FS 級別 | df -ih 、 | inode 耗盡、磁盤壞塊 |
⑥ 調優 | deadline→mq-deadline 、 | IO 調度、RAID/SSD 隊列深度 |
5 網絡排查
步驟 | 命令 | 說明 |
---|---|---|
① 速率 / 丟包 | sar -n DEV 1 、 | TX/RX errors, drops |
② 連接數 | ss -s 、 | SYN flood? FD 耗盡? |
③ 會話詳情 | ss -ntp sport = :8080 | 哪些遠端連接最多 |
④ RTT / 路由 | mtr <ip> 、 | 跨機房抖動排除 |
⑤ 微包/重傳 | tcpdump -i eth0 -w cap.pcap ?+ Wireshark | Window size、Dup ACK |
⑥ Socket 隊列 | `netstat -anp | grep? |
6 跨資源綜合分析
時間軸對齊:Grafana/Prometheus 將 CPU、iowait、GC、p99 延遲放在同一 Dashboard。
內核 ebpf:用 bcc / bpftrace 即時追蹤 (e.g.?
profile
,?tcpconnlat
,?biolatency
).壓測復現:ab / wrk / vegeta 重放流量,配合?
perf/kernexec
?抓熱點。容器視角:
docker stats
、cgroup?/sys/fs/cgroup/*/usage_usec
、K8s Metrics-Server。自動化:把常用采樣腳本寫成?
diag.sh
,配合 Ansible/Fabric 一鍵收集,避免線上手動誤操作。
7 建議的“黃金三板斧”腳本
# gstack + top
pid=$(top -b -n1 | awk?'/^ *[0-9]+/ && $9>500 {print $1;exit}')
gstack?$pid?> /tmp/stack.$(date +%s)# 30s CPU 火焰圖
perf record -F 99 -g -p?$pid?-- sleep 30
perf script | flamegraph.pl > /tmp/cpu.svg# ebpf: 連接延遲
/tcpconnectlat-bpfcc -d 10 > /tmp/tcplat.log
結語
先定位資源瓶頸 → 再定位進程 → 再看線程 / 調用棧 / 系統調用 / 數據結構。
復現-> 采樣-> 驗證,任何優化都要有客觀指標前后對比。
腳本化、自動化:把上述高頻操作固化到倉庫,避免“憑感覺”排障。
? 一、CPU 性能問題排查
🔍 排查目標:
哪個進程/線程占用 CPU 高?
是系統調用高?還是業務代碼死循環?
多核是否均衡?
🛠? 常用命令:
命令 | 用途 |
---|---|
top | 查看實時 CPU 使用率、負載、占用進程 |
htop | 圖形化顯示各核使用,支持排序和篩選 |
ps aux --sort=-%cpu | 靜態查看占用 CPU 的進程 |
pidstat -u -p <pid> 1 | 查看某個進程的 CPU 使用詳情 |
perf top ?/? | 查看熱點函數,分析死循環 |
jstack <pid> | Java 進程線程棧分析,定位死循環線程 |
🚨 實戰指標:
load average
?高,但 CPU 利用率低 → IO 等待top
?中?%us
(用戶態)高 → 業務邏輯問題%sy
?高 → 系統調用多,可能頻繁網絡/disk 操作%id
(空閑)低 → CPU 打滿
? 二、內存問題排查
🔍 排查目標:
是否 OOM(內存打爆)?
是哪個進程吃內存?
有沒有內存泄漏?
🛠? 常用命令:
命令 | 用途 |
---|---|
free -h | 查看整體內存和 swap 使用情況 |
top ?/? | 查看哪個進程吃內存 |
ps aux --sort=-%mem | 內存占用排序 |
vmstat 1 | si/so ?代表 swap in/out(頻繁表示內存不足) |
smem ?/? | 查看進程內存映射 |
jmap -heap <pid> ?/? | Java 堆信息 |
`dmesg | grep -i oom` |
🚨 實戰指標:
swap 使用過高 → 內存不足
OOM Killer
?出現 → 殺掉了高占用進程Java 內存泄漏 → 用?
MAT
?工具分析 dump
? 三、磁盤空間問題排查
🔍 排查目標:
是否磁盤已滿?
是哪個目錄/文件太大?
哪些臨時文件沒有清理?
🛠? 常用命令:
命令 | 用途 |
---|---|
df -h | 查看磁盤各分區使用情況 |
du -sh * | 查看當前目錄大小 |
ncdu | 交互式目錄體積分析 |
find / -type f -size +500M | 找出超過 500M 的文件 |
`lsof | grep deleted` |
🚨 實戰指標:
/var
?或?/tmp
?被日志打滿 → 服務異常日志文件被刪但沒釋放 → 需重啟進程
docker
/log
/core dump
?等導致空間異常消耗
? 四、磁盤 IO 問題排查
🔍 排查目標:
是否磁盤讀寫速率限制系統?
哪個進程 IO 頻繁?
IO 等待高?
🛠? 常用命令:
命令 | 用途 |
---|---|
iostat -x 1 | 查看每塊磁盤的利用率? |
iotop | 實時查看進程的讀寫 IO 負載 |
vmstat 1 | wa ?字段高說明 IO 等待高 |
dstat -d | 磁盤寫入速率 |
sar -d 1 5 | 歷史 IO 數據 |
🚨 實戰指標:
iostat
?中某磁盤?util
?> 80% → 說明該磁盤是瓶頸await
?> 50ms → 表示磁盤響應慢Java 日志寫入頻繁也會導致 IO 擁堵
? 五、網絡性能問題排查
🔍 排查目標:
網絡延遲?丟包?帶寬不夠?
服務端口未監聽?
某服務連接滿了?
🛠? 常用命令:
命令 | 用途 |
---|---|
ping ,? | 檢查網絡連通性、路徑問題 |
curl ,? | 檢查端口是否通 |
netstat -anp ?/? | 查看端口監聽狀態 |
iftop ,? | 查看實時帶寬占用 |
tcpdump | 抓包分析異常 |
sar -n DEV 1 | 查看網絡設備流量 |
`conntrack -L | wc -l` |
🚨 實戰指標:
ping
?延遲高丟包多 → 網絡鏈路問題ss
?發現端口未監聽 → 應用未啟動或崩潰established
?鏈接數過多 → 服務未釋放連接或未加連接池
? 六、問題排查流程總結圖
系統性能異常│┌──────┴──────┐↓ ? ? ? ? ? ? ↓
CPU高 ? ? ? 內存爆/GC頻↓ ? ? ? ? ? ? ↓
top/ps ? ? ? free/vmstat
jstack ? ? ? jmap/jstat↓ ? ? ? ? ? ? ↓
磁盤滿/慢 ? ?IO 卡頓?↓ ? ? ? ? ? ? ↓
df/du ? ? ?iostat/iotop↓ ? ? ? ? ? ? ↓
網絡問題?↓
ping/tcpdump/ss/curl
遇到系統響應慢問題,我會先看 CPU/內存是否異常(用?
top
?/?vmstat
),然后用?iostat
?確認是否是磁盤瓶頸,如果都正常再排查網絡(ping
、ss
、tcpdump
),實際中配合?dmesg
/journalctl
?查異常日志也很重要。
排查 Linux 系統中的?CPU、內存、磁盤、IO、網絡性能問題?通常遵循「定位瓶頸 → 查找進程 → 分析原因 → 優化方案」這條主線。以下是各個方向的排查思路和常用命令:
🧠 一、CPU 性能問題排查
1.1 初步排查
top
htop ? ? ? ? ? ?# 更直觀(需安裝)
關注?
%CPU
,load average
(是否超過核心數)找出 CPU 占用高的進程(PID)
1.2 深入分析
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
pidstat -u -p <PID> 1 ? ? ??# 查看某進程 CPU 占用變化
1.3 Java 應用場景
jstack <PID> ? ? ? ? ? ? ? ?# 查看線程棧,排查死循環
top -Hp <PID> ? ? ? ? ? ? ??# 找出占用 CPU 高的線程 TID(十進制)
printf?"%x\n"?<TID> ? ? ? ??# 轉為十六進制匹配 jstack 中的 nid
🧠 二、內存問題排查
2.1 查看整體使用
free -h
top / htop
vmstat 1
重點關注?
free
,?available
,?swap
?是否頻繁使用
2.2 查找占用高的進程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
smem -r | head ? ? ? ? ? ? ?# 更準確統計(需安裝)
2.3 檢查 OOM 歷史
dmesg | grep -i?kill
💽 三、磁盤使用排查
3.1 空間使用
df -h ? ? ? ? ? ? ? ? ? ? ? ?# 查看掛載點使用率
du -sh /var/log/* ? ? ? ? ? ?# 查看目錄占用
3.2 清理建議
定期清理大日志文件
使用 logrotate 自動歸檔壓縮日志
🖴 四、磁盤 IO 性能排查
4.1 實時 IO 狀態
iostat -x 1 ? ? ? ? ? ? ? ? ?# 觀察 %util(高表示 IO 飽和)
4.2 觀察讀寫情況
iotop ? ? ? ? ? ? ? ? ? ? ? ?# 查看讀寫最多的進程(需 root)
🌐 五、網絡問題排查
5.1 基本命令
netstat -tnlp ? ? ? ? ? ? ??# 查看端口監聽情況
ss -s ? ? ? ? ? ? ? ? ? ? ??# TCP 狀態統計
ss -ant | grep -i estab ? ??# 當前活躍連接
5.2 查看流量和連接
iftop ? ? ? ? ? ? ? ? ? ? ??# 實時流量(需安裝)
nethogs ? ? ? ? ? ? ? ? ? ??# 進程級別的網絡流量(需安裝)
5.3 ping & traceroute
ping <目標地址> ? ? ? ? ? ??# 查看網絡是否通暢、延遲
traceroute <目標地址> ? ? ??# 路由跳數分析
📌 實戰經驗總結
問題現象 | 排查思路 |
---|---|
CPU 飆高 | top → jstack → 定位死循環 |
內存不足 | free → ps → OOM 日志 |
磁盤滿了 | df/du 分析目錄占用 |
IO 慢卡頓 | iostat → iotop 分析進程 |
網絡斷連/慢 | ping/traceroute/iftop |