क्लाइंट और सर्वर दोनों पक्षों पर कुछ सीमाओं के अनुसार अधिकतम संख्या में कनेक्शन प्रभावित होते हैं, भले ही वे कुछ अलग हों।
क्लाइंट की तरफ:
एफर्मल पोर्ट रेंज बढ़ाएँ, और घटाएँtcp_fin_timeout
डिफ़ॉल्ट मानों का पता लगाने के लिए:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
इफरमल पोर्ट रेंज एक आउटबाउंड सॉकेट्स की अधिकतम संख्या को परिभाषित करता है जो एक होस्ट एक विशेष आईपी पते से बना सकता है। fin_timeout
कम से कम समय इन सॉकेट में रहेगी परिभाषित करता है TIME_WAIT
राज्य (एक बार इस्तेमाल किया जा रहा करने के बाद बेकार)। सामान्य प्रणाली चूक हैं:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
इसका मूल रूप से मतलब है कि आपका सिस्टम लगातार (61000 - 32768) / 60 = 470
प्रति सेकंड सॉकेट से अधिक की गारंटी नहीं दे सकता है । यदि आप इससे खुश नहीं हैं, तो आप शुरुआत को बढ़ा सकते हैं port_range
। सीमा तय करना 15000 61000
इन दिनों बहुत आम है। आप घटाकर उपलब्धता को और बढ़ा सकते हैं fin_timeout
। मान लीजिए कि आप दोनों करते हैं, तो आपको 1500 से अधिक आउटबाउंड कनेक्शन प्रति सेकंड, अधिक आसानी से देखना चाहिए।
मान बदलने के लिए :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
उपरोक्त की व्याख्या नहीं की जानी चाहिए क्योंकि प्रति सेकंड आउटबाउंड कनेक्शन बनाने के लिए सिस्टम की क्षमता को प्रभावित करने वाले कारक। लेकिन बल्कि ये कारक "गतिविधि" की बड़ी अवधि के लिए एक स्थायी तरीके से समवर्ती कनेक्शन को संभालने की प्रणाली की क्षमता को प्रभावित करते हैं।
tcp_tw_recycle
& के लिए एक विशिष्ट लिनक्स बॉक्स पर डिफ़ॉल्ट Sysctl मान tcp_tw_reuse
होगा
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
ये "उपयोग किए गए" सॉकेट (प्रतीक्षा की स्थिति में) से कनेक्शन की अनुमति नहीं देते हैं और सॉकेट्स को पूरा time_wait
चक्र चलाने के लिए मजबूर करते हैं । मैं सेटिंग की सलाह देता हूं:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
यह time_wait
राज्य में सॉकेट्स के तेजी से साइकिल चलाने और उन्हें फिर से उपयोग करने की अनुमति देता है। लेकिन इससे पहले कि आप इस परिवर्तन को सुनिश्चित करें कि यह प्रोटोकॉल के साथ संघर्ष नहीं करता है जो आप उस एप्लिकेशन के लिए उपयोग करेंगे जो इन सॉकेट्स की आवश्यकता है। निहितार्थ को समझने के लिए विन्सेंट बर्नट से "टीसीपी टाइम-वाइट के साथ नकल" पोस्ट को पढ़ना सुनिश्चित करें । यह net.ipv4.tcp_tw_recycle
विकल्प सार्वजनिक-सामना करने वाले सर्वरों के लिए काफी समस्याग्रस्त है क्योंकि यह एक ही NAT डिवाइस के पीछे दो अलग-अलग कंप्यूटरों से कनेक्शन को संभाल नहीं पाएगा , जिसका पता लगाने और आपको काटने के लिए इंतजार करना एक समस्या है। ध्यान दें कि लिनक्स 4.12 से हटाnet.ipv4.tcp_tw_recycle
दिया गया है ।
सर्वर साइड पर:net.core.somaxconn
मूल्य एक महत्वपूर्ण भूमिका है। यह एक सुनने वाले सॉकेट के लिए कतारबद्ध अनुरोधों की अधिकतम संख्या को सीमित करता है। यदि आप अपने सर्वर एप्लिकेशन की क्षमता के बारे में सुनिश्चित हैं, तो इसे 128 से 1024 की तरह डिफ़ॉल्ट 128 से टकराएं। अब आप इस एप्लिकेशन के श्रवण कॉल में सुने बैकलॉग वैरिएबल को एक समान या उच्च पूर्णांक तक संशोधित करके इस लाभ का लाभ उठा सकते हैं।
sysctl net.core.somaxconn=1024
txqueuelen
आपके ईथरनेट कार्ड के पैरामीटर की भी भूमिका होती है। डिफ़ॉल्ट मान 1000 हैं, इसलिए उन्हें 5000 या उससे अधिक तक टक्कर दें यदि आपका सिस्टम इसे संभाल सकता है।
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
इसी तरह मूल्यों के लिए टकराओ net.core.netdev_max_backlog
और net.ipv4.tcp_max_syn_backlog
। उनके डिफ़ॉल्ट मान क्रमशः 1000 और 1024 हैं।
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
अब अपने क्लाइंट और सर्वर साइड एप्लिकेशन को शेल में एफडी अल्सर बढ़ाकर दोनों को शुरू करना याद रखें।
उपरोक्त के अलावा प्रोग्रामर द्वारा उपयोग की जाने वाली एक और लोकप्रिय तकनीक है tcp लिखना कॉल की संख्या को कम करना। मेरी अपनी प्राथमिकता एक बफर का उपयोग करना है जिसमें मैं ग्राहक को भेजने के लिए वांछित डेटा को धक्का देता हूं, और फिर उपयुक्त बिंदुओं पर मैं बफर सॉकेट को वास्तविक सॉकेट में लिखता हूं। यह तकनीक मुझे बड़े डेटा पैकेट का उपयोग करने, विखंडन को कम करने, उपयोगकर्ता भूमि और कर्नेल-स्तर पर मेरे सीपीयू उपयोग को कम करने की अनुमति देती है।