2014-04-23 24 views
5

Bazı istemcilerle birlikte bir Linode sunucusunda Hazırda Bekletme, İlkbahar, Debian, Tomcat, MySql yığını var. Yaklaşık 30 müşteri için web sayfalarını barındıran bir Spring-Multitenant uygulaması.java.net.SocketException: Çok fazla açık dosya Bahar Hazırda Bekletme Tomcat

uygulamaları Im bu hatayı almaya, bir süre sonra, ince başlar: Bu hata ancak atılır

java.net.SocketException: Too many open files 
at java.net.PlainSocketImpl.socketAccept(Native Method) 
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) 
at java.net.ServerSocket.implAccept(ServerSocket.java:453) 
at java.net.ServerSocket.accept(ServerSocket.java:421) 
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60) 
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216) 
at java.lang.Thread.run(Thread.java:662) 

önce nagios sunucu durağına ping yanıt beni uyarır.

Daha önce, ben bir vekil olarak nginx vardı ve bunun yerine istek başına bu nginx hataları başlamıştı ve yine tomcat'ı yeniden zorundaydı:

<Connector port="80" protocol="HTTP/1.1" 
       maxHttpHeaderSize="8192" 
       maxThreads="500" minSpareThreads="250" 
       enableLookups="false" redirectPort="8443" acceptCount="100" 
       connectionTimeout="20000" disableUploadTimeout="true" 
       acceptorThreadCount="2" /> 
: Bu benim server.xml bağlayıcı yapılandırması

2014/04/21 12:31:28 [error] 2259#0: *2441630 no live upstreams while connecting to upstream, client: 66.249.64.115, server: abril, request: "GET /catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox= HTTP/1.1", upstream: "http://appcluster/catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox=", host: "www.anabocafe.com" 
2014/04/21 12:31:40 [error] 2259#0: *2441641 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 200.74.195.61, server: abril, request: "GET/HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "www.oli-med.com" 

olduğunu

this tutorial kullanarak ulimit'i değiştirmeyi denedim Tomcat çalıştıran kullanıcı için açık dosya tanımlayıcıları için sabit sınırı değiştirebiliyordum, ancak sorunu çözmedi, uygulama hala askıda kalıyor. Aniden büyüyen başlar

lsof -p TOMCAT_PID | wc -l 
632 (more or less!! i did not write the exact number) 

Bu numaralar:

Ben sunucuyu yeniden başlatmak zorunda son kez Ben socked açılan bağlantılar için bu değerleri vardı, yaklaşık 3 saat boyunca koştu.

Diğer sunucularda buna çok benzeyen bazı uygulamalara sahibim, fark Tek Başına bir sürüm olmaları ve bu bir Çok Boyutlu mimaridir. Bu uygulamada bu tür soket bağlantılarını alıyorum. 't diğer tesisler herhangi birinin Bağımsızlık versiyonunda gerçekleştirilir:

java 11506 root 646u IPv6 136862  0t0  TCP lixxx-xxx.members.linode.com:www->180.76.6.16:49545 (ESTABLISHED) 
java 11506 root 647u IPv6 136873  0t0  TCP lixxx-xxx.members.linode.com:www->50.31.164.139:37734 (CLOSE_WAIT) 
java 11506 root 648u IPv6 135889  0t0  TCP lixxx-xxx.members.linode.com:www->ec2-54-247-188-179.eu-west-1.compute.amazonaws.com:28335 (CLOSE_WAIT) 
java 11506 root 649u IPv6 136882  0t0  TCP lixxx-xxx.members.linode.com:www->ec2-54-251-34-67.ap-southeast-1.compute.amazonaws.com:19023 (CLOSE_WAIT) 
java 11506 root 650u IPv6 136884  0t0  TCP lixxx-xxx.members.linode.com:www->crawl-66-249-75-113.googlebot.com:39665 (ESTABLISHED) 
java 11506 root 651u IPv6 136886  0t0  TCP lixxx-xxx.members.linode.com:www->190.97.240.116.viginet.com.ve:1391 (ESTABLISHED) 
java 11506 root 652u IPv6 136887  0t0  TCP lixxx-xxx.members.linode.com:www->ec2-50-112-95-211.us-west-2.compute.amazonaws.com:19345 (ESTABLISHED) 
java 11506 root 653u IPv6 136889  0t0  TCP lixxx-xxx.members.linode.com:www->ec2-54-248-250-232.ap-northeast-1.compute.amazonaws.com:51153 (ESTABLISHED) 
java 11506 root 654u IPv6 136897  0t0  TCP lixxx-xxx.members.linode.com:www->baiduspider-180-76-5-149.crawl.baidu.com:31768 (ESTABLISHED) 
java 11506 root 655u IPv6 136898  0t0  TCP lixxx-xxx.members.linode.com:www->msnbot-157-55-32-60.search.msn.com:35100 (ESTABLISHED) 
java 11506 root 656u IPv6 136900  0t0  TCP lixxx-xxx.members.linode.com:www->50.31.164.139:47511 (ESTABLISHED) 
java 11506 root 657u IPv6 135924  0t0  TCP lixxx-xxx.members.linode.com:www->ec2-184-73-237-85.compute-1.amazonaws.com:28206 (ESTABLISHED) 

