![跟踪 Linux 下巨大的缓冲区使用情况](https://linux22.com/image/1608/%E8%B7%9F%E8%B8%AA%20Linux%20%E4%B8%8B%E5%B7%A8%E5%A4%A7%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5.png)
我有一个在 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-db
和slocate
/ 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 或之后不久的进程也明显是可疑的。