当前位置:网站首页 >  攻略

Linux生产环境系统排查全流程实战指南

时间:2026年06月13日 14:03:28 来源:易频IT社区

一、CPU负载过高排查实战

当服务器响应变慢或报警提示CPU高负载时,第一时间需要确认是用户进程占用过高,还是系统内核态占用过高。

1.1 快速定位高负载进程

使用 top 命令查看整体负载情况。输入 top 后,重点关注 load average(负载均衡)和 %Cpu(s) 行。

如果 load average 的数值长期超过CPU核心数,说明负载过高。按下 P 键(大写),按CPU使用率排序,找到排名第一的进程PID。

1.2 区分用户态与内核态

在 top 的输出中观察 us(user)和 sy(system)列:

  • us(用户态)高: 主要是用户程序(如Java、Python、PHP)计算量大。需定位具体代码逻辑。
  • sy(内核态)高: 可能是大量的系统调用、线程切换、或者磁盘I/O导致的。可尝试查看线程上下文切换情况。

1.3 线程级定位(Java为例)

如果是Java应用导致CPU高,需定位到具体线程代码。执行以下步骤:

1. 使用 top -Hp 查看该进程下所有线程的CPU占用,找到耗时最高的线程ID(TID)。

2. 将线程ID(十进制)转换为十六进制。在命令行执行:

```bash printf "%x\n" ```

3. 导出堆栈信息:

```bash jstack > jstack.log ```

4. 在 jstack.log 中搜索刚才转换出来的十六进制 TID,即可找到对应的具体代码堆栈,从而定位问题代码行。

二、内存泄漏与溢出排查

内存问题通常表现为OOM(Out Of Memory)杀进程,或者Swap分区使用率过高导致系统卡顿。

2.1 查看系统整体内存概况

使用 free -m 命令以MB为单位查看内存:

```bash free -m ```

重点关注 available 列。在较新的Linux内核中,available 代表应用程序实际可用的物理内存(包含了可回收的Cache/Buffer)。如果 available 接近0,说明内存真的紧缺。

2.2 监控Swap分区使用

当物理内存不足时,系统会开始使用Swap(交换分区),这将导致性能急剧下降。执行 vmstat 1 实时监控:

```bash vmstat 1 ```

观察 si(swap in)和 so(swap out)两列。如果这两个值持续不为0,说明系统正在频繁进行内存交换,必须立即排查大内存进程或增加物理内存。

2.3 定位占用内存最高的进程

使用 ps 命令结合排序参数,直接列出内存占用前10的进程:

```bash ps aux --sort=-rss | head -n 10 ```

其中 rss 代表常驻物理内存。对于Java应用,如果内存持续增长且不回落,大概率存在内存泄漏。此时需导出堆内存快照进行分析:

```bash jmap -dump:format=b,file=heap.hprof

Linux生产环境系统排查全流程实战指南

```

三、磁盘I/O瓶颈排查

如果CPU和内存都不高,但系统依然很慢,通常是磁盘I/O出现了瓶颈。

3.1 实时监控磁盘I/O指标

使用 iostat -x -k 1 3 命令,每隔1秒输出一次,共输出3次:

```bash iostat -x -k 1 3 ```

关键指标解读:

  • %util: 设备利用率。如果长期接近100%,说明设备已满载。
  • await: 平均I/O等待时间(毫秒)。包括队列等待时间和设备服务时间。数值越大,性能越差。
  • svctm: 平均设备服务时间。如果 await 远大于 svctm,说明I/O队列太长,请求在排队。

3.2 查找读写频繁的文件

知道哪个磁盘忙(如 sda 或 vdb)后,需要知道是哪个进程在读写。使用 iotop 工具(如果未安装,执行 yum install iotopapt install iotop):

```bash iotop -o ```

参数 -o 表示只显示正在产生I/O的进程。输出中会清晰显示 READWRITE 的速度,以及对应的进程和命令行。

3.3 磁盘空间检查

有时候并非I/O慢,而是磁盘满了导致无法写入日志。执行:

```bash df -h ```

检查 Use% 列。如果达到100%,使用 du -sh / | sort -rh 快速定位根目录下哪个目录占用最大,层层深入直到找到大文件。

四、网络连接与流量排查

网络问题通常表现为连接超时、端口被占满或带宽跑满。

4.1 网络连接状态统计

使用 netstatss 命令统计各种TCP状态的连接数。ss 命令效率更高,推荐使用:

```bash ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k, s[k]}' ```

重点关注以下状态:

  • ESTABLISHED: 当前建立的连接数。如果异常高,检查是否是连接池未释放。
  • TIME_WAIT: 主动关闭连接后等待的时长。如果此状态数量达到数万(如超过 30000),可能会导致端口耗尽,无法发起新连接。

4.2 TIME_WAIT 过多处理

如果 TIME_WAIT 过多,通常是因为服务器主动关闭了大量连接。可以通过调整内核参数优化:

编辑 /etc/sysctl.conf,添加或修改以下配置:

```bash net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 ```

执行 sysctl -p 使配置生效。这允许将TIME_WAIT socket重新用于新的TCP连接,并缩短超时时间。

4.3 实时网卡流量监控

使用 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号 网站地图