Apache Tomcat 300 कनेक्शन के बाद चोक हो गया


16

हमारे पास EC2 पर होस्ट किए गए Tomcat के सामने एक अपाचे वेबसर्वर है, उदाहरण का प्रकार 34GB मेमोरी के साथ अतिरिक्त बड़ा है।

हमारा आवेदन बहुत सारे बाहरी वेबसर्विस के साथ काम करता है और हमारे पास एक बहुत ही घटिया बाहरी वेबबेस है, जो पीक ऑवर्स के दौरान अनुरोधों का जवाब देने में लगभग 300 सेकंड का समय लेता है।

पीक आवर्स के दौरान सर्वर लगभग 300 httpd प्रक्रियाओं को चोक कर देता है। ps -ef | grep httpd | wc -l = 300

मैंने कई सुझाव दिए हैं और पाया है लेकिन काम करने के लिए कुछ भी नहीं लगता है .. निम्नलिखित कुछ कॉन्फ़िगरेशन मैंने किए हैं जो सीधे ऑनलाइन संसाधनों से लिए गए हैं।

मैंने अपाचे और टॉमकैट दोनों में अधिकतम कनेक्शन और अधिकतम ग्राहकों की सीमा बढ़ा दी है। यहाँ विन्यास विवरण हैं:

//अमरीका की एक मूल जनजाति

   <IfModule prefork.c>
    StartServers 100
    MinSpareServers 10
    MaxSpareServers 10
    ServerLimit 50000
    MaxClients 50000
    MaxRequestsPerChild 2000
    </IfModule>

// बिल्ला

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="600000"
           redirectPort="8443"
           enableLookups="false" maxThreads="1500"
           compressableMimeType="text/html,text/xml,text/plain,text/css,application/x-javascript,text/vnd.wap.wml,text/vnd.wap.wmlscript,application/xhtml+xml,application/xml-dtd,application/xslt+xml"
           compression="on"/>

//Sysctl.conf

 net.ipv4.tcp_tw_reuse=1
 net.ipv4.tcp_tw_recycle=1
 fs.file-max = 5049800
 vm.min_free_kbytes = 204800
 vm.page-cluster = 20
 vm.swappiness = 90
 net.ipv4.tcp_rfc1337=1
 net.ipv4.tcp_max_orphans = 65536
 net.ipv4.ip_local_port_range = 5000 65000
 net.core.somaxconn = 1024

मैं कई सुझावों की कोशिश कर रहा हूं लेकिन व्यर्थ है .. इसे कैसे ठीक करें? मुझे यकीन है कि m2xlarge सर्वर को 300 से अधिक अनुरोधों की सेवा करनी चाहिए, शायद मैं अपने कॉन्फ़िगरेशन के साथ गलत हो सकता हूं।

सर्वर केवल पीक ऑवर्स के दौरान चोक करता है और जब 300 समवर्ती अनुरोधों के लिए प्रतीक्षा कर रहा होता है [300 सेकंड की देरी] webservice को जवाब देने के लिए।

मैं बस netstat के साथ tcp कनेक्शन की निगरानी कर रहा था

मुझे TIME_WAIT राज्य में लगभग 1000 कनेक्शन मिले, प्रदर्शन के संदर्भ में इसका कोई मतलब नहीं होगा, मुझे यकीन है कि इसे समस्या में जोड़ना होगा।

टीओपी का उत्पादन

 8902  root      25   0 19.6g 3.0g  12m S  3.3  8.8  13:35.77 java
 24907 membase   25   0  753m 634m 2528 S  2.7  1.8 285:18.88 beam.smp
 24999 membase   15   0  266m 121m 3160 S  0.7  0.3  51:30.37 memcached
 27578 apache    15   0  230m 6300 1536 S  0.7  0.0   0:00.03 httpd
 28551 root      15   0 11124 1492  892 R  0.3  0.0   0:00.25 top


 Output of free -m
 total       used       free     shared    buffers    cached
 35007       8470       26536    0          1         61
 8407        26599
 15999       15         15984

 output of iostat
 avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      26.21    0.00    0.48    0.13    0.02   73.15

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda1             14.36         4.77       329.37    9005402  622367592
sdb               0.00         0.00         0.00       1210         48

पीक समय में भी लगभग 10-15k tcp कनेक्शन मेम्बेस सर्वर [स्थानीय] में होते हैं

MODJK लॉग में कुछ त्रुटि, मुझे उम्मीद है कि इस मुद्दे पर कुछ प्रकाश फेंकता है ..

