2012-12-21 19 views
14

Ich arbeite an einem Debian-Server mit Tomcat 7 und Java 1.7. Dies ist eine Anwendung, die mehrere TCP-Verbindungen erhält, jede TCP-Verbindung ist eine offene Datei durch den Java-Prozess.Zu viele offene Dateien (ulimit bereits geändert)

Mit Blick auf /proc/pid of java/fd fand ich, dass manchmal die Anzahl der geöffneten Dateien 1024 überschreitet, wenn dies geschieht, finde ich in catalina.out log die stacktrace _SocketException: Too many open files_

Alles, was ich über diesen Fehler finden, die Menschen auf die ulimit beziehen, Ich habe dieses Ding bereits geändert und der Fehler passiert weiter. Hier ist die config:

bei /etc/security/limits.conf

root soft nofile 8192 
root hard nofile 8192 

bei /etc/sysctl.conf

fs.file-max = 300000 

die ulimit -a Befehl gibt:

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 16382 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 8192 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) unlimited 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

Aber, wenn ich die Grenzen des Java-Prozess überprüfen Es ist nur 1024

bei /proc/pid of java/limits

Limit      Soft Limit   Hard Limit   Units  
Max cpu time    unlimited   unlimited   seconds 
Max file size    unlimited   unlimited   bytes  
Max data size    unlimited   unlimited   bytes  
Max stack size   8388608    unlimited   bytes  
Max core file size  0     unlimited   bytes  
Max resident set   unlimited   unlimited   bytes  
Max processes    32339    32339    processes 
Max open files   1024     1024     files  
Max locked memory   65536    65536    bytes  
Max address space   unlimited   unlimited   bytes  
Max file locks   unlimited   unlimited   locks  
Max pending signals  32339    32339    signals 
Max msgqueue size   819200    819200    bytes  
Max nice priority   0     0      
Max realtime priority  0     0      
Max realtime timeout  unlimited   unlimited   us   

Wie kann ich die Anzahl der Max open files für den Java-Prozess zu erhöhen?

+0

Nur um das Offensichtliche auszuschließen, läuft tomcat als root? – Brett

Antwort

19

Ich lege einfach die Zeile ulimit -n 8192 in die catalina.sh, also, wenn ich die catalina start mache, läuft Java mit der angegebenen Grenze oben.

+4

Möglicherweise müssen Sie eine Zeile in '/ etc/security/limits.conf' hinzufügen, bevor Sie das ulimit auf diese Weise erhöhen können. –

+0

Ich denke, wir sollten vermeiden, Catalina dafür zu modifizieren. Wenn Sie Catalina upgraden, können Sie diese Änderung in der neuen Version vergessen. – mcoolive

+0

Soweit ich verstanden habe, wird die Datei limits.conf von PAM bei der Anmeldung angewendet.Wenn Sie Tomcat über Ihr init-System starten, ist es möglich, dass die PAM- "limit" -Konfiguration nicht gesetzt ist und Sie auf den Standardwert von 1024 zurückgreifen. Sie müssen in Ihrem init-Systemhandbuch nachlesen, wie Sie dieses Limit setzen. Oder benutze den Trick in der Antwort hier. – Huygens

10

Die ulimit-Werte werden zum Startzeitpunkt der Sitzung zugewiesen, daher hat die Änderung von /etc/security/limits.conf keine Auswirkungen auf Prozesse, die bereits ausgeführt werden. Nicht-Login-Prozesse erben die ulimit-Werte von ihren Eltern, ähnlich wie die Vererbung von Umgebungsvariablen.

Nachdem Sie /etc/security/limits.conf geändert haben, müssen Sie sich bei & anmelden (damit Ihre Sitzung über die neuen Grenzwerte verfügt) und dann die Anwendung neu starten. Nur dann kann Ihre Anwendung die neuen Grenzwerte verwenden.

1

Die Einstellung von höherem ulimit ist möglicherweise völlig unnötig, abhängig von der Arbeitslast/dem Verkehr, den der Tomcat/httpd verarbeitet. Linux erstellt einen Dateideskriptor pro Socket-Verbindung. Wenn Tomcat so konfiguriert ist, dass das Protokoll "mod_jk/ajp" als Konnektor verwendet wird, möchten Sie möglicherweise sehen, ob die maximal zulässige Verbindung zu hoch ist oder ob connectionTimeout oder keepAliveTimeout zu hoch ist. Diese Parameter spielen eine große Rolle beim Verbrauch von OS-Dateideskriptoren. Manchmal ist es auch möglich, die Anzahl der Apache httpd/nginx-Verbindung zu begrenzen, wenn Tomcat von einem Reverse-Proxy konfrontiert wird. Ich habe einmal ServerLimit Wert in httpd reduziert, um eingehende Anfragen während Gaterush-Szenario zu drosseln. Alles in allem Anpassung Ulimit möglicherweise keine praktikable Option, da Ihr System am Ende verbraucht, wie viele Sie auch werfen. Sie müssen einen ganzheitlichen Plan entwickeln, um dieses Problem zu lösen.

+0

Hallo, tut mir leid, aber ich konnte keine anderen nützlichen Informationen darüber finden. Was meinst du mit Linux erstellt einen Dateideskriptor pro Socket-Verbindung? Bedeutet dies, dass die "zu vielen offenen Dateien" auf zu viele eingehende Verbindungen auf einmal zurückzuführen sein könnten? Und wo ist das mod_jk/ajp-Protokoll als Connector konfiguriert? – ocramot

Verwandte Themen