生产环境下案例 No space left on device (inode使用满的情况)

第一种情况:

问题:

如果想磁盘写入数据提示如下错误:

No space left on device。 

通过df -h查看磁盘空间,发现没满,请问可能原因是什么?

解答

可能是inode数量被消耗尽了。

df -i查看是否耗尽了inode数量。

企业工作中邮件临时队列/var/spool/clientmquene这里很容易被大量小文件占满导致No space left on device的错误。

clientmquene目录只有安装了sendmail服务才会有。CentOS5.X默认会装sendmial,CentOS6.5默认没有sendmail。

知识点:

CentOS5系列的系统会默认安装Sendmail服务,因此邮件临时存放地点的路径/var/spool/clientmqueue/。

CentOS6默认情况下没有安装Sendmail服务,而是安装了Postfix服务,因此邮件存放地点的路径为/var/postfix/maildrop/。

以上两个目录很容易被垃圾文件填满导致系统的inode数量不够用,从而导致无法放文件。

当定时任务执行结尾不加>/dev/null 2>&1的时候,定时任务就会把上述目录就会存在大量小文件

环境模拟

创建定时任务不加>/dev/null 2>&1

 [root@-tab scripts]# crontab -e

 no crontab for root - using an empty one

 * * * * * /bin/sh /server/scripts/backupservice.sh

 * * * * * /bin/sh /server/scripts/backupservice.sh

 * * * * * /bin/sh /server/scripts/backupservice.sh

 * * * * * /bin/sh /server/scripts/backupservice.sh

 * * * * * /bin/sh /server/scripts/backupservice.sh

查看postfix服务是否开启

root@-tab scripts]# lsof -i :

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

master   root   12u  IPv4        0t0  TCP localhost:smtp (LISTEN)

master   root   13u  IPv6        0t0  TCP localhost:smtp (LISTEN)

postfix服务是否开启状态下查看/var/spool/postfix/maildrop/目录

[root@-tab scripts]# ls /var/spool/postfix/maildrop/

停止postfix查看/var/spool/postfix/maildrop/目录

 [root@-tab scripts]# /etc/init.d/postfix stop

 Shutting down postfix:                                     [  OK  ]

 You have new mail in /var/spool/mail/root

 [root@-tab scripts]# lsof -i :

 [root@-tab scripts]# ls /var/spool/postfix/maildrop/
1C8D040005B 2DCF5400488 4F7D440048C 68B1B4004B3 80EC34004D2 A043B4004E2 C1AC84004F5 D4EA8400504
1D602400462 2F4A3400489 563A4400498 69FEE4004BC 854444004D3 AB8984004E7 C32434004F6 E61E2400506
22C4F40047D 331E740048A 58D0A4004A2 759A94004BD 85BA04004D4 ABC024004F0 C48944004F7 E6252400507
2742040047E 3C7D040048B 5AF094004A3 75C614004BE 8689B4004D5 B17FB4004E3 C9A164004FC E62E6400508
277C640047F 409C940048D 5C5AD4004AA 75F914004BF 8B4174004D8 B62834004F1 D26974004FD E6338400505
2906D400480 4494640048E 5C9954004AB 789CC4004C8 8E54C4004D9 BD0DB4004F2 D27204004FE E63F0400509
2B73B400485 46DDE400495 5D4604004AF 7ADD24004C9 92B494004DE BE1314004F3 D278B400500 EBB0240050B
2D3E3400486 4D385400496 5F86B4004B2 7DF3C4004CC 9C59D4004A9 BE60C4004E6 D2879400501 EBB8340050A
2D694400487 4E755400497 652644004A8 7F44E4004CD A03254004DF C04B94004F4 D46EA400503 F20AA40050

详细解决办法:/var/spool/clientmqueue 下生成太多文件处理

拓展:

一个100M(block的总大小,个数和单个block大小有关)的磁盘分区,分别写入0.5K的文件或写入1 M的文件,分别可以写多少个?为什么?

解答:

  1. 默认分区常规情况下,对大文件来讲inode是足够的。而block数量会消耗得更快,block为4K的情况,1M的文件不会有磁盘浪费情况,所以文件数量大概为100/1=100个。
  2. 对于小文件0.5K,inode会消耗得更快。默认分区的时候block数量是大于inode数量的。 每个小文件都会占用一个inode和一个block。所以最终文件的数量是inode会消耗完,文件总量是inode的数量。

知识点:

  1. inode是存放文件属性信息的(也包含指向文件实体的指针),默认大小128字节(C5),256字节(C6)。
  2. block是存放文件实际内容的,默认大小1K(boot)或4K(非系统分区)。
  3. 一个文件至少要占用一个inode及一个block。
  4. 默认分区常规情况下,inode数量是足够的。而block数量会消耗得更快。
上一篇:inode占满导致No space left on device inode快速解决方法


下一篇:AndroidStudio 多层级 Module 对 aar 引用问题