Linux运维进阶技巧-磁盘空间分析

TOC

df查看分区

df命令可以查看分区情况。
df使用语法如下:

df 选项

【示例】查看每个挂载点的空间使用情况

root@ihavetwocats:~# df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
tmpfs          tmpfs    340M  1.5M  339M   1% /run
/dev/vda2      ext4      69G   20G   47G  30% /
tmpfs          tmpfs    1.7G  148K  1.7G   1% /dev/shm
tmpfs          tmpfs    5.0M     0  5.0M   0% /run/lock

以上每列含义:

  • Filesystem:设备或分区名称
  • Type:文件系统类型
  • Mounted on:挂载点
  • Use%:空间使用率

df命令常用选项:

选项 全写 说明 示例
-h –human-readable 以人类可读的方式显示(自动换算单位:KB/MB/GB) df -h
-H –si 使用 1000 为换算单位(1K=1000字节) df -H
-T –print-type 显示文件系统类型(ext4、xfs、tmpfs 等) df -hT
-i –inodes 显示 inode 使用情况(文件数量层面) df -i
-a –all 显示所有文件系统(包括伪文件系统,如 proc、sysfs) df -ah
-t –type=TYPE 仅显示指定类型的文件系统 df -t ext4
-x –exclude-type=TYPE 排除指定类型的文件系统 df -x tmpfs
–total (无短写) 在输出末尾添加总计行 df -h --total
-P –portability 使用标准格式输出(每行一个文件系统) df -P
–output (无短写) 自定义输出列(可选字段:source、size、used、avail、pcent、target) df --output=source,size,used,pcent,target
–sync (无短写) 在显示前先同步文件系统数据(确保统计最新) df --sync -h`
–block-size=SIZE (无短写) 以指定块大小显示(如 --block-size=1M) df --block-size=1M
<路径> (位置参数) 仅显示该路径所在文件系统的信息 df -h /var/log

du统计文件大小

通常我们可以使用ls命令来列出目录列表,并且可以加上-lh选项来显示文件的大小,但是不能显示出目录的大小,所有目录的显示大小都是4.0K。
于是使用du命令不仅可以统计文件的大小,还能统计目录的大小。
du使用语法如下:

du 选项 目录路径

【示例1】查看根目录/下所有目录大小,层级为1

root@ihavetwocats:~# du -h -d 1 /
25M     /tmp
8.0G    /var
130M    /boot
1.5M    /run
8.3G    /data
204K    /root
4.0K    /media
0       /sys
16K     /lost+found
0       /proc
6.1M    /etc
124K    /dev
4.0K    /mnt
4.7G    /usr
20K     /opt
64K     /home
1.4G    /snap
4.0K    /srv
23G     /

【示例2】查看根目录/下除了run、proc目录的所有目录大小,层级为1,

root@ihavetwocats:~# du -ch -d 1 / --exclude="run" --exclude="proc"
25M     /tmp
8.0G    /var
130M    /boot
8.3G    /data
208K    /root
4.0K    /media
0       /sys
16K     /lost+found
6.0M    /etc
124K    /dev
4.0K    /mnt
4.7G    /usr
20K     /opt
64K     /home
1.4G    /snap
4.0K    /srv
23G     /
23G     total

补充说明:排除多个文件或目录只需使用多个--exclude=选项即可。

du命令常用选项:

选项 全写 说明 示例
-h –human-readable 以人类可读的方式显示(自动换算为 KB/MB/GB) du -h /var
-s –summarize 仅显示目录总计(不显示子目录明细) du -sh /var/log
-d –max-depth=N 限制递归统计深度,N 为目录层级 du -h -d 1 /data
-a –all 显示所有文件和目录(默认只显示目录) du -ah /etc
-c –total 在输出最后增加总计行 du -ch /usr
–exclude=PATTERN (无短写) 排除匹配的文件或目录 du -h --exclude="*.log" /var
–apparent-size (无短写) 显示文件逻辑大小(忽略稀疏文件节省) du -h --apparent-size file.img
-x –one-file-system 不跨越文件系统边界(只统计当前挂载点) du -hx /
–inodes (无短写) 显示每个目录占用的 inode 数量 du --inodes -h /var
-L –dereference 统计符号链接目标文件的大小 du -hL /link/path

查看磁盘I/O

1.iostat工具

可以使用iostat命令实时监控磁盘I/O的使用情况。

iostat -x 1

查看结果如下图所示:
linux-advanced.001
主要查看%utilawait两个值,表达含义:

  • %util:接近 100% 表示磁盘I/O繁忙
  • await:I/O等待时间过长说明有瓶颈

2.iotop工具

使用iotop命令可以实时查看进程的I/O使用情况,常用于排查“哪个进程在疯狂读写磁盘”、“磁盘 I/O 负载高”的问题。相比iostat工具,iotop更能排查IO占用高的进程。

iotop不是Linux默认的命令工具,可能需要安装,安装方法如下:
Debian / Ubuntu

apt -y install iotop

RedHat / CentOS

yum -y install iotop

iotop使用语法如下:

iotop 选项

查看结果如下图所示:
linux-advanced.002

关键字段说明:

  • TID / PID:表示线程ID(TID)或进程ID(PID)。使用-P选项时仅显示进程PID。
  • PRIO:I/O调度优先级(priority)。一般格式如 be/4,其中be表示Best Effort(默认调度类),4是优先级等级。
  • USER:进程所属的用户名,方便定位是哪个用户发起的I/O操作。
  • DISK READ:当前进程每秒读取磁盘的速率,单位通常为KB/s或MB/s。用于判断进程是否在频繁读取磁盘。
  • DISK WRITE:当前进程每秒写入磁盘的速率。用于识别占用写带宽的程序(如日志、数据库、备份任务等)。
  • SWAPIN:进程从交换分区(swap)换入内存的比例(百分比)。若数值较高,说明内存不足,导致频繁使用 swap。
  • IO%:表示进程被I/O阻塞(等待磁盘读写完成)的时间占比。数值高说明该进程大部分时间在等待磁盘操作完成,I/O瓶颈明显。
  • COMMAND:执行命令或程序名。通常显示进程的启动命令(包括路径和参数),帮助快速识别应用来源。

iotop命令常用选项

选项 全写 说明 示例
-o –only 仅显示有 I/O 活动的进程 iotop -o
-b –batch 批处理模式(非交互输出,可用于日志或脚本) iotop -b -n 10
-n NUM –iterations=NUM 设置输出刷新次数 iotop -b -n 5
-d SEC –delay=SEC 设置刷新间隔时间(秒) iotop -d 2
-p PID –pid=PID 仅显示指定 PID 的进程 iotop -p 1234
-u USER –user=USER
-a –accumulated 累计显示 I/O 总量(从启动到现在) iotop -a
-k –kilobytes 以 KB/s 显示带宽(默认是 MB/s) iotop -k
-P –processes 仅显示进程(不显示线程) iotop -P
-t –time 在每行前显示时间戳(适合日志模式) iotop -b -t
–version 显示版本信息 iotop --version
–help 显示帮助信息 iotop --help

☆常用技巧☆

1.查找占用空间最大的文件或目录

可以结合du命令和sort命令以及head命令来查找占用空间最大的文件或目录。
使用语法:

du -h -d 查找目录层级 查找目录 | sort -hr | head

【示例】查找根目录/下最大的一个目录,查找层级设为1

du -h -d 1 / | sort -hr | head

2.快速查找大文件

使用find命令的-size选项可以查找指定大小或者多少大小以上的文件。
使用语法:

find 查找目录 -type f -size +文件大小 -exec ls -lh {} \;

【示例】查找根/目录下500M以上的文件

find / -type f -size +500M -exec ls -lh {} \;

★排查磁盘占用神器:ncdu

ncdu是Linux下磁盘空间分析与清理的“神器”,尤其在排查磁盘占用过多问题时比du更直观。

ncdu也不是Linux默认的命令工具,可能需要安装,安装方法如下:
Debian / Ubuntu

apt -y install ncdu

RedHat / CentOS

yum -y install ncdu

ncdu使用语法如下:

ncdu 选项 目录路径

【示例1】从根目录/查找哪个目录占用最多空间

ncdu /

【示例2】分析根目录,但不跨越文件系统

ncdu -x /

【示例3】分析根目录,排除/proc/tmp目录

ncdu --exclude /proc --exclude /tmp /

【示例4】将扫描结果导出为 JSON 文件,便于离线分析

ncdu -o /tmp/ncdu-report.json /

【示例5】从导出文件加载结果查看

ncdu -f /tmp/ncdu-report.json

分析整个磁盘空间演示
假如我们需要分析从根目录/下所有的目录文件磁盘空间占用的情况,工具会一层一层目录递归进行扫描,如下图所示:
linux-advanced.003
界面会将次级所有目录按照磁盘占用从大到下依次排列展示出来,以及该目录或文件所占用的具体大小显示出来,我们可以一层一层选择排查空间中有哪些目录或文件占用了磁盘空间。如下图所示:
linux-advanced.004

交互操作快捷键

按键 功能说明
↑ / ↓ 上下移动光标
返回上一级目录
→ / Enter 进入选中目录
g 跳转到某个目录
d 删除选中文件或目录(需确认)
r 刷新当前目录统计
n 按名称排序
s 按大小排序
q 退出 ncdu 界面

ncdu命令常用选项

选项 全写 说明 示例
-x –one-file-system 不跨越文件系统边界(仅分析当前挂载点) ncdu -x /
-a –all 包含隐藏文件和目录(以 . 开头) ncdu -a /home
-e –extended 显示更多文件信息(如权限、时间戳) ncdu -e /data
-r –read-only 以只读模式运行(防止误删) ncdu -r /
-q –quiet 不显示扫描进度条 ncdu -q /
-o –output=FILE 将扫描结果导出为文件(JSON 格式) ncdu -o /tmp/ncdu.json /
-f –input=FILE 从导出文件加载结果查看 ncdu -f /tmp/ncdu.json
–exclude=PATTERN (无短写) 排除匹配的文件或目录 ncdu --exclude /proc --exclude /tmp /
–exclude-from=FILE (无短写) 从文件中读取排除规则 ncdu --exclude-from=/etc/ncdu.ignore /
–si (无短写) 使用 1000 进制(而非 1024)显示大小 ncdu --si /
–apparent-size (无短写) 显示文件的逻辑大小(非实际磁盘占用) ncdu --apparent-size /var/lib
–color=MODE (无短写) 设置颜色模式(auto, always, never) ncdu --color=auto /
-0 (无全写) 以 NUL 分隔符输出结果(脚本分析时使用) ncdu -0 -o out.json /
-v –version 显示版本信息 ncdu -v
-h –help 显示帮助信息 ncdu -h