有个网友找我求助,反映在群辉上有个Docker容器之前用着好好的,但是最近升级了镜像、重启了下就无论如何进不了WebUI了,说实话我也猜不出问题是啥,先连上远程看看再说。
排查原因
首先果断先看一下容器的日志:
docker logs -f nastools
日志上看到应用是正常启动完成的,但是启动以后开始添加定时任务的时候报错了,报错的堆栈比较长,截取最核心的那行:
OSError: [Errno 24] inotify instance limit reached
懵了,我不知道啥原因。但是,我可以问ChatGPT啊!这就问:
这个报错是因为应用创建inotify实例超过了最大限制导致的,而inotify是指 Linux 内核提供的一种机制,用于监视文件系统中的文件和目录的变化。它可以用于监控文件的创建、修改、删除、移动等操作,并及时通知相关的应用程序。
。
问题基本清楚了,那么解决思路也清晰了,但是我却知道怎么调整这个限制,继续问ChatGPT:
ChatGPT给出了四种方案,实际上2和4是一个路子,我们一一来说明下。
解决方法
方法一: 增加系统的 inotify 实例限制,即修改 /proc/sys/fs/inotify/max_user_instances 文件,将值设置大一点
sudo sysctl -w fs.inotify.max_user_instances=<new_limit>
方法二: 增加每个实例可以监视的文件数量,即修改 /proc/sys/fs/inotify/max_user_watches 文件,将值设置大一点
sudo sysctl -w fs.inotify.max_user_watches=<new_limit>
方法三: 减少应用程序使用的 inotify 实例的数量或监视资源的数量。这一点貌似不太适合现在的情况,咱也不是应用的开发者,做不了主。
按照上面提到的错误信息,我们的情况应该使用第一种方法,照着执行命令,将值设置成100000,重启容器,顺利进入WebUI!
关于fs.inotify.max_user_instances和fs.inotify.max_user_watches
在上面的解决方法中提到了这2个设置,有点傻傻分不清,那么笔者就多唠叨一点,简单说说他们的作用和差别吧:
fs.inotify.max_user_watches 和 fs.inotify.max_user_instances 是 Linux 内核中用于控制 inotify 实例和监视的文件数量的参数。
• fs.inotify.max_user_watches 控制每个用户可以监视的文件或目录的数量。当一个进程使用 inotify 监视文件或目录时,会消耗一个监视资源。如果达到了这个限制,进程将无法创建新的监视。默认值通常较低,例如8192。
• fs.inotify.max_user_instances 控制每个用户可以创建的 inotify 实例的数量。每个进程使用 inotify 时,都会创建一个实例。如果达到了这个限制,进程将无法创建新的实例。默认值通常较低,例如128。
简单来说,fs.inotify.max_user_watches 控制的是每个实例可以监视的文件或目录的数量,而 fs.inotify.max_user_instances 控制的是每个用户可以创建的实例的数量。两者都是为了限制系统资源的使用,防止滥用和过度消耗。

文章评论