在服务器过程中,我们常常会收到关于服务器磁盘满了的警告
可登录服务器,通过df -Hl查看
[root@192.168.0.1]# df -Hl
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0G 0 4.0G 0% /dev
tmpfs 4.0G 4.1k 4.0G 1% /dev/shm
tmpfs 4.0G 623k 4.0G 1% /run
tmpfs 4.0G 0 4.0G 0% /sys/fs/cgroup
/dev/vda1 317G 281G 23G 93% /
tmpfs 792M 0 792M 0% /run/user/1002
tmpfs 792M 0 792M 0% /run/user/0
和告警信息一致,接着我们就是要找到导致磁盘空间满的目录或文件
那么如何找到占用空间大的目录或文件?
一种比较笨的方法是,在根目录下,通过du -sh ./*命令,列出各目录所占空间大小
[root@192.168.0.1 wwwroot]# du -sh ./*
4.0K ./oas
231G ./aby
4.0K ./aby2
1.6G ./keji.cn
4.0K ./dao
280M ./rvice
584M ./hu
4.0K ./kf
4.0K ./obk_
252K ./www.keji.cn
252K ./www.keji.com
20K ./www.jian.com
之后用同样的方法继续在对应目录下去查找
如果在相对高效一点的方法是通过du的-d参数,或–max-depth,设置查询的目录深度,目录深度增加,所查询的目录,展示出来会很多,这个时候可以通过grep进行过滤
du -h --max-depth=2|grep [GT] |sort -nr
执行结果如下:
[root@192.168.0.1 wwwroot]# du -h -d 2|grep [GT] |sort -nr
233G .
231G ./bay/public
231G ./bay
7.1M ./bayxibao.keji.cn/ThinkPHP
1.6G ./bayxibao.keji.cn
1.5G ./bayxibao.keji.cn/Uploads
通过这样,可以搜索出以G或者T为单位的占用磁盘空间的大号目录,并排序撒~~
再或者可以通过find来查询
find / -type f -size +1G -exec du -h {} \;
执行结果如下:
[root@192.168.0.1 wwwroot]# find / -type f -size +1G -exec du -h {} \;
0 /proc/kcore
find: ‘/proc/8743/task/8743/fdinfo/6’: No such file or directory
find: ‘/proc/8743/fdinfo/5’: No such file or directory
1.2G /www/wwwlogs/bay.keji.cn.log
1.1G /www/server/data/mysql-bin.000026
从效率上来说,find要比du要更快速、灵活
通过这两种方法,我们可以以最快的效率找到磁盘占用最大的文件
其实事实上并没有这么简单?很多时候,通过find或du查半天,发现所有加起来的占用空间,和df看到的磁盘空间占用,相差很大,就比如我上面的两个命令执行结果。
通过df查看,磁盘使用281G,但是在根目录下通过du -hs 查看,总共加起来差不多10G,没有隐藏目录,那空间被谁吃了?
很明显,有空间被已删除文件占用,文件删除了,但是资源没释放。
目前还知道一个比较好用的命令:lsof,我们可以通过以下命令去查看。
lsof
从执行结果可以看出,有一个28G左右的大日志文件,删除了,但是空间没释放,这是很常见的一种情况,对应的解决方法就是,重启服务器应用,释放空间。
还有一种经常有人问的问题,就是通过df查看到的磁盘。
[root@izwz94hpdgvnev3dhdpzc3z ~]# df -hl
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.7G 4.0K 3.7G 1% /dev/shm
tmpfs 3.7G 608K 3.7G 1% /run
tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/vda1 296G 262G 22G 93% /
tmpfs 756M 0 756M 0% /run/user/1002
tmpfs 756M 0 756M 0% /run/user/0
会发现,Used和Avail加起来不够Size,莫名被吃掉一部分
其实这是Linux文件系统的一种安全策略,它默认会为root用户保留5%的磁盘空间,留作紧急情况使用。这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不至于马上就 crash
我们可以通过tune2fs修改预留空间的比例
tune2fs -m 1 /dev/vda1
完成后被吃掉的空间,就吐出来了~~~~~~~~
下班~不卷了