[问题已处理]系统提示磁盘不足,但是df -h显示仍有空余

生产环境部署完成后,项目运行一段时间后出现错误。错误提示磁盘空间不足,通过执行df -h命令发现根目录下还有6G的可用空间,但执行任何创建临时文件的命令都提示没有空间。通过执行lsof | grep delete命令,发现根目录下有未释放的删除文件。直接终止相关进程或重启服务后,释放了一部分磁盘空间,不再提示磁盘空间不足。然而,过了一会儿又出现了相同的错误,但这次执行lsof | grep delete命令并没有找到与根目录相关的文件。这让人感到困惑。通过百度搜索,使用df -I命令查看inode,发现根路径下的inode已经用尽。解决方法是删除一些无用的文件或文件夹,释放inode。通常是由于crontab的任务出现问题,导致在/var/spool/clientmqueue目录下产生大量碎片文件。处理方法可以使用rm -rf 命令,但会提示参数过多。也可以使用其他方法,例如在/var/spool/clientmqueue/目录下执行命令”lsattr ./|awk -F”/” ‘{print $3}’|xargs -i rm -rf {}”,使用lsattr列出./下文件的属性,使用awk提取文件名,然后执行rm -rf命令。还有一种常见的方法是使用”find /var/spool/clientmqueue/ -type f -exec rm {} ;”命令或在/var/spool/clientmqueue/目录下执行”find ./ -exec rm {} ;”命令。还可以在删除过程中,在crontab中没有定向输出的行末尾添加”> /dev/null 2>&1″,或者先停止crontab,然后添加重定向。在我这边,直接删除了/var/spool/,定时任务也被删除了,需要重新创建。通过执行df -I命令,发现确实有空闲空间,但随着程序的执行,可用空间仍在逐渐减少。程序很快又报错了。为了应急,我将生产的临时小文件生成在/tmp目录下。我将/tmp目录挂载到另一块磁盘上,使用mount –bind /mnt/tongguan/tmp /tmp命令。这样生成的文件将出现在/mnt/tongguan/目录下。再次使用lsof命令查看,发现居然有根目录下的文件没有被删除。这是我自己的失误,多加了一个delete,结果过滤掉了关键字为DEL的进程。原先的命令结果如下:杀掉并重启进程后,空间得到释放。这些方法只能暂时解决问题,还是需要扩大根目录。毕竟根目录只有20G,之前的进程也不敢随意操作。系统盘的inode是在创建时设置的,只能在停机后打个快照再扩容。主要问题是小文件太多了。扩容后问题得到解决。还可以使用下面的命令查看根目录下哪个文件夹占用了最多的inode,以便排查问题:”for i in ./*; do echo $i; find $i | wc -l; done;”。发现/mnt下占用inode最多,查看后发现一个job路径下有很多日志文件夹,进入日志文件夹发现每个日志文件夹只有很少的几行内容。询问开发人员,他们说这是框架造成的。直接删除日志,并设置定时任务,在每晚12点删除两天前的日志文件。让开发人员在下次发布之前处理掉。这样打日志的数量就能得到控制。在删除过程中,发现inode的可用空间大大增加。全部删除后,清理了97%的空间。

赞(1)