找出inode消耗原因

在生产环境上,如果出现inode大量消耗的情况,是需要通过快速定位找出使用inode最多的文件目录。但是,我们还需要进一步找出大量生成文件的原因。

我们已经定位了大量文件存在于 tmp/exec 目录,现在我们排查文件写入的进程来源。

虽然文件大量快速生成,但是进程写文件都是瞬间完成,无法简单通过iotop找出源头。所以,我们同样需要使用 audit 来审计记录文件生成来源。

  • 启用audit

systemctl start auditd
  • 然后记录谁写了这个目录

auditctl -w /tmp/exec -S execve

提示错误

WARNING - 32/64 bit syscall mismatch, you should specify an arch
Error sending add rule data request (Rule exists)

改成

auditctl -w /tmp/exec -F arch=b64 -S execve

提示

arch must be before -S
  • 添加规则

auditctl -a create -F arch=b64 -S execve -k MYEXEC
auditctl -w /tmp/exec -p war -k whatsgoingon
  • 显示当前rule

auditctl -l

清理rule

  • 记录下

这里有一个问题,可以看到不断有新的线程创建文件,例如上面的 ppid=54667 pid=37768

  • 抓到了:

原来进程是 pouchd

  • audit对系统有影响,所以排查完问题之后我们可能需要停止audit

奇怪,无法停止auditd

这个问题在 Prevent stop auditd service in Redhat 7 有解释

原来 systemd 配置中禁止手工停止auditd RefuseManualStop=yes

所以改为传统命令停止方式

清理文件

既然我们已经找出了大量生成文件的原因,除了我哦们需要进一步排查pouch大量生成异常文件的原因,我们还需要做文件清理。但是文件系统中大量文件清理是非常消耗资源和缓慢的,我们需要有一个 高效清理文件系统大量文件的方法

Last updated

Was this helpful?