Onlar sanırım otomatik bağlantıların çeşit bulunmaktadır.

Yani benim soru:

nasıl sorun benim kod, sunucunun olup olmadığını belirlemek veya saldırı çeşit ve hangi yaklaşım bu anlamaya öneriyoruz edebilir?

Advance teşekkürler :)

+0

maxThreads = "10000" gerçekten iyimser;) – Stefan

+1

jaja! Haklısın, muhtemelen bir testten sonra bir şeyi geri almayı unutmuşsun. Bu konuya işaret ettiğiniz için teşekkür ederiz. – Ernest

+0

MaksThreads = "500" olarak değiştirildi ve gönderi güncellendi. :) – Ernest

cevap

4

Tamam, sorunun jdbc bağlantı ayarları olduğu, maksimum 20 bağlantıya ayarlı olduğu, sınırı 200 olarak değiştirdiğim ve sorunun durduğu görülüyor.

Bunu anladığım yol problemdi appdynamics sayesinde oldu.AppInfraestructurePerformance metriklerinde çok sayıda metriği kontrol etmenizi sağlayan harika bir araç. Ayrıca yardımcı

http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency

oficial belgeleri:

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

Ayrıca beni ayar Uygulamamı yardımcı konuda bu güzel yazıyı buldum.

Gelen bağlantıların, önce sunucu yanıtlama yeteneğini azaltan bir sorgu başlattığını ve daha sonra OS soket sınırlarını doldurduğunu, linux, açık soketin açık dosyalar olduğunu tahmin ediyorum. Umarım bu birisine yardım eder!

DÜZENLEME

Merhaba! Bu çözüm kısa vadede sorunu çözmüş ama JDBC bağlantısı ile ilgili bir başka hata uygulama bağlantılarını kapama değil, ortaya, ben biraz geç bu konuda here

1

tomcat'ı çalıştıran kullanıcı için sizin ulimit kontrol ettiniz mi? Linux, varsayılan olarak 1024 açık dosya sınırına sahiptir. How do I change the number of open files limit in Linux?

üzerinde Daha sen düzgün (yapmanız olası) bazı IO akışları kapama değil yapılandırmasında veya herhangi bir nedenle çok sayıda bağlantı varsa bir olasılık var.

ulimit'u artırarak yaklaşıyor ve daha sonra dosya kullanımını neyin çektiğini görmek için bazı yükleme testlerini çalıştırıyorum.

+0

Merhaba Mite, cevabınız için teşekkür ederim ... Ben ulimit değiştirmek yaptım, ben orijinal yazı, sunucu.xml Bağlayıcı açıklaması sonra yazdım. Onu 65535'e yükselttim. Bu hatayı almadım, ama Tomcat cevap vermeyi kesti ve açılan dosyalar yükseliyordu. Eğer tek başına izin verseydim, ama yeniden başlatmak zorunda olsaydım muhtemelen bu hatayı alırdım. Jmeter ile yük denemelerini denedim, saniyede çok fazla istek koyarsam yavaşlar, ancak neyin neden olduğunu nasıl algılayacağımı bilmiyorum. – Ernest

+0

lsof -p TOMCAT_PID'i çalıştırdığınızda açılan dosyalar, bağlantılar veya başka bir şey nedir? –

+0

Merhaba Mite, çoğunlukla bağlantılar, robotlar ve web tarayıcıları gibi düşünüyorum. Sadece bu olduğunda izleyecek ve -p TOMCAT_PID'in çıktılarını kaydedecek bir betik yaptım, bu yüzden size kesin bir cevap verebilirim. Cevap verdiğiniz için tekrar teşekkür ederim. Yakında daha fazla bilgi ile güncelleyeceğim – Ernest

0

ilgili açılmış ve bir bilet çözüldü, ama belki bir yardım/Bu konuda mücadele eden herkes için ipucu. Aynı garip bir problemimiz vardı ve sonra (bizim tomcat servisimiz her gün yeniden başlatılıyor (açık kolları temizliyor), bu yüzden hata çoğu kez gerçekleşmiyordu).
Ajp protokolüne sahip bir apache proxy kullanıyoruz. Sorun yanlış bir protokol uygulamasıydı. - hayır daha açık dosyayı protokolü = "org.apache.coyote.ajp.AjpNioProtocol"
Bu uygulama bizim için hile yaptı:

<Connector 
     port="8009" 
     protocol="org.apache.coyote.ajp.AjpNioProtocol" 
     connectionTimeout="1800000" 

     acceptorThreadCount="2" 
     maxThreads="400" 
     maxConnections="8192" 
     asyncTimeout="20000" 
     acceptCount="200" 
     minSpareThreads="40" 
     compression="on" 
     compressableMimeType="text/html,text/xml,text/plain" 

     enableLookups="false" 
     URIEncoding="UTF-8" 
     redirectPort="8443" /> 

bu göz önünde bulundurun:
Bizim konektör yapılandırma aşağıdaki artık işler. Daha fazla bilgi burada bulunabilir: https://itellity.wordpress.com/2013/07/12/getting-rid-of-close_waits-in-tomcat-67-with-mod_proxy/
Umarım bu birilerine yardımcı olur. İyi günler!

İlgili konular