zabbix监控告警--vfs.fs.inode不足5%的解决过程

摘要

  • 解决Linux索引节点(inode)用满导致故障的方法

zabbix告警

1
vfs.fs.inode[/,pfree]):5 %

解决过程

  • 登录linux系统后查看inode使用情况和磁盘使用情况

1
2
3
4
5
6
7
8
9
10
11
# inode 不足了
df -hi
文件系统 Inode 已用(I) 可用(I) 已用(I)%% 挂载点
/dev/xvda1 1.9M 1.8M 96K 96% /
tmpfs 251K 1 251K 1% /dev/shm

# disk 充足
df -hT
文件系统 类型 容量 已用 可用 已用%% 挂载点
/dev/xvda1 ext4 30G 18G 12G 61% /
tmpfs tmpfs 1003M 0 1003M 0% /dev/shm
  • 根据上面的查询结果初步判断是系统产生了大量的临时文件导致inode用尽了

  • 排查到底哪个目录下的文件数过多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 通过下面的命令统计文件数量前十名,这里发现是/var目录中文件异常的多
for i in /*; do echo "$(find $i |wc -l):$i"; done | sort -nr | head -n 10
1815728:/var
52498:/usr
18804:/proc
7333:/sys
1834:/lib
1447:/opt
1047:/etc
457:/dev
411:/lib64
245:/sbin

# 接着查看/var中的文件数量
for i in /var/*; do echo "$(find $i |wc -l):$i"; done | sort -nr | head -n 10
1813442:/var/spool
2033:/var/lib
85:/var/cache
82:/var/log
39:/var/run
24:/var/lock
7:/var/db
3:/var/yp
2:/var/empty
2:/var/account

# 接着查看/var/spool中的文件数量,这里基本定位到是/var/spool/clientmqueue目录
for i in /var/spool/*; do echo "$(find $i |wc -l):$i"; done | sort -nr | head -n 10
1812413:/var/spool/clientmqueue
7:/var/spool/mail
4:/var/spool/anacron
3:/var/spool/at
2:/var/spool/cron
1:/var/spool/mqueue
1:/var/spool/lpd
  • 百度一下/var/spool/clientmqueue目录的作用

1
2
3
‌Linux文件目录 /var/spool/clientmqueue/ 下的文件主要是由cron任务产生的输出文件。‌ 当cron任务中有输出内容时,如果服务器上没有配置sendmail服务,这些输出内容就会被保存到 /var/spool/clientmqueue/ 目录内。这是因为cron任务中的命令如果有输出(比如错误信息或者正常的输出信息),默认会通过sendmail发送,但如果服务器上没有配置sendmail服务,这些输出内容就会被保存到 /var/spool/clientmqueue/ 目录中。因此,这个目录下主要包含的是由cron任务产生的输出文件,这些文件记录了cron任务执行过程中的输出信息。

如果需要处理这些文件,可以通过修改crontab配置来实现。具体来说,可以在每个cron任务命令的末尾添加重定向操作,将输出内容抛弃,例如使用命令 >/dev/null 2>&1。这样,无论标准输出还是错误输出都会被重定向到 /dev/null,即被抛弃,从而避免在 /var/spool/clientmqueue/ 目录下产生不必要的文件。
  • 上面的解释说明/var/spool/clientmqueue目录下的文件可以被删除,所以直接删了就可以解决该问题了

1
2
3
4
5
# 文件数量过多,不能这么删除
# rm -rf /var/spool/clientmqueue/*

# 正确方法
find /var/spool/clientmqueue -name "*" -type f | xargs rm -rf

详解inode

  • inode是文件系统内一个重要的数据结构,它用来描述一个文件,包括文件名、文件类型、权限、所有者、创建时间、修改时间等。在Linux系统中,每个文件都有一个唯一的inode号,这个inode号是分配给该文件的,并且不能被改变。

1
2
# 查看当前目录的inode号
ls -li
  • 操作系统打开文件时会按如下步骤执行:

    • 查找文件名称对应的inode号
    • 根据inode号获取inode信息
    • 根据inode信息找到文件对应的数据块,读出数据
  • inode的大小是有限制的,通常取决于文件系统和操作系统。在大多数Linux文件系统中,inode大小通常是128字节或256字节。这是由文件系统在格式化时决定的,并且格式化后不能更改。

1
2
3
4
# 查看inode大小
dumpe2fs /dev/xvda1 | grep "Inode size"
dumpe2fs 1.43.5 (04-Aug-2017)
Inode size: 256
  • 查看文件系统的inode总数

一个inode只对应一个实际文件,所以inodes最大数量就是文件的最大数量。

1
2
3
4
5
# 查看所有挂载磁盘
df -i

# 查看指定磁盘
df -i /dev/xvda1
  • 不同的文件系统默认的inode数量不同,以1G磁盘空间为例,ext4文件系统默认为65536xfs文件系统默认为52万(每2k设置一个inode),并且xfs会动态扩容inode数量。