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


89

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

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

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

यहाँ मेरा परीक्षण उत्पादन है:

# 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

जवाबों:


64

मुझे अंत में वह सेटिंग मिली जो वास्तव में कनेक्शन की संख्या को सीमित कर रही थी 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 थे, लेकिन यह मेरे लिए ऐसा नहीं करता है।


3
हम इन परिमों को कहाँ कॉन्फ़िगर करते हैं?
कोडवल्ले

2
@ कोडवेल्ली सिस्टम-निर्भर हो सकता है, लेकिन उबंटू सर्वर पर वे /etc/sysctl.conf पर जाते हैं
बेन विलियम्स

24

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

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

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

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

Tcp_orphan_retries सेटिंग को देखें - विचार होने के नाते, सॉकेट "जल्दी से" जल्दी हो जाता है ...
एवरी पायने

@ जौदर हो का सुझाव + tcp_orphan_retries आपकी स्थिति के लिए संभावित जीत की तरह लगता है।
एवेरी पायने

3

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


2

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

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

यहाँ सावधान! कठिन रास्ता अनुभव किया। "यह लोड-बैलेंसिंग और NATs के साथ गिराए गए फ़्रेम का कारण हो सकता है, केवल इसका उपयोग ऐसे सर्वर के लिए करें जो केवल आपके स्थानीय नेटवर्क पर संचार करता है।" - wiki.archlinux.org/index.php/Sysctl
Henk

@ मुझे लगता है tcp_tw_recycleकि यह संभावित खतरनाक है। tcp_tw_reuseसुरक्षित है और मैं उन्हें एक साथ उपयोग करने का कोई कारण नहीं देखता।
व्लादिस्लाव रैस्ट्रोसनी

2

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

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

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


1

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

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


1
tcp_fin_timeout TIME-WAIT समाप्ति सेट करने के लिए नहीं है, जो कर्नेल के पुनर्निर्माण के बाहर परिवर्तनशील नहीं है, लेकिन जैसा कि नाम से संकेत मिलता है, फिन के लिए।
एलेक्जेंड्रा कुरिलिन

0

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


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

0

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

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

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