系统监控命令
系统监控命令用于查看和分析系统的性能、资源使用情况和运行状态,是系统调优和故障排查的重要工具。
free - 显示内存使用情况
命令简介
free 命令用于显示系统的内存使用情况,包括物理内存(RAM)、交换空间(swap)和内核缓冲区(buffers/cache)的使用情况。该命令对于系统监控和性能调优非常有用。
语法格式
bash
free [选项]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-b | 以字节(Bytes)为单位显示 | free -b |
-k | 以KB为单位显示(默认) | free -k |
-m | 以MB为单位显示 | free -m |
-g | 以GB为单位显示 | free -g |
-h | 人类可读格式(自动转换单位) | free -h |
-s N | 每N秒刷新一次 | free -s 2 |
-c N | 刷新N次后退出 | free -c 5 -s 1 |
-t | 显示总计行(RAM + swap) | free -t |
--help | 显示帮助信息 | free --help |
经典案例
bash
# 以人类可读格式显示内存使用情况(推荐)
free -h
# 每2秒刷新一次内存信息(类似动态监控)
free -s 2
# 以MB为单位显示,并显示总计行
free -m -t
# 监控内存变化(刷新5次,每次间隔1秒)
free -c 5 -s 1 -h输出解析
典型 free -h 输出示例:
total used free shared buff/cache available
Mem: 15Gi 4.2Gi 2.1Gi 1.2Gi 8.7Gi 9.5Gi
Swap: 2.0Gi 0.0Gi 2.0Gi- total: 总内存
- used: 已使用内存(包括buffers/cache)
- free: 完全空闲的内存
- shared: 共享内存(通常由多个进程使用)
- buff/cache: 内核缓冲区和缓存(可被快速回收)
- available: 估算的可用内存(包括可回收的cache)
注意事项
free和available的区别:free是完全未被使用的内存available是系统估算的"实际可用"内存(包括可回收的buffers/cache)
交换空间(swap)使用:
- 如果
swap使用率持续很高,可能表示物理内存不足
- 如果
buff/cache的作用:- Linux会利用空闲内存缓存磁盘数据,这部分内存会在需要时自动释放,不要误判为内存泄漏
监控建议:
- 长期监控建议使用
vmstat或sar - 调试内存问题时建议结合
top/htop查看具体进程
- 长期监控建议使用
单位选择:
- 在脚本中建议使用
-k(KB)或-b(Bytes)避免单位混淆 - 交互式查看推荐
-h(人类可读格式)
- 在脚本中建议使用
vmstat - 虚拟内存统计监控工具
简介
vmstat(Virtual Memory Statistics)是Linux系统中用于监控系统虚拟内存、进程、CPU活动等性能数据的命令行工具。它能实时显示系统的内存使用情况、进程状态、CPU利用率、磁盘IO等关键指标,是系统性能分析和故障排查的重要工具。
语法格式
bash
vmstat [选项] [时间间隔] [次数]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-a | 显示活跃和非活跃内存 | vmstat -a |
-f | 显示系统启动后的fork次数 | vmstat -f |
-m | 显示slabinfo信息 | vmstat -m |
-n | 不自动更新标题行 | vmstat -n 1 5 |
-s | 显示内存统计事件计数器 | vmstat -s |
-d | 显示磁盘统计信息 | vmstat -d |
-p 分区 | 显示指定分区统计信息 | vmstat -p /dev/sda1 |
-S 单位 | 指定内存显示单位(k/K/m/M) | vmstat -S M |
-t | 在输出中增加时间戳 | vmstat -t 1 |
-w | 宽输出模式 | vmstat -w |
输出字段解析
bash
# 示例输出(vmstat 1 3)
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 279868 210332 1390760 0 0 2 1 42 56 1 1 98 0 0
0 0 0 279868 210332 1390760 0 0 0 0 44 60 0 1 99 0 0
2 0 0 279868 210332 1390760 0 0 0 0 42 55 1 1 98 0 0Procs(进程)
| 列 | 字段 | 描述 |
|---|---|---|
| 1 | r | 运行队列中的进程数(正在运行或等待CPU的进程) |
| 2 | b | 处于不可中断睡眠状态的进程数(通常是等待I/O) |
Memory(内存)
| 列 | 字段 | 描述 |
|---|---|---|
| 3 | swpd | 使用的虚拟内存大小(KB) |
| 4 | free | 空闲的物理内存大小(KB) |
| 5 | buff | 用作缓冲区的内存大小(KB) |
| 6 | cache | 用作缓存的内存大小(KB) |
Swap(交换区)
| 列 | 字段 | 描述 |
|---|---|---|
| 7 | si | 每秒从磁盘读入的内存大小(KB/s,swap in) |
| 8 | so | 每秒写入磁盘的内存大小(KB/s,swap out) |
IO(磁盘)
| 列 | 字段 | 描述 |
|---|---|---|
| 9 | bi | 每秒从块设备接收的块数(blocks/s) |
| 10 | bo | 每秒发送到块设备的块数(blocks/s) |
System(系统)
| 列 | 字段 | 描述 |
|---|---|---|
| 11 | in | 每秒中断次数(包括时钟中断) |
| 12 | cs | 每秒上下文切换次数 |
CPU(处理器)
| 列 | 字段 | 描述 |
|---|---|---|
| 13 | us | 用户进程占用CPU时间百分比 |
| 14 | sy | 系统进程占用CPU时间百分比 |
| 15 | id | 空闲CPU时间百分比 |
| 16 | wa | 等待I/O的CPU时间百分比 |
| 17 | st | 被虚拟机偷取的时间百分比(虚拟化环境) |
经典案例
bash
# 每2秒刷新一次,共刷新5次
vmstat 2 5
# 监控系统内存和CPU使用情况(MB单位显示)
vmstat -S M 1
# 显示磁盘IO统计信息
vmstat -d
# 结合watch命令持续监控
watch -n 1 vmstat注意事项
- 不带参数运行时,vmstat显示自系统启动以来的平均统计
- 第一个时间间隔的数值是自系统启动以来的平均值
- 在高负载系统中,vmstat本身可能会影响性能数据
- 分析结果时要重点关注:
- r(运行队列)持续大于CPU核心数
- b(阻塞进程数)持续不为0
- si/so(内存交换)持续不为0
- 建议在性能分析时结合其他工具如top、iostat等一起使用
iostat - 系统I/O统计监控工具
命令简介
iostat是Linux系统性能监控工具集sysstat的一部分,用于监控系统CPU使用率和设备(磁盘)、分区、网络文件系统的I/O统计信息。特别适用于发现磁盘I/O瓶颈和性能问题。
语法格式
bash
iostat [选项] [间隔时间] [次数]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-c | 只显示CPU使用情况 | iostat -c |
-d | 只显示设备I/O统计 | iostat -d |
-x | 显示扩展I/O统计信息 | iostat -x |
-k | 以KB为单位显示 | iostat -k |
-m | 以MB为单位显示 | iostat -m |
-p | 显示块设备及分区统计 | iostat -p sda |
-t | 显示时间戳 | iostat -t |
-y | 跳过首次统计(显示变化率) | iostat -y |
-N | 显示设备映射名称 | iostat -N |
-h | 人类可读格式 | iostat -h |
输出字段说明
CPU统计:
%user:用户级别CPU使用率%nice:nice优先级进程CPU使用率%system:系统级别CPU使用率%iowait:CPU等待I/O时间百分比%steal:虚拟环境被偷取CPU时间%idle:CPU空闲时间
设备I/O统计:
r/s:每秒读请求数w/s:每秒写请求数rkB/s:每秒读取数据量(KB)wkB/s:每秒写入数据量(KB)rrqm/s:每秒合并读请求数wrqm/s:每秒合并写请求数%util:设备带宽利用率(关键指标)
经典案例
bash
# 基本使用(显示一次所有信息)
iostat
# 每2秒刷新一次,共显示5次
iostat 2 5
# 只显示磁盘统计(扩展信息)
iostat -dx 1 3
# 监控特定磁盘(sda)的详细I/O
iostat -xmp sda 2
# 结合时间戳监控CPU和磁盘
iostat -t -c -d 1
# 检查LVM逻辑卷性能
iostat -Nx 1注意事项
- 首次统计显示的是系统启动以来的平均值,后续显示的是间隔时间内的变化率
%util接近100%表示设备饱和,但SSD/NVMe设备可能因并行处理能力高而不同- 高
await(平均I/O等待时间)可能指示磁盘瓶颈 - 需要安装
sysstat包(yum install sysstat或apt install sysstat) - 在生产环境中建议使用
-x选项获取更详细的性能指标 - 对于NVMe设备,建议使用
iostat -xmdz 1显示更完整的统计信息
uptime - 显示系统运行时间及负载
命令简介
uptime命令用于显示系统已经运行了多长时间、当前有多少用户登录以及系统在过去的1分钟、5分钟和15分钟内的平均负载。这是一个快速了解系统运行状态的基础命令。
语法格式
bash
uptime [选项]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-p | 以简洁格式显示运行时间 | uptime -p |
-s | 显示系统启动时间 | uptime -s |
-h | 显示帮助信息 | uptime -h |
-V | 显示版本信息 | uptime -V |
经典案例
bash
# 标准输出格式(包含时间/用户数/负载)
uptime
# 输出示例: 15:32:40 up 3 days, 2:17, 2 users, load average: 0.15, 0.21, 0.30
# 简洁模式显示运行时间
uptime -p
# 输出示例:up 3 days, 2 hours
# 查看系统启动时间
uptime -s
# 输出示例:2024-03-01 13:15:22注意事项
- 负载平均值显示在最后三个字段中,分别代表1分钟、5分钟和15分钟内的系统负载。这些数值是运行队列中进程数的平均值(包括正在运行的进程和等待CPU的进程)。
- 在多核CPU系统中,负载值除以CPU核心数可以判断系统是否过载。例如4核CPU的负载值为4.00表示完全利用。
- 该命令信息来自
/proc/uptime和/proc/loadavg文件,普通用户也可执行。 - 在嵌入式系统或特殊环境中,可能不支持
-p或-s等选项。
tcpdump - 网络数据包抓取分析工具
命令简介
tcpdump是Linux系统中最强大的网络抓包分析工具,能够捕获流经指定网络接口的数据包,支持多种过滤条件,可实时显示或保存为pcap文件供后续分析。广泛用于网络故障排查、安全审计和协议分析。
语法格式
bash
tcpdump [选项] [过滤表达式]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-i interface | 指定监听的网络接口 | tcpdump -i eth0 |
-n | 禁用主机名解析(显示IP) | tcpdump -n |
-nn | 禁用端口和服务名解析 | tcpdump -nn |
-c count | 捕获指定数量的包后退出 | tcpdump -c 10 |
-w file.pcap | 保存为pcap格式文件 | tcpdump -w traffic.pcap |
-r file.pcap | 读取pcap文件分析 | tcpdump -r traffic.pcap |
-X | 同时以HEX和ASCII显示数据 | tcpdump -X |
-A | 以ASCII格式显示数据 | tcpdump -A |
-v | 显示详细信息 | tcpdump -v |
-vv | 显示更详细信息 | tcpdump -vv |
-s snaplen | 设置抓包长度(默认96字节) | tcpdump -s 1500 |
-q | 快速输出(简略显示) | tcpdump -q |
-e | 显示链路层头部信息 | tcpdump -e |
过滤表达式
| 表达式 | 描述 | 示例 |
|---|---|---|
host ip | 过滤特定IP | tcpdump host 192.168.1.1 |
net subnet | 过滤子网 | tcpdump net 192.168.1.0/24 |
port num | 过滤端口 | tcpdump port 80 |
src/dst | 源/目标过滤 | tcpdump src 192.168.1.100 |
tcp/udp/icmp | 协议过滤 | tcpdump tcp |
and/or/not | 逻辑组合 | tcpdump port 80 and host 1.1.1.1 |
经典案例
bash
# 捕获eth0接口的所有HTTP流量(显示ASCII内容)
tcpdump -i eth0 -A port 80
# 捕获与特定IP的SSH通信(限制20个包)
tcpdump -i eth0 -c 20 host 10.0.0.5 and port 22
# 捕获DNS查询(UDP协议+端口53)
tcpdump -i eth0 -n udp port 53
# 捕获TCP SYN包(三次握手第一个包)
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'
# 保存流量到文件(后台运行)
tcpdump -i eth0 -w /tmp/traffic.pcap &注意事项
- 需要root权限或
CAP_NET_ADMIN能力才能捕获数据包 - 生产环境慎用
-s 0(捕获完整数据包),可能消耗大量资源 - 使用
-w保存文件时,建议配合-C选项限制单个文件大小 - 复杂过滤表达式建议用单引号包裹,避免shell解析特殊符号
- 默认只捕获前96字节,分析完整数据需指定
-s 0或适当长度
top - 实时进程监控工具
top 是 Linux 系统中最常用的实时进程监控工具,可以动态查看系统资源使用情况、进程状态和系统负载。
语法格式
bash
top [选项]- 默认显示 CPU、内存、进程等信息
- 按
q退出
| 选项 | 说明 |
|---|---|
top -d <秒> | 设置刷新间隔(默认 3 秒) |
top -p <PID> | 仅监控指定进程 |
top -u <用户名> | 仅显示指定用户的进程 |
top -H | 显示线程(而不是进程) |
top -b | 批处理模式(适合输出到文件) |
top -n <次数> | 运行指定次数后退出 |
top 交互命令
在 top 运行时,可以输入以下命令进行交互:
全局控制
| 命令 | 说明 |
|---|---|
q | 退出 top |
h | 显示帮助 |
Space | 立即刷新 |
z | 切换彩色/黑白显示 |
W | 保存当前配置到 ~/.toprc |
排序控制
| 命令 | 说明 |
|---|---|
P (大写) | 按 CPU 使用率 排序 |
M (大写) | 按 内存使用率 排序 |
T (大写) | 按 运行时间 排序 |
N (大写) | 按 PID 排序 |
R (大写) | 反向排序 |
进程操作
| 命令 | 说明 |
|---|---|
k | 杀死进程(输入 PID 后回车) |
r | 调整进程的 nice 值(优先级) |
c | 显示完整命令行 |
H (大写) | 显示/隐藏线程 |
top 界面解析
top 界面分为 顶部汇总信息 和 进程列表 两部分:
顶部汇总信息
bash
top - 10:30:45 up 2 days, 3:45, 2 users, load average: 0.15, 0.10, 0.05
Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.3 us, 1.2 sy, 0.0 ni, 93.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7856.4 total, 1024.2 free, 4096.0 used, 2736.2 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3200.0 avail Mem- 第1行:系统运行时间、用户数、平均负载(1/5/15 分钟)
- 第2行:进程状态(运行、睡眠、停止、僵尸)
- 第3行:CPU 使用情况(用户态、内核态、空闲、IO等待等)
- 第4行:物理内存使用情况(总量、空闲、已用、缓存)
- 第5行:交换分区(Swap)使用情况
进程列表
bash
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 500000 80000 10000 R 10.5 1.0 5:30.01 firefox
5678 mysql 20 0 2000000 500000 20000 S 5.2 6.3 10:20.45 mysqld- PID:进程 ID
- USER:进程所属用户
- PR:优先级
- NI:
nice值(-20 最高,19 最低) - VIRT:虚拟内存使用量(KB)
- RES:物理内存使用量(KB)
- SHR:共享内存(KB)
- S:进程状态(R=运行, S=睡眠, Z=僵尸, D=不可中断)
- %CPU:CPU 占用率
- %MEM:内存占用率
- TIME+:累计 CPU 时间
- COMMAND:进程名(
c键可切换完整命令)
经典案例
bash
top -p 1234,5678 # 监控 PID 1234 和 5678
top -b -n 3 > top.log # 运行 3 次并保存到文件
top -H -p 1234 # 查看 PID 1234 的所有线程
top -o %MEM # 按内存占用排序
top -d 1 # 每秒刷新一次