# Linux磁盘空间使用率100%解决办法 > 磁盘空间使用率很高的解决办法 ## 事情发生的原因 本人在服务器上面部署了一个java项目,项目中使用了RabbitMQ 消息中间件,项目有一个功能是,用户登录后会发一封邮件到登录用户的邮箱(这里就是使用RabbitMQ 异步完成)。为了给其他人观看项目,我就新建了一个账号,但是忘记了存储邮箱,所以发送消息后,消息发送邮件时一直报错。就导致日志文件变得无比大,后面就是磁盘满了。 ## 方法一:删除未被进程引用的大文件、 **这一类文件,就是孤立存在磁盘上的,内存中没有人使用它,删除它能直接达到回收空间的效果。** 1. 使用df命令可以看到 Use 列 就是磁盘使用得百分比。可以看见文件系统/dev/vda1 已经 ``` [root@VM-0-9-centos: test] Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 50G 0 100% / devtmpfs 909M 0 909M 0% /dev tmpfs 920M 24K 920M 1% /dev/shm tmpfs 920M 48M 872M 6% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup tmpfs 184M 0 184M 0% /run/user/0 ``` 2. 进入根目录查看文件占用情况 ``` [root@VM-0-9-centos: /] 1.2G apps du: cannot access ‘proc/9507/task/9507/fd/4’: No such file or directory du: cannot access ‘proc/9507/task/9507/fdinfo/4’: No such file or directory du: cannot access ‘proc/9507/fd/4’: No such file or directory du: cannot access ‘proc/9507/fdinfo/4’: No such file or directory 3.5G project 34G root 8.8G usr 1.8G var ``` 可以看到,在root目录下有34G的文件,我们进入root目录,重复执行上面的命令找到大文件: ``` [root@VM-0-9-centos: ~] 9.8G a.txt 4.0K deployJD.sh 469M mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 1016K nginx-1.18.0.tar.gz 4.0K null 85M otp_src_23.0.tar.gz 15M rabbitmq-server-generic-unix-3.8.5.tar.xz 2.2M redis-6.0.6.tar.gz 24G test 4.0K test.sh ``` 找到大文件后,将其删除 ``` [root@VM-0-9-centos: ~] [root@VM-0-9-centos: ~] ``` 再次执行 df -h 查看磁盘使用量 ``` [root@VM-0-9-centos: ~] Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 16G 31G 35% / devtmpfs 909M 0 909M 0% /dev tmpfs 920M 24K 920M 1% /dev/shm tmpfs 920M 48M 872M 6% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup tmpfs 184M 0 184M 0% /run/user/0 ``` > 注意:这里删除的两个文件,在进程中是没有被引用的,所以删除后就能直接看到效果。 > 还有一种情况,就是需要删除的文件已经被进程引用了(例如:项目引用的日志文件),这时删除文件后,使用df -h发现和删除前一样。 ## 方法二:删除被磁盘引用的大文件 **被内存引用的文件,即使磁盘上被删除了,但是在内存中还在使用(未删除完成)。** 这里我使用的是启动一个web项目,然后往日志文件中写入数据,使其变成一个几十G的文件。 1. 查看文件大小 4.9k ``` [root@VM-0-9-centos: jd] -rw-r--r-- 1 root root 4.9K Aug 21 20:27 springboot.log ``` 2. 写入文件数据 ``` [root@VM-0-9-centos: jd] dd: error writing ‘./springboot.log’: No space left on device 33965+0 records in 33964+0 records out 35614191616 bytes (36 GB) copied, 315.715 s, 113 MB/s [root@VM-0-9-centos: jd] Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 50G 0 100% / devtmpfs 909M 0 909M 0% /dev tmpfs 920M 24K 920M 1% /dev/shm tmpfs 920M 48M 872M 6% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup tmpfs 184M 0 184M 0% /run/user/0 ``` 3. 此时我们根据第一种方法进行排查删除文件 ``` [root@VM-0-9-centos: jd] [root@VM-0-9-centos: /] 1.2G apps du: cannot access ‘proc/13650/task/13650/fd/4’: No such file or directory du: cannot access ‘proc/13650/task/13650/fdinfo/4’: No such file or directory du: cannot access ‘proc/13650/fd/4’: No such file or directory du: cannot access ‘proc/13650/fdinfo/4’: No such file or directory 37G project 8.8G usr 1.8G var [root@VM-0-9-centos: /] [root@VM-0-9-centos: jd] -rw-r--r-- 1 root root 34G Aug 21 20:38 springboot.log [root@VM-0-9-centos: jd] [root@VM-0-9-centos: jd] Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 50G 0 100% / devtmpfs 909M 0 909M 0% /dev tmpfs 920M 24K 920M 1% /dev/shm tmpfs 920M 8.7M 911M 1% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup tmpfs 184M 0 184M 0% /run/user/ ``` 可以看到删除文件后 df -h命令查询出来还是没变,下面是解决方法: 查找上面删除的文件,被引用的PID,然后kill掉进程 ``` [root@VM-0-9-centos: jd] ... ... java 10615 root 1w REG 253,1 35614191616 1442201 /project/jd/springboot.log (deleted) java 10615 root 2w REG 253,1 35614191616 1442201 /project/jd/springboot.log (deleted) java 10615 10616 root 1w REG 253,1 35614191616 1442201 /project/jd/springboot.log (deleted) java 10615 10616 root 2w REG 253,1 35614191616 1442201 /project/jd/springboot.log (deleted) java 10615 10617 root 1w REG 253,1 35614191616 1442201 /project/jd/springboot.log (deleted) ... ``` 杀掉指定的进程,然后再查看磁盘使用率,发现磁盘空间已经回收成功。 ``` [root@VM-0-9-centos: jd] [root@VM-0-9-centos: jd] Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 16G 31G 35% / devtmpfs 909M 0 909M 0% /dev tmpfs 920M 24K 920M 1% /dev/shm tmpfs 920M 8.7M 911M 1% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup tmpfs 184M 0 184M 0% /run/user/0 [1]+ Killed nohup java -Dloader.path="lib/" -jar myproject-0.0.1-SNAPSHOT.jar > springboot.log 2>&1 ``` ## 快照 - https://pic.rmb.bdstatic.com/bjh/240924/3a0ebab1a0e1e8d88aacb8d118635537357.png - https://i3.wp.com/pic.rmb.bdstatic.com/bjh/240924/3a0ebab1a0e1e8d88aacb8d118635537357.png ## 全文总结 本文主要介绍了 Linux 磁盘空间使用率 100%的两种解决办法及事情发生的原因。作者在服务器上部署了一个 Java 项目,因消息发送邮件报错导致日志文件变大,磁盘空间被占满。 **重要亮点** - **事情发生的原因**:服务器上部署的 Java 项目中,用户登录后会通过 RabbitMQ 消息中间件异步发送邮件到登录用户邮箱。由于新建账号忘记存储邮箱,消息发送邮件时一直报错,致使日志文件变得无比大,最终磁盘满了。 - **方法一:删除未被进程引用的大文件**:使用`df -h`命令查看磁盘使用百分比,进入根目录查看文件占用情况,找到大文件后删除,若删除的文件在进程中未被引用,删除后可直接看到磁盘使用量下降的效果。 - **方法二:删除被磁盘引用的大文件**:被内存引用的文件即使在磁盘上被删除,内存中仍在使用。作者通过启动一个 web 项目并往日志文件中写入数据使其变成大文件来演示。删除被引用的大文件后,使用`df -h`发现磁盘使用率未变,需查找被引用的 PID 并杀掉进程,才能成功回收磁盘空间。