Linux系统性能诊断与优化工具集
一、系统总览与进程管理:top命令
top 命令是Linux系统中最常用、最直观的性能监控工具之一,用于实时显示系统中各个进程的资源占用状况。它提供了一个动态更新的视图,帮助用户快速识别CPU、内存等资源的使用瓶颈。
1.1 常用操作与参数
top -d 3:每隔3秒刷新一次进程列表。top -u 用户名:仅显示指定用户启动的进程,例如top -u root。top -p PID:仅显示指定PID的进程,例如top -p 12345。top -o 字段名:根据指定字段进行排序,默认降序。例如top -o %CPU按CPU使用率降序。若要升序,在字段名前加+号,例如top -o +PID。top -i:不显示任何空闲(idle)或僵尸(zombie)进程。top -c:显示完整的命令行而非仅显示命令名。
1.2 结果区段详解
系统统计信息区
顶部通常显示五行系统整体统计信息,与uptime命令输出类似。
top - 14:30:05 up 2 days, 3:45, 2 users, load average: 0.15, 0.22, 0.20
Tasks: 150 total, 2 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.5 us, 1.2 sy, 0.0 ni, 96.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 16000.0 total, 8000.0 free, 4000.0 used, 4000.0 buff/cache
MiB Swap: 8000.0 total, 7000.0 free, 1000.0 used. 3000.0 avail Mem
- 第一行:任务队列信息
14:30:05:当前系统时间。up 2 days, 3:45:系统已运行时间。2 users:当前登录用户数。load average: 0.15, 0.22, 0.20:系统负载平均值,分别表示1分钟、5分钟、15分钟前的平均任务队列长度。
- 第二行:进程状态概览
total:总进程数。running:正在运行的进程数。sleeping:睡眠中的进程数。stopped:停止的进程数。zombie:僵尸进程数。
- 第三行:CPU使用率
us:用户空间占用CPU百分比。sy:内核空间占用CPU百分比。ni:用户进程空间内改变过优先级的进程占用CPU百分比。id:空闲CPU百分比。wa:等待I/O操作的CPU时间百分比。hi:硬件中断占用百分比。si:软件中断占用百分比。st:虚拟机占用百分比(steal time)。
- 第四、五行:内存与交换空间信息
Mem:物理内存信息(total总量,free空闲,used已用,buff/cache缓冲/缓存)。Swap:交换空间信息(total总量,free空闲,used已用)。
进程详细信息区
该区域显示了每个进程的详细指标,以下为主要列的含义:
PID:进程ID。USER:进程所有者的用户名。PR:进程优先级。NI:Nice值,负值表示高优先级,正值表示低优先级。VIRT:进程使用的虚拟内存总量(KB),VIRT = SWAP + RES。RES:进程使用的未被换出的物理内存大小(KB),RES = CODE + DATA。SHR:共享内存大小(KB)。S:进程状态(D=不可中断睡眠, R=运行, S=睡眠, T=停止, Z=僵尸)。%CPU:上次更新到现在的CPU时间占用百分比。%MEM:进程使用的物理内存百分比。TIME+:进程使用的CPU时间总计(百分之一秒)。COMMAND:命令名或完整命令行。
1.3 top交互式操作
在top运行时,可使用以下快捷键进行交互:
m:切换内存信息显示模式。t:切换进程和CPU状态信息显示模式。c:切换显示命令名或完整命令行。f或F:选择或取消显示特定列。o或O:改变显示列的顺序。M:按内存使用量(%MEM)排序。P:按CPU使用率(%CPU)排序。T:按运行时间(TIME+)排序。R:反转当前排序顺序(降序/升序切换)。k:终止(kill)进程,会提示输入PID和信号。r:重新调整进程的nice值。s:修改刷新间隔时间。q:退出top。W:将当前配置写入~/.toprc文件。
过滤进程
- 按用户过滤:在
top界面按u,然后输入用户名。 - 按表达式过滤:在
top界面按o,然后输入过滤表达式,例如:COMMAND=java或%CPU>10。
1.4 top输出到文件
要将top的输出重定向到文件,可以使用-n指定刷新次数,-b启用批处理模式:
# 示例:记录特定进程的CPU和内存使用情况到日志文件
#!/bin/bash
LOG_FILE="process_monitor.log"
TARGET_PROCESS_NAME="my_app_process" # 替换为你关心的进程名
REFRESH_INTERVAL=5 # 刷新间隔,单位秒
echo "监控进程: $TARGET_PROCESS_NAME" >> "$LOG_FILE"
echo "开始时间: $(date)" >> "$LOG_FILE"
echo "---------------------------------------------------" >> "$LOG_FILE"
while true; do
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
PROCESS_INFO=$(top -b -n 1 | grep "$TARGET_PROCESS_NAME")
if [ -n "$PROCESS_INFO" ]; then
echo "$TIMESTAMP $PROCESS_INFO" >> "$LOG_FILE"
else
echo "$TIMESTAMP $TARGET_PROCESS_NAME 未找到或已退出." >> "$LOG_FILE"
fi
sleep "$REFRESH_INTERVAL"
done
二、磁盘I/O性能监控工具
2.1 top命令中的I/O等待
在top命令的CPU统计信息中,wa%(I/O等待百分比)是一个关键指标。如果wa%持续较高,可能意味着系统存在严重的磁盘I/O瓶颈,或者也可能与其他I/O密集型操作(如网络I/O)相关。
2.2 sar命令:全面系统活动报告
sar命令(System Activity Reporter)是sysstat工具包的一部分,能提供详细的系统活动报告,包括CPU、内存、磁盘、网络等。它特别适用于长期性能趋势分析。
查看磁盘I/O性能:
sar -d -p 1 2
其中,-d表示监控磁盘活动,-p将设备名称以标准格式(如sda、sdb)显示,1表示每隔1秒采样一次,2表示总共采样2次。
输出字段解释:
DEV:设备名称。tps:每秒传输次数。rd_sec/s:每秒从设备读取的扇区数。wr_sec/s:每秒写入设备的扇区数。avgrq-sz:平均每次I/O请求的大小(扇区数)。avgqu-sz:平均I/O队列长度。await:平均每次I/O操作的等待时间(毫秒)。此时间包括队列等待时间和实际服务时间。svctm:平均每次I/O操作的服务时间(毫秒)。%util:设备有I/O请求的百分比(即设备忙碌的百分比)。
性能判断标准:
svctm值通常应小于await值。如果await远高于svctm,表明I/O请求在队列中等待时间过长,磁盘性能可能存在瓶颈。%util接近100%时,表明磁盘I/O系统已满负荷运行。
查看历史sar日志文件(通常位于/var/log/sa/):
sar -d -p -f /var/log/sa/saXX | more
其中saXX是日期对应的日志文件,例如sa11表示11号的日志。
2.3 iostat命令:设备I/O统计
iostat命令主要用于监控系统设备的I/O负载情况。它能提供设备I/O的详细统计信息。
示例:
iostat -dxk 1 2
-d显示设备使用率,-x显示扩展统计信息,-k以KB为单位显示数据,1表示每秒刷新一次,2表示刷新两次。
iostat的输出包含与sar类似的await、svctm、%util等关键指标,其判断标准也类似。
2.4 vmstat命令:虚拟内存统计
vmstat命令可以报告虚拟内存统计信息,包括进程、内存、分页、块I/O和CPU活动。
示例:
vmstat 2
输出中的bi和bo字段与磁盘I/O性能相关:
bi:每秒从块设备接收的块数(入,例如读取文件)。bo:每秒发送到块设备的块数(出,例如写入文件)。
这些值接近0通常表示I/O活动不频繁。若持续较高,可能表明频繁的磁盘I/O操作。
三、磁盘I/O性能测试工具
3.1 hdparm命令:硬盘参数设定与测试
hdparm命令用于读取和设置IDE或SCSI硬盘参数,也可用于测试磁盘的读取性能。
测试设备/dev/sdb1的读取速率:
hdparm -Tt /dev/sdb1
输出会显示缓存读取速度和直接磁盘读取速度。直接磁盘读取速度更能反映真实磁盘性能。
3.2 dd命令:文件复制与简单I/O测试
dd命令是Linux下强大的数据复制工具,也可用于粗略测试磁盘的读写性能。
测试写入性能:
time dd if=/dev/zero of=output_data.bin bs=1M count=2048 oflag=direct
if=/dev/zero:从伪设备/dev/zero读取空字符流,不产生实际I/O负担。of=output_data.bin:写入到指定文件。bs=1M:设置块大小为1MB。count=2048:写入2048个块,即2GB数据。oflag=direct:强制直接写入磁盘,不使用文件系统缓存,更能反映真实磁盘性能。
命令执行后会输出写入速度。
测试读取性能:
time dd if=output_data.bin of=/dev/null bs=1M iflag=direct
if=output_data.bin:从之前创建的文件读取数据。of=/dev/null:将读取的数据输出到伪设备/dev/null,不产生实际I/O。iflag=direct:强制直接从磁盘读取,不使用文件系统缓存。
命令执行后会输出读取速度。
3.3 fio命令:专业I/O性能测试
fio(Flexible I/O Tester)是一个高度灵活且专业的I/O性能测试工具,常用于衡量IOPS(每秒I/O操作数)、吞吐量和延迟等指标,比dd命令更为精确和全面。
以下是一些常用fio测试场景的示例:
# 顺序读取测试
fio --name=seq_read_test --filename=/tmp/fio_test_file --direct=1 --iodepth=16 --rw=read --ioengine=libaio --bs=64k --size=4G --numjobs=4 --runtime=120 --group_reporting
# 随机写入测试
fio --name=rand_write_test --filename=/tmp/fio_test_file --direct=1 --iodepth=64 --rw=randwrite --ioengine=libaio --bs=4k --size=4G --numjobs=8 --runtime=120 --group_reporting
# 顺序写入测试
fio --name=seq_write_test --filename=/tmp/fio_test_file --direct=1 --iodepth=32 --rw=write --ioengine=libaio --bs=128k --size=8G --numjobs=2 --runtime=180 --group_reporting
# 混合随机读写测试 (70%读, 30%写)
fio --name=mixed_rand_rw_test --filename=/tmp/fio_test_file --direct=1 --iodepth=32 --rw=randrw --rwmixread=70 --ioengine=libaio --bs=8k --size=4G --numjobs=4 --runtime=120 --group_reporting --ioscheduler=noop
常用参数说明:
--name:作业名称。--filename:测试文件路径。--direct=1:使用直接I/O,绕过文件系统缓存。--iodepth:I/O队列深度。--rw:读写模式(read, write, randread, randwrite, randrw)。--ioengine:I/O引擎(libaio, psync等)。--bs:块大小。--size:测试文件大小。--numjobs:并发作业数。--runtime:运行时间(秒)。--group_reporting:汇总所有作业的统计信息。--rwmixread:随机读写模式下,读操作的百分比。
四、其他系统性能分析工具
4.1 watch命令:周期性执行命令
watch命令可以周期性地执行一个命令,并全屏显示其输出结果,便于持续监控某些动态信息。
示例:
watch -n 2 'ps -eo pcpu,pid,user,args | sort -k 1 -r | head -n 10'
该命令每2秒刷新一次,显示当前CPU使用率最高的10个进程。
-n 间隔秒数:指定刷新间隔。-d:高亮显示变化的区域。
4.2 ps命令:查看进程与线程信息
ps命令用于报告当前系统的进程状态。结合不同参数可以查看线程或按资源排序。
- 查看线程:
ps -eLf | grep 目标进程名。 - 显示占用CPU最多的进程:
ps -eo pcpu,pid,user,args | sort -k 1 -r | head -n 20此命令显示CPU使用率、PID、用户、命令参数,并按CPU使用率降序排列,取前20条。
4.3 mpstat命令:多核CPU统计
mpstat(MultiProcessor Statistics)用于报告单个或所有CPU的活动情况,特别适用于多核系统。
语法:mpstat [-P {CPU_ID|ALL}] [间隔秒数 [次数]]
mpstat:默认显示自系统启动以来所有CPU核心的平均使用情况。mpstat -P 0:显示编号为0的CPU核心的使用情况。mpstat -P ALL:显示所有CPU核心的详细使用情况。mpstat -P ALL 2 5:每2秒采集一次所有CPU核心的数据,总共采集5次。
五、高级系统活动监控工具:atop
atop是一个功能强大的Linux系统性能监控工具,不仅能实时显示系统资源(CPU、内存、磁盘、网络)和进程运行情况,还能以日志文件的形式周期性地保存数据,便于事后分析和问题排查。其独特之处在于能够详细展示进程资源消耗的增量变化。
5.1 基本使用与日志管理
- 实时监控:直接运行
atop。 - 保存日志:
atop -w /var/log/atop/atop_$(date +%Y%m%d).log。 - 查看历史日志:
atop -r /var/log/atop/atop_YYYYMMDD.log。- 在查看日志时,按
t键可前进到下一个采样点,按T键退回到上一个采样点。 - 按
b键可按时间跳转到指定时刻(格式 hh:mm)。
- 在查看日志时,按
atop日志配置
atop的日志文件默认存储在/var/log/atop/目录下,以atop_YYYYMMDD格式命名。默认采集频率和保留时间可在配置文件/etc/atop/atop.daily中修改:
# /etc/atop/atop.daily 示例片段
# ...
INTERVAL=300 # 默认每5分钟采集一次,可修改为60(1分钟)或30(30秒)
# ...
( (sleep 3; find $LOGPATH -name 'atop_*' -mtime +14 -exec rm {} \;)& ) # 默认保留最近28天数据,可修改为+7(7天)
# ...
exec $BINPATH/atop -a -R -w $LOGPATH/atop_$CURDAY $INTERVAL > $LOGPATH/daily.log 2>&1
修改INTERVAL和-mtime参数即可调整采集频率和日志保留周期。
5.2 atop监控字段详解
atop的输出分为多个主要列,提供系统各方面的详细数据:
- ATOP:显示主机名、采样日期和时间。
- PRC:进程整体运行统计。
sys,usr:进程在内核态和用户态的CPU时间。#proc:总进程数。#zombie:僵尸进程数。#exit:采样周期内退出的进程数。
- CPU:整体CPU使用率。
sys,usr:CPU用于内核态和用户态进程的时间比例。irq:处理中断的时间比例。idle:完全空闲时间比例。wait:CPU等待I/O的时间比例。
- cpu:单个CPU核心使用率(若多核)。
- CPL:CPU负载信息。
avg1,avg5,avg15:1、5、15分钟系统负载平均值。csw:上下文切换次数。intr:中断发生次数。
- MEM:内存使用情况。
tot:物理内存总量。free:空闲内存。cache:页缓存。buff:文件缓存。slab:内核Slab占用内存。
- SWP:交换空间使用情况。
tot:交换区总量。free:空闲交换空间。
- PAG:虚拟内存分页活动。
swin,swout:换入和换出内存页数。
- DSK:磁盘使用情况(每个磁盘设备一列)。
设备名:磁盘设备标识(如sda)。busy:磁盘忙碌百分比。read,write:读写请求数量。
- NET:网络状况(多列,包括TCP、UDP、IP层及网口信息)。
XXXi:接收包数量。XXXo:发送包数量。
5.3 atop视图与快捷键
atop提供了多种视图模式,可按快捷键切换:
g:通用信息视图(默认)。m:内存视图。c:命令行视图(显示完整命令行,有助于区分同名进程)。d:磁盘I/O视图。n:网络视图(需安装netatop内核模块)。u:按用户统计资源使用。p:显示每个进程的详细资源占用(CPU、内存、I/O)。P (大写):通过正则表达式过滤进程。q:退出atop。
5.4 atopsar命令
atopsar是atop工具包中的另一个实用程序,类似于sar,用于从atop日志文件中提取和显示历史系统性能数据。它主要提供全局系统信息,而非特定进程详情。
示例:
atopsar -c 60 5:实时显示CPU使用情况,每60秒刷新一次,共5次。atopsar -A -b 10:00 -e 10:30 -r atop_20231026:从指定日期的atop日志文件中,提取10:00到10:30期间的所有(-A)系统活动报告。atopsar -O:显示CPU占用率最高的3个进程。atopsar -G:显示内存占用率最高的3个进程。atopsar -D:显示磁盘I/O占用率最高的3个进程。atopsar -N:显示网络I/O占用率最高的3个进程。
六、性能监控工具对比
- top:实时、动态显示进程和系统资源概览,交互性强,但不记录历史数据。
- htop:
top的增强版,提供更友好的交互界面、鼠标支持、横向/纵向滚动、进程树视图等,但同样不记录历史数据。 - iftop:专注于实时监控网络流量,显示本机与远程主机间的流量。
- iotop:专注于实时监控磁盘I/O活动,显示哪些进程正在进行大量的磁盘读写。
- atop:功能最全面,除了实时监控外,还能周期性地将系统活动记录到日志文件中,支持事后分析,并提供更细致的进程资源消耗增量报告。适合长期性能趋势分析和故障诊断。
- mpstat/sar/iostat/vmstat:这些是命令行工具,提供特定资源(CPU、磁盘、内存)的统计报告,可用于实时监控和历史数据分析,但不如
top/atop直观易用。