TIME_WAIT में सॉकेट्स की संख्या कैसे कम करें?


36

उबंटू सर्वर 10.04.1 x86

मुझे nginx के पीछे FCGI HTTP सेवा के साथ एक मशीन मिली है, जो बहुत सारे अलग-अलग क्लाइंट के लिए कई छोटे HTTP अनुरोधों को प्रस्तुत करती है। (पीक ऑवर्स में लगभग 230 अनुरोध प्रति सेकंड, हेडर के साथ औसत प्रतिक्रिया आकार 650 बाइट्स हैं, प्रति दिन कई लाखों ग्राहक हैं।)

नतीजतन, मेरे पास बहुत सी सॉकेट हैं, TIME_WAIT में लटका हुआ है (ग्राफ नीचे टीसीपी सेटिंग्स के साथ कैप्चर किया गया है):

समय का इंतजार

मैं सॉकेट्स की संख्या कम करना चाहता हूं।

इसके अलावा मैं क्या कर सकता हूं?

$ बिल्ली / proc / sys / net / ipv4 / tcp_fin_timeout
1
$ बिल्ली / proc / sys / net / ipv4 / tcp_tw_recycle
1
$ बिल्ली / proc / sys / net / ipv4 / tcp_tw_reuse
1

अद्यतन: मशीन पर वास्तविक सेवा लेआउट पर कुछ विवरण:

क्लाइंट ----- टीसीपी-सॉकेट -> नेग्नेक्स (लोड बैलेंसर रिवर्स प्रॉक्सी) 
       ----- टीसीपी-सॉकेट -> नगीनेक्स (कार्यकर्ता) 
       --डोमेन-सॉकेट -> fcgi-software
                          - एकल-स्थायी-टीसीपी-सॉकेट -> रेडिस
                          - एकल-स्थिर-टीसीपी-सॉकेट -> MySQL (अन्य मशीन)

मुझे संभवतः लोड-बैलेंसर -> श्रमिक कनेक्शन को डोमेन सॉकेट पर भी स्विच करना चाहिए, लेकिन TIME_WAIT सॉकेट के बारे में समस्या बनी रहेगी - मेरी योजना जल्द ही एक अलग मशीन पर दूसरे कार्यकर्ता को जोड़ने की है। उस स्थिति में डोमेन सॉकेट का उपयोग करने में सक्षम नहीं होगा।


ऐसा लगता है कि मुनिन बेशर्मी से झूठ बोल रहा है। काइल के जवाब के लिए टिप्पणियाँ देखें। अब में देख रहा हूँ।
अलेक्जेंडर ग्लैडिश

1
मुनिन के बारे में एक प्रश्न बनाया गया: serverfault.com/questions/212200/…
अलेक्जेंडर ग्लैडिस

अब ऐसा लग रहा है कि मुनिन झूठ नहीं बोल रहा है, बल्कि मैं गलत साजिश को देख रहा हूं ...
अलेक्जेंडर ग्लैडीश

जवाबों:


28

शुरू करने के लिए आपको एक काम करना चाहिए net.ipv4.tcp_fin_timeout=1। यह कम करने का तरीका है, आपको संभवतः 30 से कम नहीं लेना चाहिए।

चूंकि यह नगनेक्स के पीछे है। इसका मतलब यह है कि nginx एक रिवर्स प्रॉक्सी के रूप में कार्य कर रहा है? अगर ऐसा है तो आपके कनेक्शन 2x (ग्राहक से एक, आपके वेब सर्वर पर एक) हैं। क्या आप जानते हैं कि ये सॉकेट किसके हैं?

अपडेट:
fin_timeout, वे कितनी देर तक फिन-वॉइट -2 ( networking/ip-sysctl.txtकर्नेल प्रलेखन में) से बने रहते हैं:

tcp_fin_timeout - INTEGER
        Time to hold socket in state FIN-WAIT-2, if it was closed
        by our side. Peer can be broken and never close its side,
        or even died unexpectedly. Default value is 60sec.
        Usual value used in 2.2 was 180 seconds, you may restore
        it, but remember that if your machine is even underloaded WEB server,
        you risk to overflow memory with kilotons of dead sockets,
        FIN-WAIT-2 sockets are less dangerous than FIN-WAIT-1,
        because they eat maximum 1.5K of memory, but they tend
        to live longer. Cf. tcp_max_orphans.

