生产环境下案例 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

 1 [root@28-tab scripts]# crontab -e
 2 
 3 no crontab for root - using an empty one
 4 
 5 * * * * * /bin/sh /server/scripts/backupservice.sh
 6 
 7 * * * * * /bin/sh /server/scripts/backupservice.sh
 8 
 9 * * * * * /bin/sh /server/scripts/backupservice.sh
10 
11 * * * * * /bin/sh /server/scripts/backupservice.sh
12 
13 * * * * * /bin/sh /server/scripts/backupservice.sh

查看postfix服务是否开启

root@28-tab scripts]# lsof -i :25

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

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

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

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

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

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

 1 [root@28-tab scripts]# /etc/init.d/postfix stop
 2 
 3 Shutting down postfix:                                     [  OK  ]
 4 
 5 You have new mail in /var/spool/mail/root
 6 
 7 [root@28-tab scripts]# lsof -i :25
 8 
 9 [root@28-tab scripts]# ls /var/spool/postfix/maildrop/
10 1C8D040005B  2DCF5400488  4F7D440048C  68B1B4004B3  80EC34004D2  A043B4004E2  C1AC84004F5  D4EA8400504
11 1D602400462  2F4A3400489  563A4400498  69FEE4004BC  854444004D3  AB8984004E7  C32434004F6  E61E2400506
12 22C4F40047D  331E740048A  58D0A4004A2  759A94004BD  85BA04004D4  ABC024004F0  C48944004F7  E6252400507
13 2742040047E  3C7D040048B  5AF094004A3  75C614004BE  8689B4004D5  B17FB4004E3  C9A164004FC  E62E6400508
14 277C640047F  409C940048D  5C5AD4004AA  75F914004BF  8B4174004D8  B62834004F1  D26974004FD  E6338400505
15 2906D400480  4494640048E  5C9954004AB  789CC4004C8  8E54C4004D9  BD0DB4004F2  D27204004FE  E63F0400509
16 2B73B400485  46DDE400495  5D4604004AF  7ADD24004C9  92B494004DE  BE1314004F3  D278B400500  EBB0240050B
17 2D3E3400486  4D385400496  5F86B4004B2  7DF3C4004CC  9C59D4004A9  BE60C4004E6  D2879400501  EBB8340050A
18 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数量会消耗得更快。

 

posted @ 2016-12-19 17:14  活的潇洒80  阅读(1536)  评论(0编辑  收藏  举报