前言

在服务器运维中,系统性能调优是永恒的主题。当用户抱怨 “系统卡”“响应慢” 时,如何快速定位瓶颈、找到解决方案?这需要我们掌握系统调优的思路,以及一套实用的性能分析工具。本文将从调优思路出发,详细介绍 CPU、内存、IO、网络等子系统的监控工具,帮你从 “猜问题” 变成 “精准定位问题”。

一、系统调优:从 “平衡” 角度看性能

性能优化不是 “盲目调参”,而是让系统各子系统(CPU、内存、磁盘、网络、应用)达到动态平衡。就像医生看病需要 “望闻问切”,系统调优也需要一套科学的流程。

1. 系统调优的核心思路

性能问题的本质是 “资源供需不匹配”—— 某个子系统的负载超过了其承载能力,进而影响整个系统。调优的步骤可总结为:

  1. 监控状态:收集 CPU、内存、磁盘、网络、应用的实时数据;
  2. 定位瓶颈:分析数据,判断哪个子系统是 “短板”(如 CPU 使用率过高、内存不足、磁盘 IO 阻塞等);
  3. 优化调整:针对瓶颈采取措施(如升级硬件、调整配置、优化应用)。

2. 子系统的 “连锁反应”

系统各子系统相互依赖,一个环节出问题可能引发连锁反应:

  • 大量网络请求(高带宽)会增加 CPU 的中断处理开销;
  • 内存不足时,系统会频繁将数据写入 swap 分区,导致磁盘 IO 飙升;
  • 磁盘 IO 阻塞会让进程陷入等待,进而使 CPU 的 “iowait” 升高,看似 “CPU 忙”,实则是 “等 IO”。

因此,定位瓶颈时不能只看单一指标,需结合多个子系统的状态综合判断。

二、CPU 负载监控:从 “平均负载” 到 “核心细节”

CPU 是系统的 “大脑”,其负载直接影响响应速度。监控 CPU 需从 “整体负载” 和 “核心使用率” 两个维度入手。

1. uptime:快速判断整体负载

uptime是最基础的负载查看工具,能瞬间告诉你系统的 “繁忙程度”。

用法:直接执行命令,输出包含 4 部分信息:

[root@server ~]# uptime
14:30:15 up 7 days,  2:10,  3 users,  load average: 0.85, 1.20, 0.98
  • 14:30:15:当前时间;
  • up 7 days:系统运行时长;
  • 3 users:当前登录用户数;
  • load average: 0.85, 1.20, 0.98:1 分钟、5 分钟、15 分钟的系统平均负载(任务队列长度)。

关键解读:如何判断负载过高?
系统平均负载是 “等待运行的进程数 + 正在运行的进程数”。判断是否过高需结合 CPU 核心数:

  • 1 核 CPU:1 分钟负载>3 视为过高;
  • 4 核 CPU:1 分钟负载>12 视为过高(核心数 ×3)。
示例:

服务器 1(1 核):load average: 0.15, 0.08, 0.01 → 负载低;
服务器 2(1 核):load average: 4.15, 6.08, 6.01 → 负载过高(远超 3);
服务器 3(4 核):load average: 10.15, 10.08, 10.01 → 负载正常(未超 12)。

2. mpstat:深入分析 CPU 核心使用率

uptime只能看整体,mpstat可以查看单个 CPU 核心的详细状态(如用户态、内核态、等待 IO 的时间占比),帮你定位 “哪个核心在忙”“为什么忙”。

安装mpstat属于sysstat工具包,需先安装:

# Ubuntu/Debian
sudo apt install sysstat -y

# CentOS/RHEL
sudo yum install sysstat -y

常用命令

  • 查看所有 CPU 核心状态:
    mpstat -P ALL  # -P ALL表示显示所有核心(0,1,2...)
    
  • 实时监控(1 秒刷新 1 次,共 10 次):
    mpstat -P ALL 1 10
    

输出参数解读

参数 含义 关键关注点
usr 用户态 CPU 使用率(应用程序消耗) 过高可能是应用代码效率低
sys 内核态 CPU 使用率(系统调用、中断等) 过高可能是内核操作频繁(如 IO)
iowait CPU 等待 IO 完成的时间占比 过高说明磁盘 IO 是瓶颈
idle CPU 空闲时间占比 过低说明 CPU 资源紧张

案例:若iowait长期>30%,即使usrsys不高,系统也会卡顿 —— 因为 CPU 大部分时间在 “等磁盘”。此时瓶颈不在 CPU,而在磁盘 IO。