[Wed Jul 11 14:39:10.853 2012] [8365:46912560456400] [error]         ajp_send_request::jk_ajp_common.c (1630): (tom2) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=110)
[Wed Jul 11 14:39:18.627 2012] [8322:46912560456400] [error] ajp_send_request::jk_ajp_common.c (1630): (tom2) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=110)
[Wed Jul 11 14:39:21.358 2012] [8351:46912560456400] [error] ajp_get_reply::jk_ajp_common.c (2118): (tom1) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Wed Jul 11 14:39:22.640 2012] [8348:46912560456400] [error] ajp_get_reply::jk_ajp_common.c (2118): (tom1) Tomcat is down or refused connection. No response has been sent to the client (yet)

~

Worker.properties
workers.tomcat_home=/usr/local/tomcat/
worker.list=loadbalancer
worker.tom1.port=8009
worker.tom1.host=localhost
worker.tom1.type=ajp13
worker.tom1.socket_keepalive=True
worker.tom1.connection_pool_timeout=600
worker.tom2.port=8109
worker.tom2.host=localhost
worker.tom2.type=ajp13
worker.tom2.socket_keepalive=True
worker.tom2.connection_pool_timeout=600
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tom1,tom2
worker.loadbalancer.sticky_session=True
worker.tom1.lbfactor=1
worker.tom1.socket_timeout=600
worker.tom2.lbfactor=1
worker.tom2.socket_timeout=600

//हल किया

आपके सभी बहुमूल्य सुझावों के लिए धन्यवाद .. मैं AJP 1.3 कनेक्टर के लिए अधिकतम सेटिंग्स से चूक गया .. अब सब कुछ नियंत्रण में है।

मैं भी nginx की तरह यहां तक ​​कि सर्वरों को देखना शुरू करूंगा।


आपकी मुख्य सेटिंग्स क्या हैं?
टॉम ओ'कॉनर

पेज लोड करने का प्रयास करते समय क्लाइंट को किस प्रकार की त्रुटि होती है?
शेन मैडेन

1
क्या आपने Apache / httpd उपयोगकर्ता के लिए अधिकतम अनुमत खुले फ़ाइल विवरणों को बढ़ाया है?
गोलजा

@ मेरी माई अलाइव सेटिंग्‍स रखें KeepAliveTimeout 10 इन httpd.conf
जॉन टाइटस

3
topइन समयों के दौरान आउटपुट कैसा दिखता है? कैसे के बारे में free -m? और अंत में iostat?
ज़ीरोफ़

जवाबों:


13

क्या आपने पोर्ट 8009 पर AJP 1.3 कनेक्टर में अधिकतम भार बढ़ाया है?


१५०० है, जो मेरे पास प्रति टस्कैट उदाहरण है
जॉन टाइटस १२'१२ को

@ जॉन, क्या आप कह रहे हैं कि प्रत्येक कनेक्टर के लिए आपने अधिकतम = "1500" निर्दिष्ट किया है? क्या आप AJP 1.3 कनेक्टर (पोर्ट 8009) के लिए अपना श्लोक पोस्ट कर सकते हैं?
HTTP500

इसे इंगित करने के लिए धन्यवाद .. AJP1.3 के लिए कोई भी अधिकतम सेटिंग नहीं है .. क्या यह कारण हो सकता है?
जॉन टाइटस

1
हां, उस कनेक्टर के लिए श्लोक में अधिकतम थ्रेड्स जोड़ें। डिफ़ॉल्ट 200 है।
एचटी 500 500 HTTP

6

अपाचे की तरह nginxया lighttpdसामने एक अतुल्यकालिक समीपस्थ वेब सर्वर स्थापित करने पर विचार करें । अपाचे सामग्री को समान रूप से कार्य करता है ताकि श्रमिकों को तब तक अवरुद्ध किया जाए जब तक कि ग्राहक पूर्ण रूप से उत्पन्न सामग्री डाउनलोड न करें ( यहां अधिक विवरण )। एक एसिंक्रोनस (नॉन-ब्लॉकिंग) प्रॉक्सी सेट करने से आमतौर पर स्थिति में नाटकीय रूप से सुधार होता है (मैं nginxएक अपेंडिक्स प्रॉक्सी के रूप में 30 से 3-5 तक समवर्ती रूप से चलने वाले अपाचे श्रमिकों की संख्या कम करता था )।


5

