सवाल लिनक्स सर्वर पर अधिकतम कनेक्शन की सीमा क्या है?


कर्नेल पैरामीटर या अन्य सेटिंग्स अधिकतम संख्या में टीसीपी सॉकेट को नियंत्रित करती हैं जो लिनक्स सर्वर पर खुल सकती हैं? अधिक कनेक्शन की अनुमति देने के ट्रेडऑफ क्या हैं?

मैंने देखा कि लोड अपाचे सर्वर के साथ लोड किया गया है अब कि सर्वर पर खुले कनेक्शन को अधिकतम करना बहुत आसान है। यदि आप ab's -k विकल्प छोड़ देते हैं, जो कनेक्शन पुन: उपयोग की अनुमति देता है, और इसे लगभग 10,000 अनुरोध भेजते हैं तो अपाचे पहले 11,000 या तो अनुरोधों को सेवा देता है और फिर 60 सेकंड तक रोकता है। नेटस्टैट आउटपुट पर एक नजर TIME_WAIT राज्य में 11,000 कनेक्शन दिखाती है। जाहिर है, यह सामान्य है। क्लाइंट के साथ उनके साथ किए जाने के बाद भी कनेक्शन 60 सेकेंड का डिफॉल्ट खुलता रहता है टीसीपी विश्वसनीयता कारणों से

ऐसा लगता है कि यह एक सर्वर करने के लिए एक आसान तरीका होगा और मैं सोच रहा हूं कि इसके लिए सामान्य ट्यूनिंग और सावधानियां क्या हैं।

मेरा परीक्षण आउटपुट यहां है:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

परीक्षण के दौरान चलाए गए नेटस्टैट कमांड यहां दिया गया है:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18


मूल




जवाब:


अंततः मुझे सेटिंग मिली जो वास्तव में कनेक्शन की संख्या सीमित कर रही थी: net.ipv4.netfilter.ip_conntrack_max। यह 11,776 पर सेट किया गया था और जो भी मैंने इसे सेट किया है, वह प्रतीक्षा करने से पहले मेरे परीक्षण में सेवा के अनुरोधों की संख्या है tcp_fin_timeout अधिक कनेक्शन उपलब्ध होने के लिए सेकंड। conntrack टेबल वह है जो कर्नेल कनेक्शन की स्थिति को ट्रैक करने के लिए उपयोग करता है ताकि एक बार यह पूरा हो जाए, कर्नेल पैकेट छोड़ना शुरू कर देता है और इसे लॉग में प्रिंट करता है:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

अगला कदम कर्नेल को उन सभी कनेक्शनों को रीसायकल करने के लिए मिल रहा था TIME_WAIT पैकेट छोड़ने के बजाए राज्य। मैं इसे चालू करके या तो हो सकता था tcp_tw_recycle या बढ़ रहा है ip_conntrack_max कनेक्शन के लिए उपलब्ध स्थानीय बंदरगाहों की संख्या से बड़ा होना ip_local_port_range। मुझे लगता है कि एक बार कर्नेल स्थानीय बंदरगाहों से बाहर हो जाने पर यह रीसाइक्लिंग कनेक्शन शुरू करता है। यह अधिक मेमोरी ट्रैकिंग कनेक्शन का उपयोग करता है लेकिन यह चालू करने से बेहतर समाधान की तरह लगता है tcp_tw_recycle चूंकि दस्तावेज़ों का अर्थ है कि यह खतरनाक है।

इस कॉन्फ़िगरेशन के साथ मैं पूरे दिन दौड़ सकता हूं और कनेक्शन से बाहर नहीं चला सकता:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

tcp_max_orphans सेटिंग के मेरे परीक्षणों पर कोई प्रभाव नहीं पड़ा और मुझे नहीं पता कि क्यों। मुझे लगता है कि यह कनेक्शन बंद कर देगा TIME_WAIT एक बार राज्य में 8192 थे लेकिन यह मेरे लिए ऐसा नहीं करता है।


62
2018-06-03 16:02



हम इन पैरा को कहां कॉन्फ़िगर करते हैं? - Codevalley
@Codevalley यह सिस्टम-निर्भर हो सकता है लेकिन उबंटू सर्वर पर वे /etc/sysctl.conf में जाते हैं - Ben Williams


आप वास्तव में देखना चाहते हैं कि इस संबंध में / proc फाइल सिस्टम को आपको क्या पेश करना है।

उस अंतिम पृष्ठ पर, आपको निम्न में रुचि रखने के लिए निम्नलिखित मिल सकते हैं:

  • / Proc / sys / नेट / IPv4 / tcp_max_orphans, जो सिस्टम द्वारा आयोजित अधिकतम संख्या में सॉकेट को नियंत्रित करता है नहीं कुछ से जुड़ा हुआ है। इसे बढ़ाने से गैर-स्वीकार्य स्मृति के 64 किलोबाइट का उपभोग हो सकता है प्रति अनाथ सॉकेट
  • / Proc / sys / नेट / IPv4 / tcp_orphan_retries, जो एक सॉकेट से पहले अनाथ और बंद होने से पहले रिट्री की मात्रा को नियंत्रित करता है। उस पृष्ठ पर वेब सर्वर के बारे में एक विशिष्ट नोट है जो आपके लिए सीधे रूचि है ...

