我有一台在 Debian Lenny 下运行的 Linux 服务器,带有 4Go 的 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、daily 和 user crontab,在那个时间什么都不做。
这是我关于 cron 的日志中有趣的部分:
auth.log-20110501:May 1 03:05:01 SRV CRON[15914]: pam_unix(cron:session): session 为用户 root (uid=0)
auth.log-20110501:May 1 03:05:01 打开SRV CRON[15914]: pam_unix(cron:session): session 为用户 root
syslog-20110501:May 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 ; } )
您的服务器是否以 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
Run Code Online (Sandbox Code Playgroud)
设置审计,然后
$ sudo aureport -s -i -ts 03:04 -te 03:06
Run Code Online (Sandbox Code Playgroud)
3.05之后登录系统查看发生了什么情况。
第二个是简单的ps。只需编写一个运行ps多次的脚本,并将其安排在 3.04 运行即可。
的许多方面ps在这里都很有用,例如,wchan用于status查看哪些进程正在执行 I/O 以及pcpu查看哪些进程当时使用最多 CPU 的字段。当然,任何未出现在 3.04.59 的列表中但出现在 3.05.01 或之后不久的进程也明显是可疑的。