Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux磁盘空间异常爆满的排查和处理

Linux磁盘空间异常爆满的排查和处理方式

作者:忍冬行者

在服务器运维过程中,磁盘空间不足会导致业务异常,定位问题时,可以使用df-Hl、du-hs、du-d参数或find命令查看空间,删除备份文件和日志信息后,空间未释放的原因是文件被打开,进程仍在使用

问题现象

在服务器运维过程中,我们时常会遇到这样的情况,服务器磁盘空间使用率达到100%,业务出现异常。

问题定位

1.登录服务器,通过df -Hl查看

[root@k8s-master1 ~]# df -Hl
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 8.4G     0  8.4G    0% /dev
tmpfs                    8.5G     0  8.5G    0% /dev/shm
tmpfs                    8.5G  774M  7.7G   10% /run
tmpfs                    8.5G     0  8.5G    0% /sys/fs/cgroup
/dev/mapper/centos-root  136G   68G   68G   51% /
/dev/sda1                1.1G  238M  827M   23% /boot

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

笨方法:在根目录下,通过du -hs命令,列出各目录所占空间大小

[root@k8s-master1 /]# du -hs *
0	bin
194M	boot
1012K	core.580
0	dev
37M	etc
21M	home
7.7G	kuboard-data
0	lib
0	lib64
0	media
0	mnt
135M	opt
du: 无法访问"proc/21212/task/21212/fd/3": 没有那个文件或目录
du: 无法访问"proc/21212/task/21212/fdinfo/3": 没有那个文件或目录
du: 无法访问"proc/21212/fd/3": 没有那个文件或目录
du: 无法访问"proc/21212/fdinfo/3": 没有那个文件或目录
0	proc
1.6G	root
738M	run
0	sbin
0	src
0	srv
0	sys
6.2M	tmp
3.2G	usr
51G	var

相对高效一点的方法是通过du的-d参数,或--max-depth,设置查询的目录深度

du -h -d 2|grep [GT] |sort -nr  
du -h --max-depth=2|grep [GT] |sort -nr  
#通过这样的方式,可以搜出以G或者T为单位的占用磁盘空间的大目录,并排序

[root@k8s-master1 /]# du -h -d 1 /
194M	/boot
0	/dev
du: 无法访问"/proc/24731/task/24731/fd/3": 没有那个文件或目录
du: 无法访问"/proc/24731/task/24731/fdinfo/3": 没有那个文件或目录
du: 无法访问"/proc/24731/fd/4": 没有那个文件或目录
du: 无法访问"/proc/24731/fdinfo/4": 没有那个文件或目录
0	/proc
738M	/run
0	/sys
37M	/etc
1.6G	/root
51G	/var
6.2M	/tmp
3.2G	/usr
21M	/home
0	/media
0	/mnt
135M	/opt
0	/srv
0	/src
7.7G	/kuboard-data
64G	/

效率高的方法,使用find进行查找,比使用du效率要高

find / -type f -size +1G -exec du -h {} \;  #查找文件大于10G的文件

遇到问题

操作删除了一些备份文件和日志信息后,查看空间仍然不足,发现删除的日志,空间并没有释放。

未释放磁盘空间的原因:

在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink),然而假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。而我删除的是nginx的访问日志文件,在删除的时候该文件正在被使用。

处理办法

[root@local ~]# lsof |grep deleted
nginx      4399      root   38w      REG              253,0   19304448   10835682 /var/nginx/logs/t-access.log (deleted)
nginx      4399      root   39w      REG              253,0    3502080   10835684 /var/nginx/logs/t-error.log (deleted)
nginx      4401    nobody   38w      REG              253,0   19304448   10835682 /var/nginx/logs/t-access.log (deleted)
nginx      4401    nobody   39w      REG              253,0    3502080   10835684 /var/nginx/logs/t-error.log (deleted)

从输出的结果可以看到 /var/nginx/logs/t-access.log 和 t-error.log 还在被使用中,所以导致未释放空间。

那么如何让进程释放呢?

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文