2012-01-25 22 views
16

Benim Java programıÇok fazla dosya açık hata ama lsof

Caused by: java.io.IOException: Too many open files 
     at java.io.UnixFileSystem.createFileExclusively(Native Method) 
     at java.io.File.createNewFile(File.java:883)... 
İşte

/etc/security/limits.conf anahtar çizgilerdir ile başarısız oluyor açık dosyaların bir yasal sayısını gösterir. Onlar 500k bir kullanıcı için maksimum dosya ayarlayın: Açıyorum dosya sayısını saymak için lsof koştu

root      soft nofile   500000 
root      hard nofile   500000 
*      soft nofile   500000 
*      hard nofile   500000 

- gerek küresel gerekse jvm işlemi ile. Sayaçları /proc/sys/fs'da inceledim. Her şey yolunda görünüyor. Benim süreç yalnızca açık 4301 dosyaları vardır ve sınır 500k geçerli:

:~# 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 

Bu Bir Ubuntu 11.04 sunucusudur. Yeniden başlattım, bu yüzden bu parametreler kullanılmakta pozitifim.

alakalı, ama süreç böyle, setuidgid kullanarak işlemi başlatır bir sonradan görme komut tarafından başlatılıp başlatılmadığını bilmiyorum:

exec setuidgid username java $JAVA_OPTS -jar myprogram.jar 

ben eksik?

+0

Yığın alanınızı güncelleştirmeyi ve daha büyük bir maks. İkisinin neden ilişkili olabileceğinden emin değilim, ancak bu hatayı, sayısız farklı konu için çarptı. – Relic

+0

İlginç, teşekkürler. Ama zaten -Xmx5800m :) – hughw

+0

Bazı süreç ağacında ulimit kullanarak yeni sınırlar ayarlar mısınız? – Jayan

cevap

16

Sorun benim program bir sonradan görme başlatma betiği olarak çalışan olduğunu ve exec dörtlük değil olmasıydı çıkıyor bir kabuk çağırmak. ulimit ve limits.conf içindeki ayarlar yalnızca bir kabuktaki kullanıcı işlemlerine uygulanır.

kullandığımda ben varsayılan kabuk içinde java çalışır

exec sudo -u username java $JAVA_OPTS -jar program.jar 

exec dörtlük değiştirerek bu doğrulanmadı. Bu programın ihtiyaç duyduğu kadar açık dosya kullanmasına izin verdi. Komutunu çağırmadan önce ulimit -n numaralı telefonu da arayabilmeniz için I have seen it mentioned; Bir upstart betiği için bunun yerine bir script stanza kullanacağını düşünüyorum.

Açık dosya tanımlayıcısının kesin bir sayımını elde etmek için'dan daha iyi bir tanılama ls /proc/{pid}/fd | wc -l olmalıdır. Hataların 4096 açık fds'de gerçekleştiğini görebiliyorum. 4096'nın nereden geldiğini bilmiyorum; herhangi bir yerde/etc değil; Sanırım çekirdeğe derlenmiş.

4

Bir sunucu oluşturma komut dosyası üstündeki Bash bu pasajı vardır:

# Jack up the max number of open file descriptors at the kernel 
echo "fs.file-max = 1000000" >> /etc/sysctl.conf 
invoke-rc.d procps start 

# Increase max open file descriptors for this process 
ulimit -n 1000000 

# And for future ones as well 
cat >> /etc/profile <<LIMITS 
ulimit -n 1000000 
LIMITS 
cat >> /etc/security/limits.conf <<LIMITS 
root - nofile 1000000 
LIMITS 
İlgili konular