加群联系作者vx:xiaoda0423
仓库地址:https://webvueblog.github.io/JavaPlusDoc/
https://github.com/webVueBlog/fastapi_plus
https://webvueblog.github.io/JavaPlusDoc/
✅ 一、查看端口是否被占用的常用命令
1️⃣ lsof
命令(最推荐)
go
lsof -i :端口号
示例:
go
lsof -i :8080
输出:
go
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
命令(传统方式)
go
netstat -tunlp | grep :端口号
示例:
go
netstat -tunlp | grep :8080
输出:
go
tcp6 0 0 :::8080 :::* LISTEN 1278/java
3️⃣ ss
命令(更快更现代)
go
ss -ltnp | grep :端口号
示例:
go
ss -ltnp | grep :8080
输出:
go
LISTEN 0 128 :::8080 :::* users:(("java",pid=1278,fd=45))
✅ 二、查看哪个程序占用了端口
命令组合:
go
lsof -i :端口号
# 或
netstat -tunlp | grep :端口号
# 或
ss -ltnp | grep :端口号
你会看到:
-
PID
:进程 ID -
COMMAND
:进程名 -
fd
:文件描述符 -
LISTEN
状态:表示该端口是服务端监听中
✅ 三、查看端口是否能访问(远程端口)
本地 telnet(测试远程是否通):
go
telnet ip port
示例:
go
telnet 127.0.0.1 8080
如果显示
Connected to 127.0.0.1.
,说明端口是开放的。
✅ 四、没有 lsof
/ netstat
时怎么办?
安装命令:
go
# 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 分钟)
go
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 / htop |
找到高 CPU PID 或线程 (TID) |
② 线程源码归位 | ps -Lp <PID> |
将 TID ↔ 线程名 |
③ 调用栈抓取 | perf top -p <PID> 或 perf record -F 99 -p <PID> -- sleep 30 ,随后 perf report |
取热点函数 |
④ Java 专用 | jstack -l <PID> / async-profiler |
对应线程状态、死循环、GC 卡顿 |
⑤ 内核抢占 | mpstat -P ALL 1 、pidstat -w |
context-switch、cpu steal 判断虚机噪音 |
3 内存排查
步骤 | 命令 | 说明 |
---|---|---|
① 누수初判 | free -m 、vmstat 1 |
缓存/缓存回收、swap in/out |
② 进程级 | top -o %MEM 、smem -r |
找占用最大的进程 |
③ 映射明细 | pmap -x <PID> / cat /proc/<PID>/smaps_rollup |
堆 / 共享库 / 匿名页 |
④ Java 堆 | jmap -heap <PID> 、jmap -histo:live 、jcmd GC.heap_info |
老年代溢出、类加载飙升 |
⑤ 堆 Dump | jmap -dump:live,format=b,file=heap.hprof <PID> ,MAT / VisualVM 分析 |
根因定位(集合持有 / 缓存未清) |
⑥ 内核缓存 | slabtop 、kmemleak |
罕见但要排除 driver 泄漏 |
4 磁盘 & IO 排查
步骤 | 命令 | 说明 |
---|---|---|
① 负载概览 | iostat -xz 1 |
%util 、await 、avgrq-sz |
② 进程级 | pidstat -d 1 、iotop -b -n 3 |
哪个进程读写大 |
③ 磁盘延迟 | blktrace /dev/sdX + blkparse |
队列/设备层延迟 |
④ 文件定位 | lsof +D /path 或 fileslower-bpfcc |
频繁访问文件路径 |
⑤ FS 级别 | df -ih 、dumpe2fs -h |
inode 耗尽、磁盘坏块 |
⑥ 调优 | deadline→mq-deadline 、noop 、fio 基准 |
IO 调度、RAID/SSD 队列深度 |
5 网络排查
步骤 | 命令 | 说明 |
---|---|---|
① 速率 / 丢包 | sar -n DEV 1 、ethtool -S eth0 |
TX/RX errors, drops |
② 连接数 | ss -s 、ss -ant state established |
SYN flood? FD 耗尽? |
③ 会话详情 | ss -ntp sport = :8080 |
哪些远端连接最多 |
④ RTT / 路由 | mtr <ip> 、tracepath |
跨机房抖动排除 |
⑤ 微包/重传 | tcpdump -i eth0 -w cap.pcap + Wireshark |
Window size、Dup ACK |
⑥ Socket 队列 | `netstat -anp | grep 、 ss -ltn` |
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 建议的"黄金三板斧"脚本
go
# 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 / perf record |
查看热点函数,分析死循环 |
jstack <pid> |
Java 进程线程栈分析,定位死循环线程 |
🚨 实战指标:
-
load average
高,但 CPU 利用率低 → IO 等待 -
top
中%us
(用户态)高 → 业务逻辑问题 -
%sy
高 → 系统调用多,可能频繁网络/disk 操作 -
%id
(空闲)低 → CPU 打满
✅ 二、内存问题排查
🔍 排查目标:
-
是否 OOM(内存打爆)?
-
是哪个进程吃内存?
-
有没有内存泄漏?
🛠️ 常用命令:
命令 | 用途 |
---|---|
free -h |
查看整体内存和 swap 使用情况 |
top / htop |
查看哪个进程吃内存 |
ps aux --sort=-%mem |
内存占用排序 |
vmstat 1 |
si/so 代表 swap in/out(频繁表示内存不足) |
smem / pmap <pid> |
查看进程内存映射 |
jmap -heap <pid> / jstat -gc <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 |
查看每块磁盘的利用率 util 和等待 await |
iotop |
实时查看进程的读写 IO 负载 |
vmstat 1 |
wa 字段高说明 IO 等待高 |
dstat -d |
磁盘写入速率 |
sar -d 1 5 |
历史 IO 数据 |
🚨 实战指标:
-
iostat
中某磁盘util
> 80% → 说明该磁盘是瓶颈 -
await
> 50ms → 表示磁盘响应慢 -
Java 日志写入频繁也会导致 IO 拥堵
✅ 五、网络性能问题排查
🔍 排查目标:
-
网络延迟?丢包?带宽不够?
-
服务端口未监听?
-
某服务连接满了?
🛠️ 常用命令:
命令 | 用途 |
---|---|
ping , traceroute |
检查网络连通性、路径问题 |
curl , telnet ip port |
检查端口是否通 |
netstat -anp / ss -lntp |
查看端口监听状态 |
iftop , nethogs |
查看实时带宽占用 |
tcpdump |
抓包分析异常 |
sar -n DEV 1 |
查看网络设备流量 |
`conntrack -L | wc -l` |
🚨 实战指标:
-
ping
延迟高丢包多 → 网络链路问题 -
ss
发现端口未监听 → 应用未启动或崩溃 -
established
链接数过多 → 服务未释放连接或未加连接池
✅ 六、问题排查流程总结图
go
系统性能异常
│
┌──────┴──────┐
↓ ↓
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 初步排查
go
top
htop # 更直观(需安装)
-
关注
%CPU
,load average
(是否超过核心数) -
找出 CPU 占用高的进程(PID)
1.2 深入分析
go
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
go
pidstat -u -p <PID> 1 # 查看某进程 CPU 占用变化
1.3 Java 应用场景
go
jstack <PID> # 查看线程栈,排查死循环
top -Hp <PID> # 找出占用 CPU 高的线程 TID(十进制)
printf "%x\n" <TID> # 转为十六进制匹配 jstack 中的 nid
🧠 二、内存问题排查
2.1 查看整体使用
go
free -h
top / htop
vmstat 1
- 重点关注
free
,available
,swap
是否频繁使用
2.2 查找占用高的进程
go
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
go
smem -r | head # 更准确统计(需安装)
2.3 检查 OOM 历史
go
dmesg | grep -i kill
💽 三、磁盘使用排查
3.1 空间使用
go
df -h # 查看挂载点使用率
du -sh /var/log/* # 查看目录占用
3.2 清理建议
-
定期清理大日志文件
-
使用 logrotate 自动归档压缩日志
🖴 四、磁盘 IO 性能排查
4.1 实时 IO 状态
go
iostat -x 1 # 观察 %util(高表示 IO 饱和)
4.2 观察读写情况
go
iotop # 查看读写最多的进程(需 root)
🌐 五、网络问题排查
5.1 基本命令
go
netstat -tnlp # 查看端口监听情况
ss -s # TCP 状态统计
ss -ant | grep -i estab # 当前活跃连接
5.2 查看流量和连接
go
iftop # 实时流量(需安装)
nethogs # 进程级别的网络流量(需安装)
5.3 ping & traceroute
go
ping <目标地址> # 查看网络是否通畅、延迟
traceroute <目标地址> # 路由跳数分析
📌 实战经验总结
问题现象 | 排查思路 |
---|---|
CPU 飙高 | top → jstack → 定位死循环 |
内存不足 | free → ps → OOM 日志 |
磁盘满了 | df/du 分析目录占用 |
IO 慢卡顿 | iostat → iotop 分析进程 |
网络断连/慢 | ping/traceroute/iftop |