Linux 性能诊断三剑客:df、du、top 命令详解
前言
在 Linux 系统运维中,最常见的故障莫过于磁盘满了和系统变慢了。面对这些问题,有三个命令是每个运维人员必须掌握的:df、du 和 top。
本文将详细讲解这三个命令的使用方法、常见场景和实战技巧,帮助你快速定位系统问题。
📌 适用人群:Linux 初学者、运维工程师、开发人员
📌 系统环境:CentOS 7/8、Ubuntu 18.04+、Debian 10+
一、df – 查看磁盘整体使用情况
1.1 命令作用
df(Disk Free)用于查看文件系统级别的磁盘空间使用情况,告诉你整个分区还剩多少空间。
1.2 常用参数
| -h | human-readable | 以 GB/MB 格式显示,最常用 |
| -T | type | 显示文件系统类型(ext4/xfs/ntfs) |
| -i | inodes | 显示 inode 使用情况(文件数量) |
| -t | type | 只显示指定类型的文件系统 |
1.3 基础用法
# 最常用:查看所有挂载点
df -h
# 查看指定目录所在分区
df -h /home
# 查看文件系统类型
df -Th
# 查看 inode 使用情况(防止小文件耗尽)
df -i
1.4 输出解读
bash
$ df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda1 ext4 98G 45G 48G 49% /
/dev/sdb1 xfs 500G 420G 80G 84% /data
tmpfs tmpfs 2G 1M 2G 1% /dev/shm
| 已用% | 空间使用率 | >85% 告警,>95% 紧急 |
| 挂载点 | 目录路径 | 根目录 / 满了最危险 |
| 类型 | 文件系统 | tmpfs 是内存盘,重启消失 |
1.5 常见故障场景
场景一:磁盘写满报错
bash
# 报错信息
No space left on device
# 排查步骤
df -h # 查看哪个分区满了
df -i # 如果空间没满,检查 inode
场景二:inode 耗尽
bash
# inode 满会导致无法创建新文件(即使磁盘还有空间)
df -i
# 输出示例:IUsed% 显示 100% 表示 inode 耗尽
# 通常是因为小文件太多,常见于邮件服务器、缓存目录
1.6 实用技巧
bash
# 只看根分区和 /data 分区
df -Th / /data
# 排除 tmpfs 等临时文件系统
df -Th -x tmpfs -x devtmpfs
# 输出 JSON 格式(便于脚本处理)
df -h –output=source,target,used,size,pcent | jq -R -s -c 'split("\\n")'
二、du – 查看目录/文件占用详情
2.1 命令作用
du(Disk Usage)用于目录级别的磁盘分析,帮你找出哪个目录或文件占用了大量空间。
2.2 常用参数
| -h | human-readable | 人类可读格式 |
| -s | summarize | 只显示总计,不展开子目录 |
| -c | total | 最后一行显示总和 |
| -d N | max depth | 显示 N 层子目录 |
| -a | all | 显示文件(不只是目录) |
2.3 基础用法
bash
# 查看当前目录所有子目录大小
du -sh *
# 查看指定目录大小
du -sh /var/log
# 显示详细列表并排序
du -sh * | sort -rh
# 显示两层目录深度
du -h -d 2 /home
# 显示所有文件的大小(包括普通文件)
du -ah /var/log | head -20
2.4 输出解读
bash
$ du -csh *
1.2G logs
450M mysql_data
2.3G app
8.5M config
3.8G total
| 1.2G | 该目录总大小 |
| logs | 目录/文件名 |
| total | 所有项目总和(由 -c 参数控制) |
2.5 实战:清理磁盘空间
bash
# 步骤1:找到最大的目录
cd /
sudo du -sh /* –exclude=/proc –exclude=/sys 2>/dev/null | sort -rh | head -10
# 步骤2:进入可疑目录继续深入
cd /var
sudo du -sh * | sort -rh | head -10
# 步骤3:发现 /var/log 太大,查看日志文件
cd /var/log
sudo du -sh * | sort -rh
# 步骤4:清理或轮转日志
sudo truncate -s 0 /var/log/syslog # 清空文件(不删除)
sudo journalctl –vacuum-size=500M # 清理 systemd 日志
2.6 实用技巧
bash
# 找出所有大于 100MB 的文件
find / -type f -size +100M 2>/dev/null
# 找出所有大于 1GB 的文件并排序
find / -type f -size +1G -exec du -h {} \\; 2>/dev/null | sort -rh
# 排除某些目录进行统计
du -sh –exclude=/proc –exclude=/sys /
# 显示磁盘占用排名前 10 的目录
sudo du -a / 2>/dev/null | sort -nr | head -10
2.7 ⚠️ 常见陷阱
现象:df 显示磁盘满了,但 du 统计不到那么多空间
原因:某个文件已被删除,但仍有进程在占用
解决方法:
bash
# 查找被删除但仍被占用的文件
lsof | grep deleted
# 重启相关进程释放空间
systemctl restart <service_name>
# 或重启服务器
三、top – 实时监控系统性能
3.1 命令作用
top 是 Linux 的任务管理器,实时显示 CPU、内存、Swap 使用情况,以及所有进程的资源占用。
3.2 界面布局
text
top – 10:30:15 up 5 days, 2 users, load average: 0.50, 0.33, 0.13
Tasks: 245 total, 2 running, 243 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.2 us, 3.1 sy, 0.0 ni, 80.1 id, 1.5 wa, 0.1 hi, 0.0 si
MiB Mem : 15982.4 total, 2345.6 free, 8234.2 used, 5402.6 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6452.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 root 20 0 2.1g 450m 52m S 15.0 2.8 2:30.21 mysqld
3.3 交互式快捷键
在 top 界面中按下以下按键:
| 1 | 展开/合并 CPU 核心 | 查看每个核心使用率 |
| P | 按 CPU 排序 | 大写 P,找到 CPU 大户 |
| M | 按内存排序 | 大写 M,找到内存大户 |
| T | 按运行时间排序 | 大写 T |
| c | 显示完整命令 | 查看进程的完整命令行 |
| k | 杀死进程 | 输入 PID 和信号(15/9) |
| q | 退出 | 或者按 Ctrl+C |
3.4 关键指标解读
Load Average(平均负载)
text
load average: 0.50, 0.33, 0.13
| | |
1分钟 5分钟 15分钟
| 4核 | ✅ 正常 | ⚠️ 满载 | 🔴 过载 |
| 8核 | ✅ 正常 | ⚠️ 满载 | 🔴 过载 |
CPU 指标
| us | user | 用户进程占用 | >70% 过高 |
| sy | system | 内核占用 | >20% 异常 |
| id | idle | 空闲 | 越低越忙 |
| wa | iowait | 等待磁盘 I/O | >20% 磁盘瓶颈 |
| st | steal | 被虚拟化偷走 | >10% 宿主机超卖 |
内存指标
| total | 总内存 | – |
| free | 完全空闲 | 太低说明内存紧张 |
| avail Mem | 可用内存 | 最重要,接近 0 告警 |
| Swap used | 交换分区使用 | >0 说明内存不足 |
3.5 实战排查
场景一:CPU 过高
bash
# 1. 打开 top,按 1 展开 CPU 核心
top
# 2. 按 P 按 CPU 排序
# 3. 找到 CPU 占用高的 PID
# 4. 按 c 查看完整命令
# 进一步分析
strace -p <PID> -c # 统计系统调用
lsof -p <PID> # 查看打开的文件
场景二:内存不足
bash
# 1. 在 top 中按 M 按内存排序
# 2. 查看 avail Mem 是否接近 0
# 3. 检查 Swap used 是否大于 0
# 查看详细内存占用
smem -r # 查看 PSS 真实内存占用
场景三:磁盘 I/O 瓶颈
bash
# 在 top 中看 wa 字段
# 如果 wa > 20%,说明磁盘慢
# 进一步确认
iostat -x 1
# 查看 %util 是否接近 100%,await 是否超过 50ms
3.6 非交互模式(脚本友好)
bash
# 输出一次 top 结果(适合定时采集)
top -bn1 | head -20
# 指定进程监控
top -p 1234
# 以批处理模式输出
top -b -d 2 -n 5 > top_output.txt
四、三剑客配合实战
4.1 完整排查流程
text
系统报警:磁盘空间不足
│
▼
df -Th ← 确认哪个分区满了
│
▼
cd /full_partition
du -sh * | sort -rh ← 找到最大的目录
│
▼
cd big_directory
du -sh * | sort -rh ← 逐层深入
│
▼
发现是日志/缓存文件
│
┌───┴───┐
│ │
清理 排查为什么异常增长
│
▼
top -P ← 找 CPU 高的进程
top -M ← 找内存高的进程
4.2 健康检查脚本
bash
#!/bin/bash
# 系统健康快照脚本
echo "========== 磁盘空间 =========="
df -Th | grep -v tmpfs
echo "========== 根目录大文件 Top 5 =========="
sudo du -sh /* –exclude=/proc –exclude=/sys 2>/dev/null | sort -rh | head -5
echo "========== 系统负载 =========="
top -bn1 | head -5
echo "========== 内存状态 =========="
free -h
echo "========== 磁盘 I/O =========="
iostat -x 1 2 | tail -20
4.3 告警阈值参考
| 磁盘使用率 | > 85% | > 95% |
| inode 使用率 | > 85% | > 95% |
| Load/核 | > 0.7 | > 1.5 |
| CPU wa | > 10% | > 20% |
| 可用内存 | < 20% | < 10% |
| Swap used | > 0 | > 500MB |
五、总结速查表
| df | 看分区还剩多少空间 | df -Th | 磁盘满报警 |
| du | 看哪个目录占空间多 | `du -sh * | sort -rh` |
| top | 看哪个进程在消耗资源 | top 然后按 P 或 M | 系统变慢 |
记忆口诀:
- disk free = 盘剩多少
- disk usage = 谁占了盘
- top = 谁吃了资源
- du -csh * –exclude=“home”




