我是一名新手 Linux 管理员,目前负责 3 节点 Tomcat 集群的操作系统。(幸运的是,Tomcat 由开发人员负责。)
我们的监控解决方案让我感到震惊,server01 上的 /var 只剩下 172MB 的可用空间。很可能是因为 /var/log 已经满了。
因此我进行了调查:
server01:/var# for i in $(ls); do du -sh $i; done
3.5M backups
100M cache
51M lib
0 local
0 lock
598M log
0 mail
0 opt
40K run
32K spool
144K tmp
4.0K www
如果我把这些加起来,最终会发现使用了大约 760MB。如果我深入研究目录树,这些数字不会改变。所以这是正确的。
但是如果我执行 df -h,我最终会得到 /var 的完全不同的数字。df 显示使用了 3.0G 中的 2.8G。
server01:/var# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 950M 205M 697M 23% /
tmpfs 2.0G 0 2.0G 0% /lib/init/rw
udev 2.0G 4.0K 2.0G 1% /dev
/dev/sda3 961M 33M 928M 4% /tmp
/dev/dm-0 2.0G 506M 1.5G 26% /usr
/dev/dm-1 3.0G 2.8G 172M 95% /var
/dev/dm-2 20G 17G 3.3G 84% /home
有趣的是,其他 2 个节点报告 /var 上的使用空间更多。因为节点 2 和 3 上的 /var/log/ 占用了 200-300MB 以上的空间。但所有 3 个节点上的分区和底层 LVM 大小相同。
在 server02 和 server03 上,df -h 报告一切正常,从 3.0GB 中仅使用了 1.0 到 1.2GB。
那么我的空间被用在哪儿了?
我听说过那些叫做 inode 的小混蛋,并对此进行了检查。df -i 报告:
server01:/var# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 123648 6099 117549 5% /
tmpfs 506908 3 506905 1% /lib/init/rw
udev 506487 675 505812 1% /dev
/dev/sda3 987968 7 987961 1% /tmp
/dev/dm-0 2048000 19786 2028214 1% /usr
/dev/dm-1 705808 1807 704001 1% /var
/dev/dm-2 13619632 5906 13613726 1% /home
在 server02 和 server03 上:
server03:/var# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 123648 6100 117548 5% /
tmpfs 506908 3 506905 1% /lib/init/rw
/dev 506487 675 505812 1% /dev
/dev/sda3 987968 7 987961 1% /tmp
/dev/dm-0 2048000 19784 2028216 1% /usr
/dev/dm-1 3096576 1758 3094818 1% /var
/dev/dm-2 13113840 5642 13108198 1% /home
因此,server01 上的 /var 有 705.808 个 inode,而 server02 和 server03 上的 /var 有 3.096.576 个 inode。但这真的是原因吗?因为每个节点上只使用了 1%。
如果是,我该如何增加 inode?(所有文件系统都是 XFS,即 ext2)
所有 3 个节点上的 /etc/fstab 都相同。操作系统是 Debian Lenny 64 位,内核为 2.6.35.4。
问候
答案1
您可以运行lsof | grep deleted
并检查哪些程序分配了此空间(和已删除的文件)。
例子:
[root@mab-01 ~]# lsof | grep deleted
hald-addo 2651 haldaemon txt REG 253,0 15720 3769183 /usr/libexec/hald-addon-keyboard.#prelink#.IhBW5L (deleted)
yum-updat 2899 root txt REG 253,0 4736 3276902 /usr/bin/python.#prelink# (deleted)
mongod 5535 mongod txt REG 253,0 8640360 3484794 /usr/bin/mongod (deleted)
mongod 5535 mongod 1w REG 253,0 278032 262244 /var/log/mongo/mongod.log.rpmsave (deleted)
mongod 5535 mongod 2w REG 253,0 278032 262244 /var/log/mongo/mongod.log.rpmsave (deleted)
答案2
/var/log 确实填满了
如果您删除由某个进程打开以供写入的日志文件,则文件名会消失(因此 du 看不到?),但分配的空间仍然会分配,并且随着进程继续写入,分配的空间会增加。
如果日志是 TomCat 日志,则需要告诉 Tomcat 重新打开其日志文件。
注意此处的“copytruncate”例子。但我不知道这是否适用于你的情况。
答案3
感谢您提供 lsof | grep removed 的提示。事实上,我得到了数十个 Apache2 和 Tomcat6 的已删除文件。
server01:~# lsof | grep deleted | wc -l
124
重新启动 Apache2 后,删除的文件数量减少到 40 个。/var 上有 2.4 GB 的可用空间。我还在其他 2 台主机上搜索了已删除的文件,发现在 server02 上也有已删除的文件仍处于打开状态。幸运的是,这次我之前发出了“ps auxf”。在那里我看到一个 Apache2 线程自 11 月 8 日起处于打开状态。在“kill -9 $oldapache2threadpid”之后,这些已删除的文件也消失了。也许这也是 server01 上的问题。
然后我在 server01 上重新启动了 Tomcat 服务。删除的文件也消失了,但可用空间没有增加。但现在 /var 上的可用空间与 du -sch 告诉我的一致(增加了几 MB)。
所以,感谢大家的帮助:-)
仍然需要调查为什么 Apache 没有关闭所有线程。
问候