在创建和删除许多文件后,ext3 中的 /var/log 目录 inode 巨大

在创建和删除许多文件后,ext3 中的 /var/log 目录 inode 巨大

我有 Debian Jessie,/var/log 位于 ext3 类型的根分区上(rw、relatime、data=ordered)。四天前 logrotate 转储了数万个文件,这个问题已修复,文件已删除。之后:

# du -hc /var/log/
511M    total

文件和子目录只有255M:

#du -hc --exclude=.. --exclude=. /var/log/* /var/log/.*
255M    total

其余的是目录本身:

# ls -ldh /var/log
drwxr-xr-x 15 root root 257M Feb 18 06:55 /var/log
# stat /var/log
  File: ‘/var/log’
  Size: 268496896       Blocks: 524936     IO Block: 4096   directory

/var/log 上的某些操作(在我看来是随机的)需要很长时间(最多 5 分钟)。由于非技术原因,我现在既不能卸载也不能以只读方式重新挂载它。

为什么会出现如此大的目录,为什么会导致巨大的滞后?如何在不卸载的情况下“缩小”它?停止 rsyslog、创建新目录、将 /var/log 内容移动到该目录并重命名为 /var/log 可能有哪些注意事项,类似于建议的https://serverfault.com/a/487245

答案1

使用 ext3,目录的大小永远不会减小。如果其大小在某一时刻很大,则即使清理后,其大小仍然很大。相比之下,例如使用 xfs,清理后的目录的大小会进行调整(实时)。

答案2

正如您所说,该目录中有数万个文件。目录条目列表很大读取所有内容既昂贵又缓慢。如果您碰巧查看最近访问的文件时该文件仍在缓存中,则速度会快得多。

移动目录并创建新目录是一种有效的缓解方法。您可以随时删除速度较慢的目录,即使这需要一段时间。

fsck 也可能优化目录,但这需要将其卸载。

对于 syslog,如果远程日志记录有助于缓解短暂的日志记录中断,那么它可以作为本地文件的替代方案。

相关内容