首页 > 代码库 > Inotify数达到限制或文件空间不足的不同表现同一本质原因分析

Inotify数达到限制或文件空间不足的不同表现同一本质原因分析

操作系统环境:

LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch

Distributor ID: RedHatEnterpriseServer

Description:    Red Hat Enterprise Linux Server release 6.4(Santiago)

Release:       6.4

Codename:       Santiago

问题表现:

第一个问题:

     在此机器上部署了多个同样的应用程序。此应用程序使用java7提供的WatchService功能。同事在日志中发现下列日志内容:

30 六月 2014 16:26:48,881 ERRORWorker-2  AdvancedWatchService:register - User limit of inotify watchesreached
java.io.IOException: User limit ofinotify watches reached
       at sun.nio.fs.LinuxWatchService$Poller.implRegister(LinuxWatchService.java:261)
       at sun.nio.fs.AbstractPoller.processRequests(AbstractPoller.java:260)
       at sun.nio.fs.LinuxWatchService$Poller.run(LinuxWatchService.java:326)
       at java.lang.Thread.run(Thread.java:722)

    同事分析找到的原因为:cat/proc/sys/fs/inotify/max_user_watches参数值限制引发的问题。需要增加此参数值。

第二个问题:

另在同一台机器同一个用户执行tail  –f <文件名>实时查看某日志文件时,出现了下列错误提示:

tail:无法监视"01000211.log":设备上没有空间

    我通过命令“strace -fTittt  tail -f  01000302.log >$HOME/strace2.log 2>&1”  重现跟踪问题。

    在日志中找到下列重要信息:

1404867279.958627 [      37eaae8fa7] inotify_add_watch(4,"01000302.log", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = -1ENOSPC (No space left on device) <0.000042>

    从日志来看,tail监测文件变化并刷新数据时使用到inotify_add_watch。在tail命令指定了参数f时,游注册了文件变化监测请求。在监测请求注册失败时就出现所看到空间不足的现象。

小结

    上面两个问题有不同的表现,但问题实质是同一种。在我们找到问题的root cause前,需要我们采用有效的手段是跟踪分析找到根本原因。我们技术人员的知识结构也要及时更新与完善。有不断更新的知识结构,也有合适的问题跟踪与分析方法,才有利于我们快速找到问题并解决问题。

本文出自 “隐林之路” 博客,请务必保留此出处http://wxinhe.blog.51cto.com/6924993/1436437