मुझे लगता है कि शायद आपको लिनक्स को TIME_WAIT सॉकेट नंबर को अपने पास रखने देना होगा, जो दिखता है कि उनके ऊपर शायद 32k कैप है और यह वह जगह है जहां लिनक्स उन्हें पुन: चक्रित करता है। इस लिंक में 32k को लिखा गया है :

इसके अलावा, मैं / proc / sys / net / ipv4 / tcp_max_tw_buckets भ्रमित करता हूं। हालाँकि डिफ़ॉल्ट 180000 पर सेट किया गया है, लेकिन जब मुझे अधिकतम ट्व बकेट की परवाह किए बिना अपने सिस्टम पर 32K TIME_WAIT सॉकेट्स होते हैं, तो मुझे टीसीपी व्यवधान दिखाई देता है।

यह लिंक यह भी बताता है कि TIME_WAIT स्थिति 60 सेकंड है और इसे खरीद के माध्यम से ट्यून नहीं किया जा सकता है।

रैंडम मजेदार तथ्य:
आप प्रत्येक सॉकेट के लिए टाइमस्टैट के साथ टाइमवेट पर टाइमर देख सकते हैंnetstat -on | grep TIME_WAIT | less

पुन: उपयोग बनाम रीसायकल:
ये एक प्रकार के दिलचस्प होते हैं, यह पढ़ता है जैसे पुन: उपयोग time_Wait सॉकेट के पुन: उपयोग को सक्षम करता है, और रीसायकल इसे टर्बो मोड में डालता है:

tcp_tw_recycle - BOOLEAN
        Enable fast recycling TIME-WAIT sockets. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

tcp_tw_reuse - BOOLEAN
        Allow to reuse TIME-WAIT sockets for new connections when it is
        safe from protocol viewpoint. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

मैं net.ipv4.tcp_tw_recycle का उपयोग करने की सलाह नहीं दूंगा क्योंकि यह NAT क्लाइंट के साथ समस्या का कारण बनता है

हो सकता है कि आप उन दोनों को चालू करने की कोशिश न करें और देखें कि इसका क्या प्रभाव पड़ता है (एक बार में प्रयास करें और देखें कि वे अपने आप कैसे काम करते हैं)? मैं netstat -n | grep TIME_WAIT | wc -lमुनिन की तुलना में तेज़ प्रतिक्रिया के लिए उपयोग करूंगा ।


1
@ केश: आप किस मूल्य net.ipv4.tcp_fin_timeoutकी सिफारिश करेंगे?
अलेक्जेंडर ग्लैडिश

1
@ काइल: क्लाइंट - टीसीपी-सॉकेट -> नग्नेक्स (लोड बैलेंसर रिवर्स प्रॉक्सी) - टीसीपी-सॉकेट -> नेग्नेक्स (वर्कर) --डोमेन-सॉकेट -> fcgi-software
अलेक्जेंडर ग्लैडिसन

2
मैं कहूंगा 30या शायद 20। यह कोशिश करो और देखो। आपके पास बहुत सारा लोड है इसलिए TIME_WAIT तरह का बहुत कुछ समझ में आता है।
काइल ब्रांट

1
@Kyle: एक बेवकूफ सवाल (मैं एक मालवाहक-पंथ स्तर पर अब तक यहां, दुर्भाग्य से कर रहा हूँ) के लिए खेद है, लेकिन मैं यह देखने के लिए जब मैं बदल वास्तव में क्या उम्मीद करनी चाहिए net.ipv4.tcp_fin_timeoutसे 1करने के लिए 20?
अलेक्जेंडर ग्लैडश

4
ओह, यहाँ एक अच्छा एक लाइनर है netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c:। तो @ एलेक्स, अगर मुनिन को पसंद नहीं है, तो शायद इन आंकड़ों पर नज़र रखता है। शायद एकमात्र मुद्दा यह है कि मुनिन आपको बुरा डेटा दे रहा है :-)
काइल ब्रांट

1

tcp_tw_reuse अपेक्षाकृत सुरक्षित है क्योंकि यह TIME_WAIT कनेक्शन को पुन: उपयोग करने की अनुमति देता है।

इसके अलावा, यदि आप बंदरगाहों से बाहर भाग रहे हैं तो समस्या के कारण आप अपने लोड-बैलेंसर के पीछे अलग-अलग पोर्टों पर सुनने के लिए अधिक सेवाएं चला सकते हैं।

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