最大文件打開數的正確修改姿式

前幾天查看heka日誌的錯誤日誌的時候,發現報錯信息 too many open files,很明顯打開文件數過多了。shell

第一個問題來了,如何查看當前進程打開的文件數和最大打開文件數呢?日誌

當前進程打開文件數 code

ls /proc/[pid]/fd|wc -l進程

當前進程最大打開文件數
cat /proc/[pid]/limits|grep openit

能夠看到以下所示的輸出:io

Max open files            1024                 4096                 files

當前系統最大打開文件數
ulimit -n配置

第二個問題是我該如何修改進程的最大文件打開數呢?
找到最大文件打開數的設置方法,這個問題也就解決了,一般有下面幾種修改方式:
1)ulimit -n 102400 直接使用ulimit命令修改,但這個只會對當前會話生效,終端關閉後,設置丟失。
2)/etc/security/limitd.conf 文件中增長limits的配置,通常以下:file

*               soft   nofile       102400

配置的具體含義,你們自行搜索。/etc/security/limitd.conf 在每個會話建立時都會加載,因此修改這裏是一個使配置長期生效的方法。
3)修改shell的啓動項,將ulimit -n 102400放進去,每次建立會話時也會加載。通常是/etc/profile文件,或者/etc/profile.d/limits.sh中。搜索

到此爲止,配置好了,你經過 ulimit -n 查看系統的最大文件打開數已經生效了。但此時查看進程的最大文件打開數沒有變,緣由是這個值是在進程啓動的時候設定的,要生效必須重啓!supervisor

ok,那就重啓吧,重啓完畢,結果發現依然沒變!這奇了怪了,後來通過很久的排查,最終確認問題是,該程序是經過 supervisord來管理的,也就是這進程都是 supervisord 的子進程,而 supervisord 的最大文件打開數仍是老的配置,此時必須重啓 supervisord 才能夠。後來在saltstack上也遇到了一樣的問題,必須把全部的 salt-minion 重啓。

當你們遇到limits修改不生效的時候,請查一下進程是否只是子進程,若是是,那就要把父進程也一併重啓才能夠。

相關文章
相關標籤/搜索