【摘要】 Too many open files有四種可能:一 單個進程打開文件句柄數過多,二 操作系統打開的文件句柄數過多,三 systemd對該進程進行了限制,四 inotify達到上限.
領導見了孔乙己,也每每這樣問他,引人發笑。孔乙己自己知道不能和他們談天,便只好向我們新員工說話。有一回對我說道,“你定位過問題么?”我略略點一點頭。他說,“定位過,……我便考你一考。Too many open files,怎樣解決?”我想,考評墊底的人,也配考我么?便回過臉去,不再理會。孔乙己等了許久,很懇切的說道,“不能解決罷?……我教給你,記着!這些方法應該記着。將來做接口人的時候,定位問題要用。”我暗想我和接口人的等級還很遠呢,而且我們領導也從不將問題定位記功;又好笑,又不耐煩,懶懶的答他道,“誰要你教,不是ulimit太小么?”孔乙己顯出極高興的樣子,將兩個指頭的長指甲敲着白板,點頭說,“對呀對呀!……Too many open files有四種可能,你知道么?”我愈不耐煩了,努着嘴走遠。孔乙己卻像是沒有看到,自顧自的在白板上畫了起來。
一 單個進程打開文件句柄數過多
ulimit中的nofile表示單進程可以打開的最大文件句柄數,可以通過ulimit -a查看,子進程默認繼承父進程的限制(注意,是繼承,不是共享,子進程和父進程打開的文件句柄數是單獨算的)。
網上還有一種解讀是nofile表示單用戶可以打開的文件句柄數,因為他們在limit.conf中看到類似於“openstack soft nofile 65536”,便認為是openstack用戶最多可以打開的文件句柄數。該解讀是錯誤的,“openstack soft nofile 65536”表示的含義是當你執行"su - openstack"切換到openstack用戶后,你創建的所有進程最大可以打開的文件句柄數是65536。
要查看一個進程可以打開的文件句柄數,可以通過“cat /proc/<pid>/limits”查看。
要修改ulimit中的nofile,可以通過修改/etc/security/limits.conf文件,在其中加入類似“openstack soft nofile 65536”的語句來進行修改。修改完成后,可以通過“su - openstack”切換用戶,或者重新登錄,來使該配置生效。
要動態修改一個進程的限制,可以使用prlimit命令,具體用法為:“prlimit --pid ${pid} --nofile=102400:102400”。
二 操作系統打開的文件句柄數過多
整個操作系統可以打開的文件句柄數是有限的,受內核參數“fs.file-max”影響。
可以通過執行“echo 100000000 > /proc/sys/fs/file-max”命令來動態修改該值,也可以通過修改"/etc/sysctl.conf"文件來永久修改該值。
三 systemd對該進程進行了限制
該場景僅針對被systemd管理的進程(也就是可以通過systemctl來控制的進程)生效,可以通過修改該進程的service文件(通常在/etc/systemd/system/目錄下),在“[Service]”下面添加“LimitNOFILE=20480000”來實現,修改完成之后需要執行"systemctl daemon-reload"來使該配置生效。
四 inotify達到上限
inotify是linux提供的一種監控機制,可以監控文件系統的變化。該機制受到2個內核參數的影響:“fs.inotify.max_user_instances”和“fs.inotify.max_user_watches”,其中“fs.inotify.max_user_instances”表示每個用戶最多可以創建的inotify instances數量上限,“fs.inotify.max_user_watches”表示么個用戶同時可以添加的watch數目,當出現too many open files問題而上面三種方法都無法解決時,可以嘗試通過修改這2個內核參數來生效。修改方法是修改"/etc/sysctl.conf"文件,並執行"sysctl -p"。
作者:鯤鵬大賽-輔導老師