- 问题现象
- 问题分析
- 解决方案
服务器无法使用tab快捷键,提示磁盘空间不足(no space left on device)。
df -h 查看磁盘空间占用率100%
- 首先使用 sudo du / -h --max-depth=1 命令查看各个目录的占用空间,试图找到占用较多空间的目录
TEST@test:/$ sudo du / -h --max-depth=1 4.0K /srv 0 /dev 4.0K /mnt 8.0K /snap 17M /root 0 /sys 30G /var 1.2G /lib 26G /data 5.5G /opt 4.0K /lib64 1.4M /run 5.4G /home 3.9M /tmp 15M /bin 4.0K /cdrom 4.0K /media 0 /proc 18M /sbin 2.7G /usr 16K /lost+found 218M /boot 7.2M /etc 75G /
从结果看,并未存在占用大空间文件夹,帮继续排查。
2. 查看 inode 的使用率,怀疑 inode 不够导致此问题
TEST@test:/$ df -i Filesystem Inodes IUsed IFree IUse% Mounted on udev 2045094 478 2044616 1% /dev tmpfs 2053123 794 2052329 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 32702464 1258976 31443488 4% / tmpfs 2053123 1 2053122 1% /dev/shm tmpfs 2053123 4 2053119 1% /run/lock tmpfs 2053123 18 2053105 1% /sys/fs/cgroup /dev/vda2 65536 313 65223 1% /boot tmpfs 2053123 11 2053112 1% /run/user/1000 tmpfs 2053123 11 2053112 1% /run/user/999
通过 df -i 命令查看后发现 inode 使用率也正常的,只能进一步分析。
- 使用 lsof 检查,怀疑是不是有可能文件已被删除,但是进程还存活的场景
TEST@test:/$ sudo lsof |grep delete java 8339 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8340 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8340 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8341 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8341 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8342 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8342 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8343 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8343 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8344 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) java 8339 8344 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) VMx20Thr 8339 8345 dknova 1w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted) VMx20Thr 8339 8345 dknova 2w REG 253,0 23067 1310826 /opt/web_servers/logs/dev_new_stdout.log (deleted)
Linux 里的文件被删除后,空间没有被释放是因为在 Linux 系统中,通过 rm 或者文件管理器删除文件将会从文件系统的目录结构上解除链接 (unlink) 。然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。装态为 deleted 为标记被删除,其实该文件并没有从磁盘中删除,类似windows下的回收站状态。
可看到大量的java进程指向日志文件,重启服务后,再次df -h,大量空间已释放
TEST@test:/$ df -h Filesystem Size Used Avail Use% Mounted on udev 7.9G 0 7.9G 0% /dev tmpfs 1.6G 1.4M 1.6G 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 492G 75G 397G 16% / tmpfs 7.9G 0 7.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup /dev/vda2 976M 220M 689M 25% /boot tmpfs 1.6G 0 1.6G 0% /run/user/1000 tmpfs 1.6G 0 1.6G 0% /run/user/999
虽然空间已释放,但是这次导致原因是,业务日志导致,为防止下次情况发生,需要进一步查看日志配置。
- 查看业务logback配置
logs/dev_err.log true error ${log.pattern} UTF-8
问题1:日志文件并未定期转储,且采取的是不断追加的形式写入日志,随着时间文件大小会不断增长。
问题2:日志文件未分级限制,即非error日志,如debug日志也写入了error文件中,导致文件大小倍数增加。
问题3:非开发环境下,开启了sql日志,也导致了文件大小倍数增加。
spring.jpa.show-sql=true
问题4:再者是人为的对日志进行仅删除操作,并未重启服务,导致磁盘间使用率不断递增。
解决方案- 对非开发环境关闭sql日志输出。
- 对logback配置进行优化,添加文件转储备份策略及日志过滤条件,如下:
${log.path}/dev-err.log ${log.path}/dev-error.%d{yyyy-MM-dd}.log 7 ERROR ACCEPT DENY ${log.pattern} UTF-8



