线上一台Linux服务器最近经常磁盘根分区满告警,
但不是普通的日志文件或数据文件过多过大,现象如下:

1)执行“df -h”查看各分区空间的使用情况
[root@XEN64 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.8G 8.7G 535M 95% /
devtmpfs 7.7G 0 7.7G 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 7.7G 666M 7.1G 9% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/sda3 20G 3.3G 16G 18% /usr/local

可以看到根分区使用率超过了预警值,
进入根目录,查看根目录下各子目录的大小:
[root@XEN64 /]# du -sm *
0 bin
180 boot
0 dev
24 etc
3 home
0 lib
0 lib64
1 lost+found
1 media
1 mnt
32 opt
du: cannot access 'proc/17842/task/17842/fd/4': No such file or directory
du: cannot access 'proc/17842/task/17842/fdinfo/4': No such file or directory
du: cannot access 'proc/17842/fd/4': No such file or directory
du: cannot access 'proc/17842/fdinfo/4': No such file or directory
0 proc
2 root
666 run
0 sbin
1 srv
0 sys
96 tmp
5856 usr
221 var

进一步检查/usr目录:
[root@XEN64 /usr]# du -sm *
358 1.2-compat
164 bin
1 etc
1 games
33 include
912 lib
432 lib64
101 libexec
3269 local
1 man
46 sbin
547 share
1 src
0 tmp

对比du和df的结果,可以发现两者的已使用大小不一致,
du命令得到的已用大小远小于df命令已用大小,初步猜测存已被删除文件仍然有进程在写它,导致du命令发现不了。
如果允许,最简单的处理方式是重启机器,不然用下列命令找出被删除的,但仍然可能有进程在写它的文件:
pids=`ps aux|awk '{print $2}'`;for pid in $pids; do lsof -p $pid|grep del; done

见到庐山真面目:
[root@XEN64 /proc]# pids=`ps aux|awk '{ if (NR>1) print $2}'`;for pid in $pids; do lsof -p $pid|grep del; done
stati 28885 root 1w REG 8,1 5969132048 409096 /tmp/process_monitor-root.log (deleted)
stati 28885 root 2w REG 8,1 5969132048 409096 /tmp/process_monitor-root.log (deleted)
stati 28885 root 3u REG 8,4 20480039 35651587 /data/consumer/log/consumer.log.5 (deleted)
consumer 29756 root 1w REG 8,1 5969132048 409096 /tmp/process_monitor-root.log (deleted)
consumer 29756 root 2w REG 8,1 5969132048 409096 /tmp/process_monitor-root.log (deleted)
consumer 29756 root 3u REG 8,4 20480039 35651587 /data/consumer/log/consumer.log.5 (deleted)

果然是有大量的已经删除文件,办法要么重启,要么重启持有它们的进程,问题即可解决。

04-17 13:12