我有 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,如果远程日志记录有助于缓解短暂的日志记录中断,那么它可以作为本地文件的替代方案。