Limit
Apache 和 java/tomcat 的“打開的文件太多”。如何設置每個程序的限制?
這個問題現在在我的生產 Ubuntu 機器上出現了兩次,它同時執行節點伺服器(小型)和 Spring Boot Java 伺服器(主力)。第一次發生時,我的伺服器停了下來,我發現該文件
/proc/sys/fs/file-max
的值對808286
我來說似乎完全合理,但無論如何我將它增加到2097152
然後不記得我在那之後做了什麼(這是一年前的好消息還是這樣?)但我可能要麼重新啟動伺服器,要麼至少重新啟動我的服務並解決問題。好吧,今天它又回來困擾我了。重新啟動我的 Java 服務暫時解決了這個問題,但我想了解正在發生的事情以避免將來發生這種情況。
/etc/security/limits.conf
文件是安裝我的 Ubuntu 的預設文件,因此只是一個註釋文件,因此無需在此處複製。- Java 服務由使用者執行
tomcat
。- Apache 由
root
. 這會將流量定向到節點或 Spring Boot 服務。我的系統上一些相關命令的結果……
$ ulimit -Sn 1024 $ ulimit -Hn 1048576 $ sudo su tomcat $ ulimit -Sn 1024 $ ulimit -Hn 1048576
附帶問題,為什麼我的硬限制是設置值的一半
/proc/sys/fs/file-max
?但是現在,如果我查看每個程序的限制,我會得到以下資訊……
$ cat /proc/<tomcat_java>/limits Limit Soft Limit Hard Limit Units Max open files 4096 4096 files $ cat /proc/<root_apache>/limits Limit Soft Limit Hard Limit Units Max open files 8192 8192 files $ cat /proc/<my_random_process>/limits Limit Soft Limit Hard Limit Units Max open files 1024 1048576 files
那麼,這裡發生了什麼?我能找到的唯一關注我設置的文件最大值的程序是我自己的。(我上面使用的“隨機”過程是我的 bash shell)。apache 和 java 的這些限制來自哪裡。我當然可以看到上面的 4096 限制(這可能是我的問題),但我不知道如何讓它使用系統設置的限制。
感謝您對此的任何幫助。
您的問題看起來像如何使用 systemd 為服務設置 ulimits?- 打開文件限制需要在 Apache Tomcat 伺服器的啟動腳本中解決。範例:假設 Ubuntu 機器使用 systemd,可以通過編輯啟動腳本文件將 tomcat java 程序的打開文件限制增加到 65000:
/etc/systemd/system/tomcat.service: [Unit] Description=Tomcat Service After=syslog.target network.target [Service] Type=forking User=tomcat Group=tomcat LimitNOFILE = 65000 <--------- .... [Install] WantedBy=multi-user.target
重新載入守護程序並重新啟動tomcat伺服器…
systemctl daemon-reload systemctl restart tomcat
驗證,類似的東西…
pstree -pu |grep tomcat |-java(23638,tomcat)-+-{java}(23645) grep open /proc/23638/limits Max open files 65000 65000 files