Linux inode 资源耗尽问题

Linux 下文件数据储存在块(block)中,文件的元信息(创建者、创建日期、大小等)储存在 inode 中,inode 中文译为”索引节点”。

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 的监控。

用 df -i 查看 inodes 使用情况,加 -h 为 df -hi(磁盘空间则为 df -h)。inodes 大小在格式化分区时确定,与分区大小相关——分区越大 inodes 越多。Linux 根目录分区一般较小,若有定时产生的小文件未及时清理,很容易占满 inodes。

查看文件最多的目录

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

确定目录范围后可把 /* 写具体些。一个典型场景是 /var/spool/postfix/maildrop 目录小文件过多:Linux 执行 cron 时会把脚本的 output 和 warning 以邮件形式发给 cron 所有者,若 sendmail/postfix 未正常运行,邮件发送失败,小文件全部堆积在 maildrop 目录,且缺乏自动清理机制。排查后通常能找到每分钟产生一个小文件的定时任务(如时钟同步)。

删除大量文件

ls | xargs -n 1000 rm -rf

需要用 xargs 分批,否则会删除失败。

预防措施

设置 MAILTO:在 crontab -e 第一行加 MAILTO="",就不再产生邮件文件。

重定向输出:不需要日志输出的定时任务把日志重定向到 /dev/null:

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

定时清理文件

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

小结

应注意 crontab 的写法,并对产生的文件做定时清理,同时监控 inodes 的使用情况。


   转载规则


《Linux inode 资源耗尽问题》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Linux systemd 入门教程:命令篇 Linux systemd 入门教程:命令篇
一、由来历史上,Linux 的启动一直采用 init 进程。下面的命令用来启动服务: $ sudo /etc/init.d/apache2 start # 或者 $ service apache2 start 这种方法有两个缺点。一是启
2018-12-13
下一篇 
Linux 下切换多个 GCC 版本 Linux 下切换多个 GCC 版本
一、查看当前 GCC 版本gcc -v 可以看出当前使用的是 gcc version 4.9.4。如果想使用 5.x 版本,先看看系统里有没有安装: ls /usr/bin/gcc* 这里已经安装过多个版本,可以看到有 gcc-4.9、gc
2018-11-15
  目录