服务器磁盘高占用排查
本博客用来记录在服务器上发现 /home
存储空间异常占用后,如何排查每个用户的空间使用情况,以及如何快速找出当前目录(包含隐藏文件夹)下最大的前 10 个文件。
服务器 /home
目录高占用,如何排查?
最近在一台多用户服务器上发现 /home
目录几乎被占满,一查竟然使用了 915G!由于我们已经把大部分大型数据集额外存放到其他挂载点,按理说 /home
目录不应该有如此大的占用。服务器上有多个用户共同使用,因此需要先统计各个用户的主目录所占用的空间,确认究竟是谁的文件占据了硬盘。
1. 查看各个用户在 /home
目录下占用的空间
如果每位用户在 /home
下都有各自的独立目录(如 /home/alice
, /home/bob
, 等),可以使用 du -sh
命令来查看每个子目录的总大小。示例命令如下:
需要使用管理员root权限
du -sh /home/*
du
:显示文件或目录占用的磁盘空间。-s
:只显示汇总(summary)而不是详细列出所有子文件。-h
:以人类可读的方式显示,如 K、M、G 等。
执行后,会得到类似下面的输出:
47G /home/AAA
579G /home/BBB
19G /home/CCC
...
一眼就能看到 /home/BBB
目录下使用了 579G,这显然非常异常,也就找到了我们要重点排查的用户。
注意:如果
/home
下的用户目录并不是直接/home/用户名
,而是有其他命名方式或层级,需要根据实际目录结构修改du
命令的路径和匹配方式。
2. 在大目录下进一步排查:找出最大的文件与最大的文件夹
2.1 找到当前目录(含子目录)下「最大的 10 个文件」
进入要排查的目录,比如 /home/zhanyong
:
cd /home/zhanyong
find . -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 10
find . -type f
:递归查找当前目录及子目录的所有普通文件,包括隐藏文件、隐藏文件夹中的文件。-exec du -h {} +
:对找到的文件执行du -h
获取大小并以可读形式显示。2>/dev/null
:忽略无权限访问等报错信息。sort -hr
:将结果按照数值降序(-r)排列,并以人类可读形式(-h)进行比较。head -n 10
:只列出最大的 10 个文件。
输出示例:
root@532lab:/home/zhanyong# find . -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 10
12G ./.local/share/Trash/files/split_radioML2018_tools/data/Constellation_k2000_dim64.npy
5.9G ./.local/share/Trash/files/split_radioML2018_tools/data/Constellation_k2000_dim32.npy
3.3G ./.local/share/Trash/files/split_radioML2018_tools/data/Mutil_SNR_6_k1000_dev.npy
2.2G ./.local/share/Trash/files/split_radioML2018_tools/data/Mutil_SNR_6_k2000.npy
2.2G ./.local/share/Trash/files/split_radioML2018_tools/data/Mutil_SNR_12_k2000.npy
1.5G ./.local/share/Trash/files/split_radioML2018_tools/data/Constellation_k1000_dim64_64_4.npy
1.2G ./.local/share/Trash/files/split_radioML2018_tools/data/Constellation_k200_dim64_64_16.npy
1.2G ./anaconda3/pkgs/pytorch-1.11.0-py3.8_cuda11.3_cudnn8.2.0_0/lib/python3.8/site-packages/torch/lib/libtorch_cuda_cpp.so
1.2G ./anaconda3/envs/tensorflow_zhanyong/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so
1.1G ./.local/share/Trash/files/split_radioML2018_tools/data/Mutil_SNR_6_k1000.npy
借此,你可以快速定位哪些文件最占空间,从而决定是否清理、迁移或做其他处理。
2.2 找出当前目录下「最大的 10 个文件夹」(含隐藏文件夹)
如果想按目录来排查,看哪些文件夹才是“元凶”,可以在同一目录下使用:
find . -mindepth 1 -type d -exec du -sh {} + 2>/dev/null | sort -hr | head -n 10
-mindepth 1
:避免把.
当前目录本身也列进去(如果你不介意,可去掉该选项)。-type d
:只关注目录(包括隐藏目录)。-exec du -sh {} +
:对每个目录做汇总,-s
参数会递归统计子目录的大小总和,并以可读形式显示。2>/dev/null
:同样忽略无权限的报错。sort -hr | head -n 10
:按照大小降序列出前 10 个“最重”的目录。
这样就能快速看到哪几个目录是最大的,例如:
root@532lab:/home/zhanyong# find . -mindepth 1 -type d -exec du -sh {} + 2>/dev/null | sort -hr | head -n 10
43G ./.local
37G ./anaconda3
24G ./anaconda3/envs
18G ./anaconda3/pkgs
11G ./anaconda3/envs/pytorch_zhanyong
8.2G ./anaconda3/envs/meta-tts/lib/python3.8
7.4G ./anaconda3/envs/pytorch_zhanyong/lib/python3.8
4.7G ./anaconda3/envs/tensorflow_zhanyong
4.0G ./anaconda3/envs/tensorflow_zhanyong/lib
3.9G ./.cache
root@532lab:/home/zhanyong#
然后就可以进一步深入清理、删减或迁移这些大体量的目录。
2.3 如果只想查看当前目录单层(不递归)的目录大小
有时我们只想看第一层子目录的大小,而不必深入子目录统计,可以使用:
du -h --max-depth=1 2>/dev/null | sort -hr | head -n 10
--max-depth=1
:只统计第一层目录的空间占用(包含隐藏目录,但要注意du
默认不会匹配.
开头的名称;想要一并显示隐藏目录,可以改用du -h --max-depth=1 .* *
等,但可能出现“找不到文件”的警告,可以用2>/dev/null
过滤)。sort -hr
和head -n 10
:依然是从大到小只显示前 10 行。
root@532lab:/home/zhanyong# du -h --max-depth=1 2>/dev/null | sort -hr | head -n 10
87G .
43G ./.local
37G ./anaconda3
3.9G ./.cache
1.1G ./.nv
857M ./RadioML
168M ./node-v20.17.0-linux-x64
36M ./.linuxmint
15M ./.ipython
6.8M ./.deepface
3. 小结
-
定位大用户目录
- 在
/home
目录下使用du -sh /home/*
来确定哪个用户占用最多空间。
- 在
-
深入到用户目录排查
-
找最大文件
find . -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 10
-
找最大文件夹
find . -mindepth 1 -type d -exec du -sh {} + 2>/dev/null | sort -hr | head -n 10
-
-
针对性清理
- 根据实际业务需求,清理无用的大文件或目录,以腾出空间。
通过以上方法,就能快速找到 /home
中最大的“空间吞噬者”,避免磁盘被塞满导致系统或科研任务无法正常进行。尤其在科研或开发环境中,定期查看和清理不需要的历史文件是维护服务器健康的好习惯。希望这篇记录能帮你高效管理和优化磁盘空间!