遇到一問題,tomcat最近發生幾次異常,查看日志,發現一直報 too many open files,熟悉的同學都知道這是用戶打開文件數過多導致的,
再用命令ls /proc/20861/fd/ | wc -l 查看當前tomcat進程打開文件數,果然已經4095個,這種問題解決辦法就是增大文件打開數即可,簡單的很。
但如果能這么容易的解決了,我也就不用再寫這篇博客了。因為我查了下當前用戶所能打開的文件數發現最大能打開的文件數是65535,遠遠大於4096。

而/etc/security/limits.conf里也都設置的是65535

可為什么當前用戶能打開65535個文件,而進程打開4095個文件后就超出限制了呢,就開始報 too many open files錯誤信息了呢。
一查看進程詳細信息發現,原來該進程最大只能打開4096個文件。

百度了造成此問題的原因,只發現一條有用的信息,那就是說/etc/security/limits.conf限制實際取決於 /etc/security/limits.d/20-nproc.conf的配置,也就是說哪怕/etc/security/limits.conf設置最大打開數是65535,而/etc/security/limits.d/20-nproc.conf里配的是4096,那最終結果還是用戶最大只能打開4096個文件句柄,於是趕緊看了下/etc/security/limits.d/20-nproc.conf配置,果然是4096,於是趕緊改成65535,然后重啟應用,滿懷欣喜的看下進程限制,結果還是4096,吐血中。。。

后又思索了很久,查了很久的百度,依然沒有頭緒,只好寫了個腳本監控日志,發現too many open files信息后就重啟tomcat(我們冗余的,session也做了共享,重啟不影響業務的)。
第二天過來再解決這個問題時,冥冥之中感覺是systemctl腳本問題,但仔仔細細看了腳本並沒有什么問題,於是就瞎貓碰上死耗子的心態去看看其他systemctl腳本怎么寫,結果這一看,不得了啊,居然把問題給解決了。
當前是看的是docker啟動腳本,docker是yum安裝的,那腳本里有如下這么倆句話,憑我老到經驗一下就看出這是限制進程打開數的。
LimitNOFILE=1048576
LimitNPROC=1048576
我把這倆句加到tomcat啟動腳本里,再重啟應用,看進程限制,發現最大打開文件數果然改成功了。
寫這篇博客,是希望幫助那些也遇到這個問題的人,免得像我一樣百思不得其解,耽誤時間。

