My Java jest zepsuty zZbyt wiele otwartych plików, ale błąd lsof pokazuje liczbę prawnej otwartych plików
Caused by: java.io.IOException: Too many open files
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:883)...
Tutaj są kluczowymi linie z /etc/security/limits.conf
. Określają one maksymalnie pliki dla użytkownika przy 500K:
root soft nofile 500000
root hard nofile 500000
* soft nofile 500000
* hard nofile 500000
Pobiegłem lsof
aby policzyć liczbę plików otworzyć - zarówno w skali globalnej, a przez proces JVM. Zbadałem liczniki w /proc/sys/fs
. Wszystko wydaje się w porządku. Mój proces ma tylko 4301 plików otwartych, a limit wynosi 500k:
:~# lsof | wc -l
5526
:~# lsof -uusername | wc -l
4301
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-nr
4736 0 744363
To jest serwer Ubuntu 11.04. Nawet się zrestartowałem, więc jestem pewien, że te parametry są używane.
Nie wiem, czy to istotne, ale proces jest uruchamiany przez upstart skryptu, który rozpoczyna proces używając setuidgid, tak:
exec setuidgid username java $JAVA_OPTS -jar myprogram.jar
Czego mi brakuje?
Spróbuj zaktualizować przestrzeń sterty i zwiększyć ją. Nie wiem, dlaczego te dwie rzeczy byłyby powiązane, ale trafiłem na ten błąd z powodu wielu różnych problemów. – Relic
Interesujące, dzięki. Ale już jest - Xmx5800m :) – hughw
gdzieś w drzewie procesu ustawiasz nowe limity używając ulimit? – Jayan