三、内存监控:从 “总量” 到 “活性”

内存是系统的 “高速缓存”,内存不足会导致频繁的 “swap 交换”,严重影响性能。监控内存不仅要看 “用了多少”,更要关注 “哪些内存能释放”。

1. free:快速查看内存使用概况

free命令直观展示内存总量、使用量、空闲量,以及 buffer/cache 和 swap 的状态。

常用命令:以 MB 为单位显示(更易读):

free -m

输出示例(CentOS 7+):

              total        used        free      shared  buff/cache   available
Mem:           1992         692         817         17         482        1100
Swap:          1023           0        1023

参数解读

  • total:总物理内存;
  • used:已使用的内存(包括应用、内核、缓存);
  • free:完全空闲的内存(未被任何进程使用);
  • buff/cache:缓冲区(buffer)和缓存(cache)—— 临时存储磁盘数据,可被释放;
  • available真正可用的内存(= free + 可释放的 buff/cache),是判断内存是否充足的核心指标。

2. /proc/meminfo:深入内存 “活性”

/proc/meminfo提供更详细的内存细分,尤其是 “活跃内存” 和 “非活跃内存”,帮你判断内存是否可回收。

查看命令

cat /proc/meminfo | grep -E "Active|Inactive"

关键参数

  • Active(anon):活跃的匿名内存(进程正在频繁读写的内存,如应用数据),难以释放;
  • Inactive(anon):非活跃的匿名内存(进程很久没访问的内存),内存不足时可被交换到 swap;
  • Active(file)/Inactive(file):与文件关联的内存(如缓存的文件数据),可随文件关闭释放。

调优启示

  • Inactive(anon)占比高,增加 swap 分区可缓解内存压力;
  • Active(anon)占比高,说明应用确实需要大量内存,需升级物理内存。

3. 找出 “内存大户”:定位内存泄漏

available持续过低,需找出消耗内存最多的进程,判断是否存在内存泄漏。

方法 1top命令按内存排序

top  # 进入后按大写“M”,进程按内存使用率从高到低排序

方法 2ps命令输出并排序

ps -aux --sort -rss  # --sort -rss表示按物理内存(RSS)降序排列

RSS(Resident Set Size)是进程实际使用的物理内存,更能反映真实内存消耗。

四、磁盘 IO 监控:从 “整体负载” 到 “进程细节”

磁盘 IO 是系统最 “慢” 的子系统(机械硬盘速度约为内存的万分之一),很容易成为瓶颈。监控磁盘需关注 “哪个磁盘忙”“哪个进程在大量读写”。

1. 查看文件系统块大小:匹配应用需求

不同文件系统(ext4、xfs)的块大小影响 IO 效率(如小文件适合小 block,大文件适合大 block)。

  • ext4 文件系统
    tune2fs -l /dev/sda1 | grep "Block size"  # /dev/sda1为目标分区
    
  • xfs 文件系统
    xfs_growfs -l /dev/sda1 | grep "bsize"
    

2. iostat:判断磁盘整体负载

iostat(来自sysstat包)可查看磁盘的读写吞吐量、IOPS(每秒 IO 次数),判断是否存在 IO 瓶颈。

常用命令

  • 查看所有磁盘及分区的 IO 状态(以 KB 为单位):
    iostat -d -k -p ALL  # -d:只显示磁盘;-k:KB单位;-p ALL:显示所有分区
    

输出参数解读

参数 含义 关键关注点
kB_read/s 每秒读取的 KB 数 反映读吞吐量
kB_wrtn/s 每秒写入的 KB 数 反映写吞吐量
tps 每秒 IO 请求次数(IOPS) 机械硬盘 TPS 通常<200,过高则瓶颈

案例:执行dd if=/dev/zero of=test.img bs=10M count=1000; sync(生成大文件并刷盘),同时用iostat观察,会发现kB_wrtn/stps显著升高。

3. iotop:定位 “IO 大户” 进程

当磁盘 IO 高时,iotop可直接显示哪个进程在大量读写磁盘,帮你快速锁定 “罪魁祸首”。

安装

# Ubuntu/Debian
sudo apt install iotop -y

# CentOS/RHEL
sudo yum install iotop -y

常用命令

  • 只显示正在读写磁盘的进程(实时刷新):
    iotop -o -d 1  # -o:只显示有IO活动的进程;-d 1:1秒刷新1次
    

快捷键

  • o:切换 “只显示 IO 进程”;
  • p:切换 “进程 / 线程” 视图;
  • r:反向排序;
  • q:退出。

