当前位置:首页 > 技术 > 正文内容

Linux系统性能诊断与优化工具集

访客 技术 2026年8月25日 1

一、系统总览与进程管理: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:切换显示命令名或完整命令行。
  • fF:选择或取消显示特定列。
  • oO:改变显示列的顺序。
  • 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类似的awaitsvctm%util等关键指标,其判断标准也类似。

2.4 vmstat命令:虚拟内存统计

vmstat命令可以报告虚拟内存统计信息,包括进程、内存、分页、块I/O和CPU活动。

示例:

vmstat 2

输出中的bibo字段与磁盘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命令

atopsaratop工具包中的另一个实用程序,类似于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:实时、动态显示进程和系统资源概览,交互性强,但不记录历史数据。
  • htoptop的增强版,提供更友好的交互界面、鼠标支持、横向/纵向滚动、进程树视图等,但同样不记录历史数据。
  • iftop:专注于实时监控网络流量,显示本机与远程主机间的流量。
  • iotop:专注于实时监控磁盘I/O活动,显示哪些进程正在进行大量的磁盘读写。
  • atop:功能最全面,除了实时监控外,还能周期性地将系统活动记录到日志文件中,支持事后分析,并提供更细致的进程资源消耗增量报告。适合长期性能趋势分析和故障诊断。
  • mpstat/sar/iostat/vmstat:这些是命令行工具,提供特定资源(CPU、磁盘、内存)的统计报告,可用于实时监控和历史数据分析,但不如top/atop直观易用。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。