Too many open files有四種可能:
一 單個進程打開文件句柄數(shù)過多
二 操作系統(tǒng)打開的文件句柄數(shù)過多
三 systemd對該進程進行了限制
四 inotify達到上限.
一 單個進程打開文件句柄數(shù)過多
ulimit中的nofile表示單進程可以打開的最大文件句柄數(shù)熄赡,可以通過ulimit -a查看,子進程默認繼承父進程的限制(注意盐类,是繼承,不是共享呛谜,子進程和父進程打開的文件句柄數(shù)是單獨算的)在跳。
網(wǎng)上還有一種解讀是nofile表示單用戶可以打開的文件句柄數(shù),因為他們在limit.conf中看到類似于“openstack soft nofile 65536”隐岛,便認為是openstack用戶最多可以打開的文件句柄數(shù)猫妙。該解讀是錯誤的,“openstack soft nofile 65536”表示的含義是當你執(zhí)行"su - openstack"切換到openstack用戶后礼仗,你創(chuàng)建的所有進程最大可以打開的文件句柄數(shù)是65536吐咳。
要查看一個進程可以打開的文件句柄數(shù),可以通過“cat /proc/<pid>/limits”查看元践。
要修改ulimit中的nofile韭脊,可以通過修改/etc/security/limits.conf文件,在其中加入類似“openstack soft nofile 65536”的語句來進行修改单旁。修改完成后沪羔,可以通過“su - openstack”切換用戶,或者重新登錄,來使該配置生效蔫饰。
要動態(tài)修改一個進程的限制琅豆,可以使用prlimit命令,具體用法為:“prlimit --pid ${pid} --nofile=102400:102400”篓吁。
二 操作系統(tǒng)打開的文件句柄數(shù)過多
整個操作系統(tǒng)可以打開的文件句柄數(shù)是有限的茫因,受內(nèi)核參數(shù)“fs.file-max”影響。
可以通過執(zhí)行“echo 100000000 > /proc/sys/fs/file-max”命令來動態(tài)修改該值杖剪,也可以通過修改"/etc/sysctl.conf"文件來永久修改該值冻押。
三 systemd對該進程進行了限制
該場景僅針對被systemd管理的進程(也就是可以通過systemctl來控制的進程)生效,可以通過修改該進程的service文件(通常在/etc/systemd/system/目錄下)盛嘿,在“[Service]”下面添加“LimitNOFILE=20480000”來實現(xiàn)洛巢,修改完成之后需要執(zhí)行"systemctl daemon-reload"來使該配置生效。
四 inotify達到上限
inotify是linux提供的一種監(jiān)控機制次兆,可以監(jiān)控文件系統(tǒng)的變化稿茉。該機制受到2個內(nèi)核參數(shù)的影響:“fs.inotify.max_user_instances”和“fs.inotify.max_user_watches”,其中“fs.inotify.max_user_instances”表示每個用戶最多可以創(chuàng)建的inotify instances數(shù)量上限芥炭,“fs.inotify.max_user_watches”表示么個用戶同時可以添加的watch數(shù)目漓库,當出現(xiàn)too many open files問題而上面三種方法都無法解決時,可以嘗試通過修改這2個內(nèi)核參數(shù)來生效蚤认。修改方法是修改"/etc/sysctl.conf"文件米苹,并執(zhí)行"sysctl -p"。