Red Hatã®æ£®è¥ã§ãã
systemctlã³ãã³ãã§ãµã¼ãã¹ãèµ·åããã¨ãäºæããªãã¨ã©ã¼ãåºåããã¾ãããããæä½ã¯æåãã¦ããããdfçã§ãã¡ã¤ã«ã·ã¹ãã ãè¦ã¦ãä½è£ãããã¾ãã ä»åã¯ãã®ç¶æ³ã§ä½ãèµ·ãã¦ããã®ãè¦ã¦ã¿ã¾ãã
# systemctl start httpd.service Error: No space left on device
inotifyã¨ã¯?
linuxã«ã¯inotifyã¨ããæ©è½ãããããã¡ã¤ã«ããã£ã¬ã¯ããªçã¸ã®æä½ãã¤ãã³ãã¨ãã¦åå¾ãããã¨ãã§ãã¾ãã inotifyã§ã¯ã¢ããªã±ã¼ã·ã§ã³ããã¡ã¤ã«ã¨ãã¦ãinotify instanceããç¨æããinotify instanceã«ã¤ãã³ãã«å¯¾å¿ãããinotify watchããè¤æ°ç»é²ãã¾ãã inotify watchãã¤ãã³ããæ¤åºãããã¨ã«ãinotify instanceã®ãã¥ã¼ã«ã¤ãã³ãã追è¨ãã¦ããã¾ãã ã¢ããªã±ã¼ã·ã§ã³ãinotify instanceããèªã¿è¾¼ã¿ãè¡ãã¨ãã¤ãã³ãã®ç¨®é¡ããã¡ã¤ã«åãªã©ãåå¾ã§ããä»çµã¿ã§ãã

