/var 上的空间被用在哪儿?

/var 上的空间被用在哪儿?

我是一名新手 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 没有关闭所有线程。

问候

相关内容