मुझे संदेह है कि आपकी समस्या टॉमकैट में है, न कि अपाचे से, वैसे भी जो आपने दिखाए हैं। जब आप 'त्रुटि 110' को टॉमकैट में वापस जोड़ने की कोशिश कर रहे हैं, तो यह इंगित करता है कि आपको उन कनेक्शनों की कतार मिल गई है जो सेवा करने के लिए प्रतीक्षा कर रहे हैं कि कोई और अधिक टॉमकट में सुनने वाले सॉकेट के लिए सुनने के बैकलॉग सेटअप में फिट नहीं हो सकता है।

From the listen manpage:
   The  backlog  parameter defines the maximum length the queue of pending 
   connections may grow to.  If a connection request arrives with
   the queue full the client may receive an error with an indication
   of ECONNREFUSED or, if the underlying protocol supports  
   retransmission, the request may be ignored so that retries succeed.

अगर मुझे अनुमान लगाना था, तो मुझे संदेह होगा कि जब सर्वर "चोकिंग" हो रहा है, तो HTTP के विशाल अनुरोध टॉमकट से वापस आने के लिए कुछ इंतजार कर रहे हैं। मैं शर्त लगाता हूं कि अगर आपने कुछ स्टैटिक कंटेंट लाने की कोशिश की है, तो सीधे अपाचे (टॉमकैट के समीप होने की बजाय) द्वारा परोसा जाता है कि यह तब भी काम करेगा जब इसके सामान्य रूप से 'चोकिंग' होगा।

मैं दुर्भाग्य से tomcat से परिचित नहीं हूं, लेकिन क्या इसके बजाय इस की संगामिति सेटिंग्स में हेरफेर करने का एक तरीका है?

ओह, और आप भी संभावना है कि उसके बाहरी नेटवर्क सेवाओं thats कनेक्शन की संख्या को सीमित करने पर विचार करने की आवश्यकता हो सकती है कि यह क्या कर रहा है आप के लिए 300 करने के लिए नीचे, तो यह कोई फर्क नहीं कितना संगामिति की छेड़खानी आप अपने सामने की ओर कर रहे हैं बनाता है यदि व्यावहारिक रूप से हर कनेक्शन आप एक बाहरी वेब सेवाओं की प्रतिक्रिया पर निर्भर करता है।

आपकी किसी टिप्पणी में डेटा का उल्लेख 2 मिनट के बाद बासी हो जाता है। मेरा सुझाव है कि इस सेवा से आपको मिलने वाली प्रतिक्रिया को दो मिनट के लिए समवर्ती कनेक्शन की मात्रा को कम करने के लिए आप बाहरी वेब सेवा पर चला रहे हैं।


2

इसका निवारण करने के लिए पहला कदम है अपाचे के mod_status को सक्षम करना और इसकी रिपोर्ट का अध्ययन करना - जब तक आपने ऐसा नहीं किया है, वास्तव में आप आँख बंद करके चल रहे हैं। वह धर्मी नहीं है। ;-)

उल्लेख करने के लिए दूसरी बात (मैं अपने आप से उन सवालों के जवाब के बारे में बताना पसंद करता हूं जो मैं नहीं पूछ रहा था, लेकिन ...) जैसे अधिक कुशल और विशेष फ्रंट-एंड सर्वर का उपयोग कर रहा है nginx

इसके अलावा, क्या आप वास्तव में restartअपाचे थे, या सिर्फ gracefulलाइक्स ने इसे पुनः लोड किया? :)


अपाचे फिर से शुरू हुआ .. एक सुंदर फिर से लोड नहीं
जॉन टाइटस

@ जोंटिटस, ठीक है, mod_statusआपका मित्र है, वैसे भी। :)
जूल

1

किसी भी प्रकार के एंटरप्राइज़-वाई परिनियोजन के लिए, प्रीफ़ॉर्क MPM आपके द्वारा किए गए सबसे खराब विकल्प के बारे में है: यह किसी के व्यवसाय की तरह संसाधनों की सुरक्षा करता है, और थ्रेड को पुनरारंभ करना अन्य MPM की तुलना में हमेशा के लिए लेता है।

कम से कम कार्यकर्ता MPM (अपाचे 2.2 और ऊपर) पर स्विच करें या - अभी तक बेहतर - अपने डिफ़ॉल्ट ईवेंट MPM के साथ वर्तमान स्थिर संस्करण 2.4.2 में अपग्रेड करें ।

ये दोनों बहुत कम ओवरहेड के साथ आसानी से हजारों समवर्ती कनेक्शनों को संभाल लेंगे।


धन्यवाद .. वह भी कोशिश की .. कोई भाग्य नहीं। TIME_WAIT कनेक्शन बढ़ते रहें। सर्वर 350 कनेक्शनों पर प्रतिक्रिया देना बंद कर देता है
जॉन टाइटस