实战场景:系统卡顿,CPU 和内存使用率不高,但打开文件慢 —— 用iotop发现某进程kB_wrtn/s持续>100MB/s,说明该进程频繁写磁盘导致 IO 阻塞。

五、网络监控:从 “整体带宽” 到 “进程流量”

网络瓶颈常表现为 “外部访问慢”“下载 / 上传卡顿”。监控网络需关注 “总带宽使用” 和 “哪个进程在占用流量”。

1. nload:实时监控整体带宽

nload以图形化方式展示网卡的流入(Incoming)和流出(Outgoing)带宽,直观判断网络是否饱和。

安装

# Ubuntu/Debian
sudo apt install nload -y

# CentOS/RHEL(需先装EPEL源)
sudo yum install epel-release -y
sudo yum install nload -y

使用:直接执行nload,默认显示所有网卡的实时带宽,按左右箭头切换网卡。

2. nethogs:定位 “流量大户” 进程

当带宽异常(如被 IDC 警告 “流量超标”),nethogs可按进程显示网络占用,帮你找到 “偷偷上传 / 下载” 的程序。

安装

# Ubuntu/Debian
sudo apt install nethogs -y

# CentOS/RHEL
sudo yum install nethogs -y

使用

nethogs  # 默认监控所有网卡,按q退出

输出解读:显示每个进程的发送(Sent)和接收(Received)速率,单位为 KB/s 或 MB/s。

实战场景:服务器带宽突然飙升,用nethogs发现wget进程在大量下载文件 —— 原来是某脚本被植入了自动下载任务。

六、系统整体状态:vmstat 与 sar 的 “全局视角”

当系统卡顿严重时,top等工具可能因资源占用过高而无法正常运行。此时vmstat(轻量)和sar(历史记录)是更好的选择。

1. vmstat:一站式监控 CPU、内存、IO

vmstat(virtual memory statistics)可同时输出 CPU、内存、swap、IO 的关键指标,适合快速判断系统整体瓶颈。

常用命令

vmstat 1 5  # 1秒刷新1次,共5次

输出参数解读

类别 参数 含义 关键关注点
进程 r 等待 CPU 的进程数(运行队列长度) 超过 CPU 核心数则 CPU 不足
b 阻塞的进程数(等待 IO) 过高说明 IO 瓶颈
内存 free 空闲内存(KB) 结合available判断内存是否充足
buff 缓冲区大小(KB) 与磁盘读相关
cache 缓存大小(KB) 与磁盘写相关
swap si 从 swap 读入内存的速率(KB/s) 频繁非 0 说明内存不足
so 从内存写入 swap 的速率(KB/s) 同上
IO bi 从磁盘读入内存的速率(块 /s) 反映读 IO 强度
bo 从内存写入磁盘的速率(块 /s) 反映写 IO 强度
CPU us 用户态 CPU 占比 同 mpstat 的usr
sy 内核态 CPU 占比 同 mpstat 的sys
id 空闲 CPU 占比 过低说明 CPU 紧张
wa 等待 IO 的 CPU 占比 同 mpstat 的iowait

2. sar:记录与查询历史性能数据

sar(system activity reporter)可定时记录系统状态(默认每 10 分钟一次),存于/var/log/sa目录,适合事后分析 “过去某段时间的性能问题”。

常用命令

  • 实时监控 CPU(2 秒 1 次,共 5 次)并保存到文件:
    sar -u 2 5 -o cpu_history.sar  # -o:保存到二进制文件
    
  • 查看历史记录(如昨天的 CPU 数据):
    sar -u -f /var/log/sa/sa$(date +%d -d yesterday)  # saXX中的XX为日期
    

参数解读:与mpstat类似,重点关注%iowait(IO 等待)和%idle(空闲)。

总结:系统调优的 “方法论”

系统调优的核心不是 “记住工具命令”,而是 “建立瓶颈定位的思维”:

  1. 先整体后局部:用uptimevmstat判断系统整体状态,再用专项工具(mpstatiotop)深入子系统;
  2. 关联分析:CPU 的iowait高→查磁盘 IO;内存available低且si/so高→内存不足;
  3. 结合业务:不同业务瓶颈不同(Web 服务器可能瓶颈在 CPU / 网络,数据库服务器可能瓶颈在内存 / 磁盘)。

掌握本文介绍的工具,你就能从 “系统卡怎么办” 的迷茫,变成 “用数据说话” 的精准调优 —— 这才是运维效率的核心。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