/etc/passwd 不断访问

sta*_*oat 4 io amazon-ec2

我在 EC2(Cent OS,2.6.35.14,x86_64)上运行服务器,最近我超过了每月 100 万次 I/O 的配额,这很荒谬,因为我的磁盘利用率不应该接近该配额。(我没有运行任何需要大量磁盘访问的服务......甚至任何磁盘访问)

我的第一个想法是启动 iotop,看看是否有任何进程不断地写出到磁盘。iotop 向我展示了一个名为jbd2的进程每分钟不止一次地向磁盘写入数据。

经过一番 谷歌搜索后,问题似乎是内核错误,或者是某个守护进程定期接触磁盘。

我安装了 inotify-tools 并在整个文件系统上启动了 inotifywait;

sudo /usr/local/bin/inotifywait -m -r /!(dev|proc)
Run Code Online (Sandbox Code Playgroud)

这表明 /etc/passwd 正在被打开,访问,然后关闭,每分钟多次。没有我在系统上做任何其他事情!inotify 没有告诉你什么进程在做触摸,但我安装了审计(http://people.redhat.com/sgrubb/audit/),在 /etc/passwd 上设置了一些日志并让它运行一段时间,然后查看日志,但他们告诉我的是它正在被 sudo 访问:(用户名已编辑)

type=SYSCALL msg=audit(10/03/2011 17:48:30.493:260) : arch=x86_64 syscall=open success=yes exit=4 a0=7f809205669a a1=80000 a2=1b6 a3=0 items=1 ppid=6466 pid=6467 auid=**** uid=root gid=**** euid=root suid=root fsuid=root egid=**** sgid=**** fsgid=**** tty=pts0 ses=79 comm=sudo exe=/usr/bin/sudo key=(null) 
type=SYSCALL msg=audit(10/03/2011 17:48:30.493:261) : arch=x86_64 syscall=open success=yes exit=4 a0=7f809205669a a1=80000 a2=1b6 a3=0 items=1 ppid=6466 pid=6467 auid=**** uid=root gid=**** euid=root suid=root fsuid=root egid=**** sgid=**** fsgid=**** tty=pts0 ses=79 comm=sudo exe=/usr/bin/sudo key=(null) 
type=SYSCALL msg=audit(10/03/2011 17:48:30.488:256) : arch=x86_64 syscall=open success=yes exit=3 a0=7f809205669a a1=80000 a2=1b6 a3=0 items=1 ppid=6441 pid=6466 auid=**** uid=**** gid=**** euid=root suid=root fsuid=root egid=**** sgid=**** fsgid=**** tty=pts0 ses=79 comm=sudo exe=/usr/bin/sudo key=(null)
...
Run Code Online (Sandbox Code Playgroud)

有什么办法可以进一步缩小范围吗?我的 cron 文件中没有任何内容,也没有我能想到的其他服务会导致这种情况:

chkconfig | grep on
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
cgconfig        0:off   1:off   2:off   3:off   4:off   5:off   6:off
cloud-init      0:off   1:off   2:on    3:on    4:on    5:on    6:off
cloud-init-user-scripts 0:off   1:off   2:on    3:on    4:on    5:on    6:off
conman          0:off   1:off   2:off   3:off   4:off   5:off   6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:off   3:on    4:on    5:on    6:off
lvm2-monitor    0:off   1:on    2:on    3:on    4:on    5:on    6:off
mdmonitor       0:off   1:off   2:on    3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netfs           0:off   1:off   2:off   3:on    4:on    5:on    6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
restorecond     0:off   1:off   2:off   3:off   4:off   5:off   6:off
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off
sendmail        0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
udev-post       0:off   1:on    2:on    3:on    4:on    5:on    6:off
yum-updatesd    0:off   1:off   2:on    3:on    4:on    5:on    6:off
Run Code Online (Sandbox Code Playgroud)

use*_*517 5

当您使用 CentOS 时,您应该能够通过查看/var/log/secure例如了解 sudo 正在做什么

sudo tail /var/log/secure
Run Code Online (Sandbox Code Playgroud)

10 月 4 日 03:45:44 ec2-centos-instance sudo: iain: TTY=pts/0 ; PWD=/home/iain ; 用户=根;命令=/usr/bin/tail /var/log/secure

编辑:更新评论的答案

使用以下方法启用块转储:echo 1 > /proc/sys/vm/block_dump并使用 dmesg 查看它有助于跟踪哪些进程正在访问磁盘。比iotop可靠得多。事实证明,sar 一直在运行,写到 /var/log/sa/saXX 所以我在 cron.d 中禁用了它,一切又好了

  • 我将此标记为答案,因为它对我帮助最大,但最终对我来说实际上是启用块转储(`echo 1 > /proc/sys/vm/block_dump`)并查看它使用 dmesg 查看哪些进程正在访问磁盘。比iotop可靠得多。事实证明,**sar** 一直在运行,写到 /var/log/sa/saXX 所以我在 cron.d 中禁用了它,一切又好了。 (2认同)