inotifyã¯linuxç¹æã®ä»çµã¿(ç¾å¨ã®UNIXç³»OSã¯ããããåæ§ã®ç®çã®ä»çµã¿ãæã£ã¦ãã¾ããæ¨æºåã¯ããã¦ãã¾ãã)ã§ãããsystemctlãå«ã夿°ã®ã½ããã¦ã§ã¢ã§ããä¸è¬çã«å©ç¨ããã¦ãã¾ãã
ä»åã®ç¾è±¡ã®åå
ä¸é¨ã®ã¢ããªã±ã¼ã·ã§ã³ã¯é常ã«å¤ãã®inotify watchãå©ç¨ãããããã·ã¹ãã å ¨ä½ã®å©ç¨ä¸éã«è§¦ããå ´åãããã¾ããä»ååé¡ãçºçããã®ã¯ãã®ã±ã¼ã¹ã§ããã inotify ã¯kernelå é¨ã§ãã¡ã¤ã«ã·ã¹ãã ã®æ çµã¿ãå©ç¨ãã¦ãããããã¨ã©ã¼æã«ã¯ "No space left on device"(ENOSPC) ã®ãããªãã¡ã¤ã«ã·ã¹ãã ã«é¢é£ããã¨ã©ã¼ãè¿ãå ´åãããã¾ãã
linux/fs/notify/inotify/inotify_user.c ãã
static int inotify_new_watch(struct fsnotify_group *group, struct inode *inode, u32 arg) { (ä¸ç¥) ret = inotify_add_to_idr(idr, idr_lock, tmp_i_mark); # æ°ããinotify watchã追å ãã if (ret) goto out_err; /* increment the number of watches the user has */ if (!inc_inotify_watches(group->inotify_data.ucounts)) { # inotify watchã®ã«ã¦ã³ã¿ãå¢ãã inotify_remove_from_idr(group, tmp_i_mark); ret = -ENOSPC; # 失æããã¨ENOSPC goto out_err; } (以ä¸ç¥)
inotifyã®ä¸éè¨å®
ãinotify instanceãã¨ãwatchãã®ã©ã¡ãã«ãã·ã¹ãã å ¨ä½ã¨ã¦ã¼ã¶æ¯ã®ä¸éããããsysctlã§è¨å®ã»èªã¿åºãã§ãã¾ããinotify watch ã®ä¸éæ°ã¯ã·ã¹ãã ã®æè¼ã¡ã¢ãªããèªåçã«è¨ç®ããã¾ãã
ä¾:
$ sudo sysctl -a |grep inotify fs.inotify.max_queued_events = 16384 fs.inotify.max_user_instances = 128 fs.inotify.max_user_watches = 28587 user.max_inotify_instances = 128 user.max_inotify_watches = 28587
ããããã¯ä»¥ä¸ã®ãããªæå³ã§ãã
| é ç® | æå³ |
|---|---|
| fs.inotify.max_queued_events | 1ã¤ã®inotify instanceã§ä¿æããã¤ãã³ãæ°ã®ä¸é |
| fs.inotify.max_user_instances | (ã·ã¹ãã å ¨ä½ã§ã®) inotify instanceæ°ã®ä¸é |
| fs.inotify.max_user_watches | (ã·ã¹ãã å ¨ä½ã§ã®) inotify watchæ°ã®ä¸é |
| user.max_inotify_instances | (1 UIDãããã®) inotify instanceæ°ã®ä¸é |
| user.max_inotify_watches | (1 UIDãããã®) inotify watchæ°ã®ä¸é |
inotifyã®å©ç¨ç¶æ³
inotify ãå©ç¨ãã¦ããããã°ã©ã ã«ã¯å¯¾å¿ãããã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ããããlsofã§è¦ã¤ãããã¾ãã
ä¾: inotify instanceã«å¯¾å¿ãããã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ãã¿ã¤ãã
# lsof -p 1|grep inotify systemd 1 root 6r a_inode 0,14 0 10890 inotify systemd 1 root 11r a_inode 0,14 0 10890 inotify systemd 1 root 13r a_inode 0,14 0 10890 inotify systemd 1 root 20r a_inode 0,14 0 10890 inotify systemd 1 root 21r a_inode 0,14 0 10890 inotify systemd 1 root 22r a_inode 0,14 0 10890 inotify
inotify watchã®å©ç¨ç¶æ³ãè¦ãã«ã¯ã /proc/PID/fdinfo/FD 以ä¸ãè¦ã¾ãã inotify instanceã«å¯¾å¿ãããã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã®/proc/PID/fdinfo/FD ã«ã¯ã"inotify"ã§åã¾ãè¡ãå«ã¾ãã¦ãã¦ãinotify watchã®æ å ±ãå«ã¾ãã¦ãã¾ãã
ä¾: inotify instanceã«å¯¾å¿ããfdinfoã«ã¯å¯¾å¿ããinotify watchã®æ å ±ãå«ã¾ãã
# cat /proc/1/fdinfo/6 pos: 0 flags: 02004000 mnt_id: 15 ino: 10890 inotify wd:38c ino:850 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:5008000000000000 inotify wd:38b ino:838 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:3808000000000000 inotify wd:38a ino:bd1 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:d10b000000000000 inotify wd:389 ino:bb9 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:b90b000000000000 inotify wd:388 ino:d9f sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:9f0d000000000000 inotify wd:387 ino:d87 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:870d000000000000 (以ä¸ç¥)
å
¨ããã»ã¹ããåç
§ããã¦ããinotify watchã確èªããã«ã¯ cat /proc/*/fdinfo/*|grep inotify|sort|uniq|wc -l ã®ããã«ãã¾ãã
å®è¡ä¸ã«ããã¡ã¤ã«ã®open/closeãããã»ã¹ã®ä½æã»çµäºãªã©ãè¡ããã¦ãã¾ãã®ã§å¤å°ã¨ã©ã¼ãã§ã¾ããããã¾ããª
ç¾å¨ã®å©ç¨æ°ãåå¾ã§ãã¾ãã
# cat /proc/*/fdinfo/*|grep inotify|sort|uniq|wc -l cat: /proc/39155/fdinfo/255: No such file or directory (ä¸ç¥) cat: /proc/thread-self/fdinfo/3: No such file or directory 369
ãã®ä¾ã¯æå°é+GUIç°å¢ã®RHEL 9ç°å¢ã§åå¾ããã®ã§369ä»¶ã¨å°ãªãã§ããã åé¡ãçºçãããããªå ´åã¯å ã« fs.inotify.max_user_watches ã§ç¢ºèªããæ°ã«è¿ãå©ç¨æ°ã確èªã§ãã¾ãã
å©ç¨ä»¶æ°ãå¤ãå ´åã以ä¸ã®ãããªã³ãã³ãã§inotify watchã®å©ç¨æ°ãå¤ãããã»ã¹ãæ¾ãè¾¼ãã¾ãã
# grep inotify /proc/*/fdinfo/*| cut -d/ -f3|uniq -c|sort -n
(ä¸ç¥)
104 4880
138 3972
1888 216722
3875 988006
8362 4804
25398 4294 # PID 4294ã25398ä»¶(éè¤è¾¼ã¿)ã®inotify watchãå©ç¨
対ç
inotify watchãä¸è¶³ããå ´åãåç´ã« fs.inotify.max_user_watches ã®å¤ã大ãããããã¨ã§å¯¾å¿ãã¾ãã è¨å®å¤æ´èªä½ã§ã¡ã¢ãªæ¶è²»çãå¢ãããã¨ã¯ãªããå®éã«inotify watchãå©ç¨ãããå ´åã«ã ãæ¶è²»ããã¾ãã