2011-06-12 13 views
9

çok fazla açık dosya. Sadece günlüklerinde fark, bir dağıtmaya yapıyor ve biraz için spam iken o, iskelesi başladıktan sonra sadece birkaç dakika:İskele IOException: Ben önünde nginx ile, yaklaşık 100 istekleri/sn yapan bir web sitesinde Jetty çalıştırıyorum

java.io.IOException: Too many open files 
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:163) 
    at org.mortbay.jetty.nio.SelectChannelConnector$1.acceptChannel(SelectChannelConnector.java:75) 
    at org.mortbay.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:673) 
    at org.mortbay.io.nio.SelectorManager.doSelect(SelectorManager.java:192) 
    at org.mortbay.jetty.nio.SelectChannelConnector.accept(SelectChannelConnector.java:124) 
    at org.mortbay.jetty.AbstractConnector$Acceptor.run(AbstractConnector.java:708) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

bir iki dakika için. Bir "lsof -u iskelesi" yaptı ve hatları yüzlerce gördük: 192.168.1.100 sunucularının iç IP olan

java 15892 jetty 1020u IPv6   298105434  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60839 (ESTABLISHED) 
java 15892 jetty 1021u IPv6   298105438  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60841 (ESTABLISHED) 
java 15892 jetty 1022u IPv6   298105441  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60842 (ESTABLISHED) 
java 15892 jetty 1023u IPv6   298105443  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60843 (ESTABLISHED) 

. Gördüğünüz gibi

, bu sadece bu artabileceğini 1024 varsayılan maksimum açık dosya sayısını getirdi ama bu ilk etapta bunun neden merak ediyorum? Jetty'nin nio soket alıcısında, bu yüzden bağlantı isteklerinin bir fırtınadan kaynaklanıyor mu? İskelesi'ne bir hata olsa da

+1

Her yuva yüzden her bağlantısı bekleyen olsa bile bir dosya (açıklayıcısı) vardır, bir dosyadır. Bir istek tipik olarak ne yapar ve ne kadar sürer? İskelede 100 istek/saniye ile, 2 s/istek alarak yerel bir db sunucusunu sorgulamak zaten 400 "dosyalarınız var". – extraneon

+0

İsteklerimin çoğu sadece birkaç ms sürüyor, ancak uygulama ilk başladığında birkaç saniye sürebilir, sanırım orada ne olduğunu düşünüyorum. Çöp toplayıcısı da bazen "dünyayı durdur" duraksamasını yapar, bu da tüm taleplerin kısa bir süre için yığılmasına neden olur ve bu da aralıklı olarak ortaya çıkar. GC'yi daha sonra ayarlamak zorunda kalacağım, bu arada limiti arttırdım. –

+1

Zaman zaman Tomcat6'da benzer bir şey alıyorum, başlangıçta oyuncaklarını fırlayan işletim sistemi olduğunu düşündüm. Ayrıca sınırını geçici bir çözüm olarak artırdım. –

cevap

11

, ben çok daha muhtemel açıklama açık dosya ulimits çok düşük olduğunu düşünüyorum. Genellikle 1024 varsayılanı, ılımlı kullanımı olan web sunucuları için yeterli değildir.

Bunu test etmek için iyi bir yoldur görüyorsanız gelen trafik simülasyonu için apache tezgah kullanmaktır. Bunu bir uzak ana bilgisayarda çalıştırmak, her 10 eşzamanlı bağlantıdan 1000 istek üretecektir. Şimdi

ab -c 10 -n 1000 [http://]hostname[:port]/path 

netstat kullanarak web sunucusu üzerinde yuvalarına saymak ...

netstat -a | grep -c 192.168.1.100 

Umarım bulacaksınız ne prizler dramatik (1024 daha büyük madeni olmayan bazı değerde plato olmasıdır 16384'te).

sağlamak için başka iyi bir şey bağlantıları iş mantığı düzgün kapatılıyor olmasıdır. Eğer bu sayı uygulamanızın ömrü boyunca büyümeye devam görürseniz

netstat -a | grep -c CLOSE_WAIT 

, sen Connection.close için birkaç görüşme eksik olabilir().

+0

Ayrıca, Full GC'lerin gerçekten çok fazla zaman harcadığı anlaşılıyorsa, java'nın ConcurrentMarkSweep toplayıcısına bir göz atın. – jpredham