linux inotify的一些细节知识

来源:互联网 发布:打字教程软件 编辑:程序博客网 时间:2024/05/21 06:16

1. Inotify 机制概述

1.1. Inotify 介绍

在日常的运维过程中,经常需要备份某些文件,或者对系统的某些文件进行监控,比如重要的配置文件等。如果需要作到实时同步或者监控,就需要使用内核的inotify机制
Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能

  • Inotify 不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在 umount 该介质上的文件系统后,被监视目标对应的 watch 将被自动删除,并且会产生一个 umount 事件。
  • Inotify 既可以监视文件,也可以监视目录。
  • Inotify 使用系统调用而非 SIGIO 来通知文件系统事件。
  • Inotify 使用文件描述符作为接口,因而可以使用通常的文件 I/O 操作select 和 poll 来监视文件系统的变化。

1.2. Inotify 可监视的文件系统事件

  • IN_ACCESS : 即文件被访问
  • IN_MODIFY : 文件被 write
  • IN_ATTRIB : 文件属性被修改,如 chmod、chown、touch 等
  • IN_CLOSE_WRITE : 可写文件被 close
  • IN_CLOSE_NOWRITE : 不可写文件被 close
  • IN_OPEN : 文件被open
  • IN_MOVED_FROM : 文件被移走,如 mv
  • IN_MOVED_TO : 文件被移来,如 mv、cp
  • IN_CREATE : 创建新文件
  • IN_DELETE : 文件被删除,如 rm
  • IN_DELETE_SELF : 自删除,即一个可执行文件在执行时删除自己
  • IN_MOVE_SELF : 自移动,即一个可执行文件在执行时移动自己
  • IN_UNMOUNT : 宿主文件系统被 umount
  • IN_CLOSE : 文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
  • IN_MOVE : 文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

注:上面所说的文件也包括目录

1.3. Inotify内核版本支持

  • kernel 2.6.13开始,Inotify正式并入内核,RHEL5已经支持.

  • 看看是否有 /proc/sys/fs/inotify/目录,以确定内核是否支持inotify

1.4. inotify 的默认内核参数

  • /proc/sys/fs/inotify/max_queued_events 默认值: 16384 该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值得事件被丢弃,但会触发IN_Q_OVERFLOW事件

  • /proc/sys/fs/inotify/max_user_instances 默认值: 128 指定了每一个real user ID可创建的inotify instatnces的数量上限

  • /proc/sys/fs/inotify/max_user_watches 默认值: 8192 指定了每个inotify instance相关联的watches的上限

注意: max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大 
如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用.

这里需要注意:
/proc/sys/filesystem/inotify/max_user_instances is the maximum number of inotify instances that a given user can instantiate. The default value is 128 instances, per user.

/proc/sys/filesystem/inotify/max_user_watches is the maximum number of watches per instance. The default value is 8,192 watches, per instance.

the kernel isn't storing the pathname, but the inode. Nevertheless it are 540 bytes per Watch on a 32bit system. Double as much on 64bit.

I know from Lsyncd (maybe you want to check that out?) people who have a million watches. It just eats a Gigabyte of memory.


0 0