V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SKYNE
V2EX  ›  程序员

求大神解释: inotify 的 max_user_watches 耗尽,导致 No space left on device

  •  
  •   SKYNE ·
    SKYNE0 · 2020-04-24 18:50:14 +08:00 · 2148 次点击
    这是一个创建于 1672 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,查阅了很多资料,没找到具体为什么这个参数会导致 No space left on device 网上的资料多数是磁盘未满,inode 未满,然后调大此参数,参数生效即可解决该问题。 但对这个深层次的原因没有找到相关的资料,可能自己一根筋,总想知道为什么。。。

    第 2 条附言  ·  2020-04-25 16:53:58 +08:00
    第 3 条附言  ·  2020-04-25 17:45:49 +08:00
    使用 strace -v -f 追踪系统调用时发生时的情况:

    [pid 29498] inotify_init1(O_CLOEXEC <unfinished ...>
    [pid 29499] close(3 <unfinished ...>
    [pid 29498] <... inotify_init1 resumed> ) = 4
    [pid 29499] <... close resumed> ) = 0
    [pid 29498] inotify_add_watch(4, "/run/systemd/ask-password", IN_CLOSE_WRITE|IN_MOVED_TO <unfinished ...>
    [pid 29499] open("/lib64/libmount.so.1", O_RDONLY|O_CLOEXEC <unfinished ...>
    [pid 29498] <... inotify_add_watch resumed> ) = -1 ENOSPC (No space left on device)
    [pid 29499] <... open resumed> ) = 3
    [pid 29498] close(3 <unfinished ...>
    [pid 29499] read(3, <unfinished ...>
    [pid 29498] <... close resumed> ) = 0
    [pid 29499] <... read resumed> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\237\0\0\0\0\0\0"..., 832) = 832
    [pid 29498] close(4 <unfinished ...>
    [pid 29499] fstat(3, <unfinished ...>
    [pid 29498] <... close resumed> ) = 0
    [pid 29499] <... fstat resumed> {st_dev=makedev(253, 1), st_ino=8396, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=544, st_size=277808, st_atime=2019/08/09-11:10:18, st_mtime=2019/08/09-11:10:18, st_ctime=2019/10/09-21:11:09.543361534}) = 0
    [pid 29498] writev(2, [{"Error: No space left on device", 30}, {"\n", 1}], 2Error: No space left on device
    <unfinished ...>
    [pid 29499] mmap(NULL, 2370944, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0 <unfinished ...>


    看起来是 inotify_add_watch 函数导致的, 还是没看出来具体什么导致了 No space left on device
    6 条回复    2020-04-25 21:38:28 +08:00
    superhan
        1
    superhan  
       2020-04-24 21:46:45 +08:00 via Android
    研究一下文件系统 应该能提升一波
    SKYNE
        2
    SKYNE  
    OP
       2020-04-25 16:16:00 +08:00
    @superhan 没这个实力
    fakevam
        3
    fakevam  
       2020-04-25 17:09:50 +08:00
    因为内核资源耗尽,统一返回 NOMEM,这个 errno 的语义不限于 MEM,一般是指某种资源

    举个例子,你设置 cgroup,如果没设置 memory 允许的 numa node,直接去设置 cpu 的列表,也会返回这个 errno
    SKYNE
        4
    SKYNE  
    OP
       2020-04-25 17:50:19 +08:00
    @fakevam 没看懂。。。
    fakevam
        5
    fakevam  
       2020-04-25 19:34:07 +08:00
    意思就是说,内核很多报错,不是所有场合都和你理解的那个 errno 的字面意思一样

    NO space left on device 未必是真的 no space left,可能只是某个抽象资源用完了

    no mem 也是一个意思
    SKYNE
        6
    SKYNE  
    OP
       2020-04-25 21:38:28 +08:00
    @fakevam 抽象资源,好像有点明白了,多谢多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5111 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:14 · PVG 09:14 · LAX 17:14 · JFK 20:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.