当服务器响应变慢或报警提示CPU高负载时,第一时间需要确认是用户进程占用过高,还是系统内核态占用过高。
使用 top 命令查看整体负载情况。输入 top 后,重点关注 load average(负载均衡)和 %Cpu(s) 行。
如果 load average 的数值长期超过CPU核心数,说明负载过高。按下 P 键(大写),按CPU使用率排序,找到排名第一的进程PID。
在 top 的输出中观察 us(user)和 sy(system)列:
如果是Java应用导致CPU高,需定位到具体线程代码。执行以下步骤:
1. 使用 top -Hp
2. 将线程ID(十进制)转换为十六进制。在命令行执行:
```bash printf "%x\n"3. 导出堆栈信息:
```bash jstack4. 在 jstack.log 中搜索刚才转换出来的十六进制 TID,即可找到对应的具体代码堆栈,从而定位问题代码行。
内存问题通常表现为OOM(Out Of Memory)杀进程,或者Swap分区使用率过高导致系统卡顿。
使用 free -m 命令以MB为单位查看内存:
```bash free -m ```重点关注 available 列。在较新的Linux内核中,available 代表应用程序实际可用的物理内存(包含了可回收的Cache/Buffer)。如果 available 接近0,说明内存真的紧缺。
当物理内存不足时,系统会开始使用Swap(交换分区),这将导致性能急剧下降。执行 vmstat 1 实时监控:
```bash vmstat 1 ```观察 si(swap in)和 so(swap out)两列。如果这两个值持续不为0,说明系统正在频繁进行内存交换,必须立即排查大内存进程或增加物理内存。
使用 ps 命令结合排序参数,直接列出内存占用前10的进程:
```bash ps aux --sort=-rss | head -n 10 ```其中 rss 代表常驻物理内存。对于Java应用,如果内存持续增长且不回落,大概率存在内存泄漏。此时需导出堆内存快照进行分析:
```bash jmap -dump:format=b,file=heap.hprof
如果CPU和内存都不高,但系统依然很慢,通常是磁盘I/O出现了瓶颈。
使用 iostat -x -k 1 3 命令,每隔1秒输出一次,共输出3次:
```bash iostat -x -k 1 3 ```关键指标解读:
知道哪个磁盘忙(如 sda 或 vdb)后,需要知道是哪个进程在读写。使用 iotop 工具(如果未安装,执行 yum install iotop 或 apt install iotop):
```bash iotop -o ```参数 -o 表示只显示正在产生I/O的进程。输出中会清晰显示 READ 和 WRITE 的速度,以及对应的进程和命令行。
有时候并非I/O慢,而是磁盘满了导致无法写入日志。执行:
```bash df -h ```检查 Use% 列。如果达到100%,使用 du -sh / | sort -rh 快速定位根目录下哪个目录占用最大,层层深入直到找到大文件。
网络问题通常表现为连接超时、端口被占满或带宽跑满。
使用 netstat 或 ss 命令统计各种TCP状态的连接数。ss 命令效率更高,推荐使用:
```bash ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k, s[k]}' ```重点关注以下状态:
如果 TIME_WAIT 过多,通常是因为服务器主动关闭了大量连接。可以通过调整内核参数优化:
编辑 /etc/sysctl.conf,添加或修改以下配置:
```bash net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 ```执行 sysctl -p 使配置生效。这允许将TIME_WAIT socket重新用于新的TCP连接,并缩短超时时间。
使用 sar 命令查看网卡的接收(RX)和发送(TX)流量:
```bash sar -n DEV 1 3 ```观察 rxpck/s(每秒接收包数)和 txpck/s(每秒发送包数)。如果带宽打满,需要限制特定进程的带宽或进行扩容。
为了方便快速排查,以下是关键场景与对应命令的速查表:
| 故障现象 | 排查命令 | 关键关注点 |
|---|---|---|
| CPU负载高 | top -Hp |
%CPU, us vs sy |
| 内存不足 | free -m, vmstat 1 |
available, si/so |
| 磁盘读写慢 | iostat -x -k 1 |
%util, await |
| 网络连接爆满 | ss -ant |
TIME_WAIT count |
| 磁盘空间满 | df -h |
Use% 100% |
排查系统问题时,建议遵循“先外后内,先软后硬”的原则。首先确认基础资源(CPU、内存、磁盘、网络)哪一项达到瓶颈,再针对该项深入分析具体进程或线程。通过上述命令的组合使用,可以在无监控工具的情况下,快速定位90%的Linux生产环境故障。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图