【故障一、】
有一天某台机器报硬盘满, 我登陆上去看发现某分区的硬盘真的满了, 但是用du命令看该分区各个目录的大小.发现它们的大小却远远小于该分区的容量, 这是什么问题呢?
后来一想可能是某个已经打开的文件被删除了, 但是打开该文件的进程没有退出, 那么该文件占用的空间是不会被释放的. 终于我想起来了, 原来是同事不小心把新版的nginx tar到了正在使用中的nginx目录, 在发现有错之后终止了操作, 这个时候nginx的access.log已经被新的access.log替换掉了, 但是旧的文件依然是被打开的, 文件并没有真正的被操作系统删除, nginx进程不停地向该fd写入日志, 导致日志文件越来越大, 终于几天后把磁盘占满了..
解决办法reload一下nginx, 它会重新打开access.log, 那么之前的文件描述符会被释放, 这个时候操作系统会将旧文件删除, 磁盘空间也会被释放.
之前同事的vps也碰过这个问题, 他使用了nohup命令, 会生成一个nohup.out文件在本地磁盘, 某天他看这个文件不顺眼, rm了它, 但是这个nohup.out不停地增大, 导致vps爆了.
【故障二、】
半夜三更被短信吵醒,又是服务器空间满的报警短信.
这次空间满的是/var
登陆服务器查看时候发现空间已经恢复正常,再查一下登陆记录,发现没有其他人登陆处理过.
12K /var/account
1.3M /var/cache
8.0K /var/crash
8.0K /var/cvs
28K /var/db
32K /var/empty
8.0K /var/games
972M /var/lib
8.0K /var/local
48K /var/lock
80M /var/log
16K /var/lost+found
4.0K /var/mail
8.0K /var/nis
8.0K /var/opt
8.0K /var/preserve
8.0K /var/racoon
196K /var/run
9.2M /var/spool
8.0K /var/tmp
96K /var/www
24K /var/yp
/var/lib目录占用空间最大,继续查
40K /var/lib/alternatives
8.0K /var/lib/bluetooth
8.0K /var/lib/cs
8.0K /var/lib/dbus
8.0K /var/lib/dhclient
8.0K /var/lib/dhcpv6
8.0K /var/lib/games
8.0K /var/lib/hal
8.0K /var/lib/iptraf
8.0K /var/lib/logrotate.status
16K /var/lib/misc
934M /var/lib/mlocate
8.0K /var/lib/mrtg
8.0K /var/lib/multipath
48K /var/lib/nfs
8.0K /var/lib/ntp
4.0K /var/lib/random-seed
35M /var/lib/rpm
2.4M /var/lib/scrollkeeper
48K /var/lib/sepolgen
8.0K /var/lib/setroubleshoot
16K /var/lib/stateless
8.0K /var/lib/up2date
16K /var/lib/xkb
8.0K /var/lib/yum
/var/lib/mlocate 目录占用空间最大
-rw-r----- 1 root slocate 978115841 Jun 26 04:35 mlocate.db
900多M大的mlocate.db 是什么用途的呢?
使用linux man大法查询,
man最后的
locate(1), updatedb.conf(5), updatedb(8)
mlocate.db是locate命令使用的数据库文件. (locate命令请自行google)
updatedb是负责更新mlocate.db 的命令
updatedb.conf是updatedb的配置文件,内容如下
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp"
PRUNEFS 是updatedb扫描时候忽略的文件系统
PRUNEPATHS 是updatedb扫描时候忽略的目录
真相大白了,该服务器是大容量图片存储,updatedb运行时候把存放图片的目录也扫描了,导致mlocate.db文件巨大.
而更新的时候导致/var目录满了, updatedb失败,释放临时空间,/var目录空间又恢复正常了.
修改updatedb.conf,如下可解决问题
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp"
由于一般我们都会把存放数据的目录化成reiserfs xfs两种文件系统,所以可以忽略掉.
问题解决,over
注意:
man的时候记得注意看see also,这个很有用