Limit

Apache 和 java/tomcat 的“打開的文件太多”。如何設置每個程序的限制?

  • March 16, 2021

這個問題現在在我的生產 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

引用自:https://unix.stackexchange.com/questions/604664