1
मैं असहमत हूं कि यह सबसे बुरा विकल्प है - यह इस संदर्भ के लिए एक खराब विकल्प है और यह संभावना है कि थ्रेडेड सर्वर का उपयोग करके समस्याओं को कम किया जाएगा, लेकिन एक बेहतर समाधान एक घटना आधारित सर्वर (nginx या lighttpd) का उपयोग करना होगा। अपाचे आधारित घटना लगभग पर्याप्त नहीं है जो एक उद्यम तैनाती आईएमएचओ से माना जाता है।
सिम्बियन

1

मुझे पता है कि यह एक पुरानी कहानी है, लेकिन मेरे पास 2 टिप्पणियां हैं।

ServerLimit Directive के लिए एक हार्ड कोडित सीमा हैhttp://httpd.apache.org/docs/2.2/mod/mpm_common.html#serverlimit आप देखेंगे कि यह अधिकतम 20000 / 200K है।

सर्वर में संकलित सर्वरलिमिट 20000 की एक कठिन सीमा है (प्रीफॉर्क एमपीएम 200000 के लिए)। यह टाइपो के कारण होने वाले खराब प्रभावों से बचने के लिए है।

2 स्पष्ट रूप से नोडबो ने उल्लेख किया कि उन 2 को एक में सेट करना एक बहुत बुरा विचार है :

net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1

इसका मतलब है कि आप टाइमवेट का पुन: उपयोग करते हैं, लगता है क्या? सर्वर भारी लोड के तहत गलत क्लाइंट से बात कर सकता है।

मुझे एक बहुत अच्छा लेख मिला जो यह बताता है कि - लेकिन यह फ्रेंच है ;-) http://vincent.bernat.im/fr/blog/2014-tcp-time-wait-state-linux.html


0

34GB मेमोरी के साथ अतिरिक्त बड़ा।

बड़े पैमाने पर लोहे के पैमाने को नापने का तरीका नहीं है, आप सिर्फ अड़चनें बढ़ा रहे हैं। लेकिन इस बहुत स्मृति के साथ, मुझे संदेह है कि 50000 कनेक्शन धक्का दे रहे हैं कि सिस्टम विशेष रूप से क्या करने में सक्षम है:

पीक आवर्स के दौरान सर्वर लगभग 300 httpd प्रक्रियाओं को चोक कर देता है

यह उपयोगी होगा यदि आप "सर्वर चोक" द्वारा आपको समझाते हैं।

कनेक्शन के लिए इस तरह की उच्च सीमा होना बहुत ही अजीब है, लेकिन हिस्टैरिसीस (न्यूनतम / अधिकतम अतिरिक्त सर्वर) के लिए बहुत कम सीमा है।

यद्यपि आपके द्वारा प्रदान की गई त्रुटियों का अर्क टेल्टेल 'बहुत अधिक खुली फाइलें नहीं दिखाता है', मैं ओपन फाइल डिस्क्रिप्टर की संख्या और अलिमेट सेटिंग्स को देखकर शुरू करूंगा।


सर्वर चोक के रूप में यह भी सामान्य HTML फ़ाइलों का जवाब नहीं है ..
जॉन टाइटन

मैंने अधिकतम ग्राहकों को अब 3000 में बदल दिया .. अभी भी एक ही मुद्दा है
जॉन टाइटस

0

शायद Apache उपयोगकर्ता अनुमत फ़ाइल हैंडल से बाहर चल रहा है? आपने अपनी पोस्ट में इनका उल्लेख नहीं किया। अपाचे को वर्तमान में कितने फ़ाइल हैंडल करने की अनुमति है?


128192 फ़ाइल हैंडल
जॉन

0

यह एक टिप्पणी की तरह अधिक है, लेकिन जैसा कि मेरे पास कम प्रतिष्ठा नहीं है। ठीक वैसी ही समस्या के रूप में @john टाइटस आया था।

हमने MaxThreadsमुद्दे को हल करने के लिए अपने अपाचे थ्रेड की सीमा के करीब AJP कनेक्टर बनाया ।

इसकी निगरानी के लिए, हमने अपने AJP पोर्ट पर netstat कमांड के साथ नेटस्टैट SYN_SENT पोर्ट स्टेटस हेल्प की तलाश की।

netstat -an | grep :8102 | grep SYN_SENT | wc -l

यह 0 से नीचे हो गया, जो AJP कनेक्टर पर निर्धारित मैक्सट्र्रेड सीमा से पहले हमेशा कुछ बड़ी संख्या में था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.