1. inotify资源占用
inotify是Linux下一种异步文件系统事件监控机制,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。在系统中通过以下三个文件配置了系统inotify资源参数:
| $ ll /proc/sys/fs/inotify |
| -rw-r--r-- 1 root root 0 Jul 2 00:16 max_queued_events |
| -rw-r--r-- 1 root root 0 Jul 1 23:16 max_user_instances |
| -rw-r--r-- 1 root root 0 Jul 2 00:13 max_user_watches |
max_queued_evnets
表示调用inotify_init时分配给inotify instance中可排队的event最大值,超出该值的event将被丢弃并触发IN_Q_OVERFLOW事件。max_user_instances
表示每一个real user ID可创建的inotify instatnces的数量上限。max_user_watches
表示每个inotify instance可监控的最大文件数量,如果监控的文件数目巨大,需要适当增加此值。
| $ sysctl -a | grep inotify |
| fs.inotify.max_queued_events = 16384 |
| fs.inotify.max_user_instances = 1024 |
| fs.inotify.max_user_watches = 8192 |
在每次fsnotify.NewWatcher()
创建监控实例都会申请一个inotify资源,并在watch.Close()
关闭监控实例时释放inotify资源,即参数max_user_instances
定义的资源。若对监控实例资源占用超过该参数,程序会返回如下error信息:
| $ go run fsnotify.go |
| 2021/07/03 22:30:09 too many open files |
| exit status 1 |
为了防止程序未及时释放inotify资源导致资源耗尽,切记要对fsnotify.NewWatcher()
创建的监控实例执行Close()
释放inotify资源