23
2018-05-21 18:15



tcp_max_orphans दिलचस्प है लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। जब मैं अपने परीक्षण के दौरान अनाथ सॉकेट को मापने की कोशिश करता हूं तो मुझे उनमें से 11,651 दिखाई देते हैं जबकि tcp_max_orphans 8,092 है। # netstat --inet -p | grep "localhost: www" | sed -e / \ + / / g '| कट-डी '' -फ 1-4,6-7 | सॉर्ट | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
Tcp_orphan_retries सेटिंग को देखें - विचार यह है कि सॉकेट को "कूल्ड" कर दिया जाता है ... - Avery Payne
@ जॉडर हो का सुझाव + tcp_orphan_retries आपकी स्थिति के लिए संभावित जीत की तरह ध्वनि। - Avery Payne


मुझे नहीं लगता कि सीधे सेट करने के लिए एक ट्यून करने योग्य है। यह टीसीपी / आईपी ट्यूनिंग की श्रेणी के अंतर्गत आता है। यह पता लगाने के लिए कि आप क्या ट्यून कर सकते हैं, 'मैन 7 टीसीपी' आज़माएं। Sysctl ('मैन 8 sysctl') इन्हें सेट करने के लिए उपयोग किया जाता है। 'sysctl -a | grep tcp 'आपको सबसे ज्यादा दिखाएगा जो आप ट्यून कर सकते हैं, लेकिन मुझे यकीन नहीं है कि यह उन सभी को दिखाएगा या नहीं। साथ ही, जब तक यह बदल नहीं जाता है, तो टीसीपी / आईपी सॉकेट खुले होते हैं जैसे फाइल डिस्क्रिप्टर। इसलिए इस और उस लिंक में अगला अनुभाग वह हो सकता है जिसे आप ढूंढ रहे हैं।


3
2018-05-21 17:31





निम्नलिखित को सेट करने का प्रयास करें और साथ ही tcp_fin_timeout को सेट करें। यह TIME_WAIT को और अधिक तेज़ी से बंद कर देना चाहिए।

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

2
2018-05-21 19:38



यहाँ सावधान रहें! कठिन तरीके से अनुभव किया। "यह लोड-बैलेंसिंग और एनएटी के साथ फ्रेम्स को गिरा सकता है, केवल उस सर्वर के लिए इसका उपयोग करें जो केवल आपके स्थानीय नेटवर्क पर संचार करता है।" - wiki.archlinux.org/index.php/Sysctl - Henk
@ हेनक मुझे लगता है कि यह है tcp_tw_recycle यह संभावित रूप से खतरनाक है। tcp_tw_reuse सुरक्षित है और मुझे एक साथ उनका उपयोग करने का कोई कारण नहीं दिख रहा है। - Vladislav Rastrusny


स्टॉक अपाचे (1) केवल 250 समवर्ती कनेक्शनों का समर्थन करने के लिए पूर्वनिर्धारित होता था - यदि आप और चाहते थे, तो अधिक समवर्ती सत्रों को अनुमति देने के लिए संशोधित करने के लिए एक हेडर फ़ाइल थी। मुझे नहीं पता कि यह अभी भी अपाचे 2 के साथ सच है या नहीं।

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

अपने कार्यकर्ता सेटिंग्स पर ध्यान दें और अपाचे के अंदर आपके पास कितने रखरखाव का समय है, आप कितने अतिरिक्त सर्वर सर्वर चला रहे हैं, और इन अतिरिक्त प्रक्रियाओं को कितनी तेजी से मार दिया जा रहा है।


2
2018-05-21 21:21





आप TIME_WAIT स्थिति में बिताए गए समय को कम कर सकते हैं (net.ipv4.tcp_fin_timeout सेट करें)। आप अपाचे को YAWS या nginx या कुछ समान के साथ बदल सकते हैं।

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


1
2018-05-21 16:26



tcp_fin_timeout टाइम-WAIT समाप्ति को सेट करने के लिए नहीं है, जो कर्नेल के पुनर्निर्माण के बाहर नहीं बदला जा सकता है, लेकिन FIN के लिए, जैसा कि नाम इंगित करता है। - Alexandr Kurilin


एकल आईपी पते पर खुले सॉकेट की पूर्ण संख्या 2 ^ 16 है और इसे टीसीपी / यूडीपी द्वारा परिभाषित किया गया है, कर्नेल नहीं।


0
2018-05-30 16:42



नहीं, यह नहीं है। आप अधिक खोल सकते हैं, क्योंकि स्थानीय बंदरगाह को अद्वितीय होने की आवश्यकता नहीं है जब तक कि दूरस्थ पते अलग-अलग हों। इसके अलावा, ओपी प्रति सर्वर ने कहा, और आप प्रति सर्वर> 1 पता हो सकता है। - MarkR


अपाचे HTTP सर्वर बेंचमार्किंग टूल, अब, 2.4 संस्करण में है टाइमआउट विकल्प। यह भी देखें एबी (अपाचे बेंच) त्रुटि: apr_poll: निर्दिष्ट टाइमआउट विंडोज़ पर समाप्त हो गया है (70007)

यह विकल्प आपकी समस्या हल करता है।


0
2018-02-08 17:56