Linux inode资源耗尽问题

Linux 系统下文件数据储存在块中,文件的元信息,例如文件的创建者、文件的创建日期、文件的大小等。这种储存文件元信息的区域就叫做inode,中文译名为索引节点。inode也占用硬盘空间,硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode区,存放inode所包含的信息。每个inode节点的大小,一般是 128 字节或 256 字节。inode 节点的总数,在格式化时就给定,一般是每 1KB 或每 2KB 就设置一个inode。假定在一块 1GB 的硬盘中,每个inode节点的大小为 128 字节,每 1KB 就设置一个inode,那么 inode table 的大小就会达到 128MB,占整块硬盘的 12.8%。inodes使用完与存储空间使用完相似,都是创建不了文件或无法正常执行一些命令。inodes使用完,存储空间可能还有,这种情况一般是生成了大量的小文件,把 inode table 占满。一般情况下存储空间使用完,inodes往往才使用百分之几,所以容易忽视对inodes使用情况的监控。
查看 inodes使用情况,使用df -i命令。上述两个命令可以使用 -h 参数,命令为 df -hdf -hi。从图中看见磁盘空间使用 71%,但是inodes使用 100%。inodes 的大小在磁盘格式化分区时确定,跟分区的大小相关,分区越大,inodes越大,反之亦然。linux 操作系统根目录一般分区比较小,如果有定时性的小文件产生而又未及时清理,则很容易造成inodes占满。

查看文件最多的目录

for i in /*; do echo $i; find $i | wc -l; done

如果确定目录范围,把 /* 写的具体点。
最终发现是 /var/spool/postfix/maildrop 目录下小文件过多,原因如下:由于 linux 在执行cron时,会将cron执行脚本中的 output 和 warning 信息,都会以邮件的形式发送给cron所有者。由于客户环境中的 sendmail 和 postfix 没有正常运行,邮件发送不成功,导致全部小文件都堆积在 maildrop 目录下,另由于缺乏自动清理的机制,故此目录下堆积了大量的文件。经过排查 root 用户下发现有个每分钟进行一次时钟同步的定时任务,该定时任务每分钟产生一个小文件。

删除大量文件

ls | xargs -n 1000 rm -rf

需要使用 xargs 命令,不然会删除失败。

设置方面

在 crontab -e 第一行增加 MAILTO="",就没有文件产生啦。

重定向

对定时任务设置定向输出文件,不需要日志输出的定时任务可以将日志重定向到 /dev/null,如下:

*/10 * * * * /tmp/test.sh >/dev/null 2>&1

定时清理文件

find 目录 -type f -mtime +30 | xargs -n 1000 rm -f

监控 inodes 的使用

备注:应注意 crontab 的写法和产生的文件的定时清理


   转载规则


《Linux inode资源耗尽问题》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Linux 技巧 Linux 技巧
如果要谨慎使用rm命令,可以为它设置一个别名,在删除文件之前需要进行确认才能删除。有些系统管理员会默认使用这个别名,对于这种情况,你可能需要看看下一个技巧。 $ rm -i <== 请求确认 你可以使用unalias命令以交互方
2018-11-29
下一篇 
Linux grep文本查找 Linux grep文本查找
之前介绍过很多 linux 下查找相关的命令,而对文件内容搜索的命令似乎还没有涉及,因此本文介绍文本搜索命令grep。我们会经常结合管道符(|)来使用它,即在前面命令执行的结果中查找包含相关字符串的内容。例如: $ ps -ef | gre
2018-11-01
  目录