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-i1.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 -202.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 -102.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 mysqld3.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分钟| 核心数 | Load < 核心数 | Load = 核心数 | Load > 核心数×2 |
|---|---|---|---|
| 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 是否超过 50ms3.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 -204.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 | 系统变慢 |
记忆口诀:
- diskfree = 盘剩多少
- diskusage = 谁占了盘
- top= 谁吃了资源
- du -csh * --exclude=“home”