跟踪 Linux 下巨大的缓冲区使用情况

跟踪 Linux 下巨大的缓冲区使用情况

我有一个在 Debian Lenny 下运行的 Linux 服务器,内存为 4Go。它运行不多,只是:

  • Postfix/spamassassin(守护进程模式)
  • 绑定9
  • KVM(一位客人 - 1Go RAM)

每天 UTC 时间正好 3:05,服务器的几乎所有内存都会完全下降到底层。之后,我的缓冲区使用了超过 2G 并且从未清理过(除非我手动告诉内核删除缓存)。

我在网上搜索了很多,一开始我认为这是由于 NFS 缓冲区的使用造成的。我使用 gzip/tar 通过 NFS 共享驱动器进行备份,备份发生在 3:05。

然而,我现在处于一个非常奇怪的情况,因为我在 1:40 移动了备份任务(它在 2 分钟内完成),但我仍然在 3:05 删除所有 RAM。

在我的日志中,没有什么特别的,除了在 03:05:01,cron 以 root 身份打开一个会话,并在 03:05:02 立即关闭它,而不执行任何操作。当然,cron 已经重新启动,并且我检查了任务的时间 - 再次,没有什么特别的。

知道为什么会发生这种情况吗?或者,知道如何跟踪使用所有这些缓冲区的内容吗?


编辑:服务器以UTC运行,这里的所有时间都是UTC。它没有运行任何 NFS 服务器,并且我没有安装 mlocate 或 slocate。对于 crontab、每日和用户 crontab,在该时间不执行任何操作。

这是我的日志中关于 cron 的有趣部分:

auth.log-20110501:5 月 1 日 03:05:01 SRV CRON[15914]: pam_unix(cron:session): (uid=0) 为用户 root 打开的会话
auth.log-20110501:5 月 1 03:05:01 SRV CRON[15914]:pam_unix(cron:session):用户 root 的会话已关闭
syslog-20110501:5 月 1 日 03:05:01 SRV /USR/SBIN/CRON[15915]:(root)CMD([ -x /usr /lib/sysstat/sa1 ] && { [ -r "$DEFAULT" ] && . "$DEFAULT" ; [ "$ENABLED" = "true" ] && exec /usr/lib/sysstat/sa1 $SA1_OPTIONS 1 1 ; )

答案1

您的服务器是否以 UTC 运行?大多数会在本地时区运行,我猜对你来说是 UTC+1(MET 或 CET)。我问这个问题是因为我们需要知道 crontab 中使用的时区,例如 3.05 在 crontab 中可能不被称为 3.05。

进行大量磁盘访问的常见任务包括makewhatis/man-dbslocate/ mlocate。仔细检查它们没有在 3.05 左右运行,例如查看/etc/crontab/etc/cron.daily。检查 中的用户 cron 选项卡/var/spool/cron

我可以想到两种方法来找出 3.05 上正在运行的内容,而无需 cron 日志。

第一个是auditctl,用起来有点痛苦。

根据手册页,我会尝试以下操作:

$ sudo auditctl -a entry,always -S open -S creat \
    -S read -S readv -S write -S writev -S sendfile \
    -S fork -S clone -S execve -k 305

设置审计,然后

$ sudo aureport -s -i -ts 03:04 -te 03:06

3.05之后登录系统查看发生了什么情况。

第二个是简单的ps。只需编写一个运行ps多次的脚本,并将其安排在 3.04 运行即可。

的许多方面ps在这里都很有用,例如,wchan用于status查看哪些进程正在执行 I/O 以及pcpu查看哪些进程当时使用最多 CPU 的字段。当然,任何未出现在 3.04.59 的列表中但出现在 3.05.01 或之后不久的进程也明显是可疑的。

相关内容