बड़े RTT पर 100Mbps सर्वर से 1Gbps सर्वर से कम टीसीपी थ्रूपुट


9

हमें दुनिया भर के कुछ प्रमुख स्थानों - सिंगापुर, लंदन और लॉस एंजिल्स में बुनियादी ढांचे का वितरण किया गया है। किसी भी दो स्थानों के बीच RTT> 150ms से अधिक है।

हमने हाल ही में 1Gbps लिंक (100Mbps से) का उपयोग करने के लिए सभी सर्वरों को अपग्रेड किया है। हम विभिन्न स्थानों पर सर्वर के बीच कुछ टीसीपी-आधारित परीक्षण चला रहे हैं और कुछ आश्चर्यजनक परिणाम देखे हैं। ये परिणाम पूरी तरह से दोहराए जाने योग्य हैं।

  1. लॉस एंजिल्स (100Mbps) से लंदन (100Mbps): ~ 96Mbps थ्रूपुट
  2. लॉस एंजिल्स (100Mbps) से लंदन (1Gbps): ~ 96Mbps थ्रूपुट
  3. लॉस एंजिल्स (1Gbps) से लंदन (100Mbps): 10-40Mbps थ्रूपुट (अस्थिर)
  4. लॉस एंजिल्स (1Gbps) से लंदन (1Gbps): 10-40Mbps थ्रूपुट (अस्थिर)
  5. लॉस एंजिल्स (1Gbps) से लॉस एंजिल्स (1Gbps):> 900Mbps थ्रूपुट

ऐसा प्रतीत होता है कि जब भी प्रेषक 1Gbps पर चल रहा होता है, तो हमारा थ्रूपुट लंबे लिंक पर बहुत अधिक प्रभाव डालता है।

पहले का परीक्षण दृष्टिकोण बेहद सरल है - मैं सिर्फ लक्ष्य सर्वर से 1GB बाइनरी डाउनलोड करने के लिए cURL का उपयोग कर रहा हूं (इसलिए उपरोक्त मामले में, CURL क्लाइंट लंदन सर्वर पर चलता है और LA से डाउनलोड करता है, ताकि LA प्रेषक हो) । यह एकल टीसीपी कनेक्शन का उपयोग कर रहा है।

UDP पर iperf का उपयोग करके समान परीक्षणों को दोहराने से समस्या गायब हो जाती है!

  1. लॉस एंजिल्स (100Mbps) से लंदन (100Mbps): ~ 96Mbps थ्रूपुट
  2. लॉस एंजिल्स (100Mbps) से लंदन (1Gbps): ~ 96Mbps थ्रूपुट
  3. लॉस एंजिल्स (1Gbps) से लंदन (100Mbps): ~ 96Mbps थ्रूपुट
  4. लॉस एंजिल्स (1Gbps) से लंदन (1Gbps):> 250Mbps थ्रूपुट

यह मेरी आंखों में कुछ टीसीपी या एनआईसी / पोर्ट कॉन्फ़िगरेशन इश्यू पर स्क्वायर पॉइंट करता है।

दोनों सर्वर टीसीपी क्यूबिक के साथ CentOS 6.x चला रहे हैं। दोनों में 8MB अधिकतम टीसीपी विंडोज़ भेजने और प्राप्त करने की है, और टीसीपी टाइमस्टैम्प और चयनात्मक स्वीकृति सक्षम है। सभी परीक्षण मामलों में एक ही टीसीपी कॉन्फ़िगरेशन का उपयोग किया जाता है। पूर्ण टीसीपी विन्यास नीचे है:

net.core.somaxconn = 128
net.core.xfrm_aevent_etime = 10
net.core.xfrm_aevent_rseqth = 2
net.core.xfrm_larval_drop = 1
net.core.xfrm_acq_expires = 30
net.core.wmem_max = 8388608
net.core.rmem_max = 8388608
net.core.wmem_default = 131072
net.core.rmem_default = 131072
net.core.dev_weight = 64
net.core.netdev_max_backlog = 1000
net.core.message_cost = 5
net.core.message_burst = 10
net.core.optmem_max = 20480
net.core.rps_sock_flow_entries = 0
net.core.netdev_budget = 300
net.core.warnings = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_retrans_collapse = 1
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_abort_on_overflow = 0
net.ipv4.tcp_stdurg = 0
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_fack = 1
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_mem = 1528512      2038016 3057024
net.ipv4.tcp_wmem = 4096        131072  8388608
net.ipv4.tcp_rmem = 4096        131072  8388608
net.ipv4.tcp_app_win = 31
net.ipv4.tcp_adv_win_scale = 2
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_frto = 2
net.ipv4.tcp_frto_response = 0
net.ipv4.tcp_low_latency = 0
net.ipv4.tcp_no_metrics_save = 0
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_tso_win_divisor = 3
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_abc = 0
net.ipv4.tcp_mtu_probing = 0
net.ipv4.tcp_base_mss = 512
net.ipv4.tcp_workaround_signed_windows = 0
net.ipv4.tcp_dma_copybreak = 4096
net.ipv4.tcp_slow_start_after_idle = 1
net.ipv4.tcp_available_congestion_control = cubic reno
net.ipv4.tcp_allowed_congestion_control = cubic reno
net.ipv4.tcp_max_ssthresh = 0
net.ipv4.tcp_thin_linear_timeouts = 0
net.ipv4.tcp_thin_dupack = 0

संलग्न कुछ परीक्षण मामलों के तारचोर IO ग्राफ की छवियों के एक जोड़े हैं (क्षमा करें, मैं अभी तक सीधे चित्र पोस्ट नहीं कर सकता):

टेस्ट केस 1 (100Mbps -> 100Mbps) - अच्छा स्मूद ट्रांसफर। कैद में कोई नुकसान नहीं। - http ://103.imagebam.com/download/dyNftIGh-1iCFbjfMFvBQw/25498/254976014/100m.png

टेस्ट केस 3 (1Gbps -> 100Mbps) - वोटेल ट्रांसफर, किसी भी गति को प्राप्त करने में लंबा समय लेता है - कभी भी 100Mbps तक नहीं पहुंचता है। अभी तक कोई नुकसान / कब्जा में retransmits! - http://101.imagebam.com/download/KMYXHrLmN6l0Z4KbUYEZnA/25498/254976007/1g.png

इसलिए सारांश में, जब 1Gbps कनेक्शन के साथ एक लंबी लिंक का उपयोग किया जाता है, तो जब हम 100Mbps कनेक्शन का उपयोग करते हैं, तो हमें टीसीपी थ्रूपुट बहुत कम मिलता है।

मैं किसी भी टीसीपी विशेषज्ञों के कुछ संकेत की बहुत सराहना करता हूँ!

धन्यवाद!

अद्यतन (2013-05-29):

हमने परीक्षण मामले को # 4 ऊपर (1 जीबीपीएस प्रेषक, 1 जीबीपीएस रिसीवर, एक बड़े आरटीटी से अधिक) के साथ हल किया है। अब हम स्थानांतरण शुरू होने के कुछ सेकंड के भीतर ~ 970Mbps हिट कर सकते हैं। ऐसा प्रतीत होता है कि होस्टिंग प्रदाता के साथ एक स्विच का उपयोग किया गया है। एक अलग करने के लिए चल रहा है कि हल।

हालाँकि, टेस्ट केस # 3 ज्यादातर समस्याग्रस्त रहता है। यदि हमारे पास 100Mbps पर चलने वाला एक रिसीवर और 1Gbps पर भेजने वाला है, तो हमें रिसीवर को 100Mbps तक पहुंचने के लिए लगभग 2-3 मिनट का इंतजार है (लेकिन यह अब पहले की तुलना में पूर्ण दर पर पहुंचता है)। जैसे ही हम प्रेषक को 100Mbps से कम करते हैं या रिसीवर को 1Gbps तक बढ़ाते हैं, तब समस्या गायब हो जाती है और हम एक या दो मिनट में पूरी गति तक रैंप पर आ सकते हैं।

अंतर्निहित कारण यह है कि हम नुकसान देख रहे हैं, निश्चित रूप से, स्थानांतरण शुरू होने के तुरंत बाद। हालांकि, यह मेरी समझ से मेल नहीं खाता है कि धीमी गति से काम कैसे शुरू होता है; इंटरफ़ेस की गति का इस पर कोई असर नहीं होना चाहिए, क्योंकि इसे रिसीवर से ACKs द्वारा नियंत्रित किया जाना चाहिए।

कृपया कृतज्ञतापूर्वक सुझाव प्राप्त करें! अगर मैं यहाँ एक इनाम की पेशकश कर सकता, मैं करूँगा!


1
क्या आप NIC पर TCP ऑफ़लोड का उपयोग कर रहे हैं? क्या टीसीपी ऑफलोड का उपयोग 100M से 1G NIC तक भिन्न है? यदि परीक्षण के किसी भी मामले में इसका उपयोग किया जाता है, तो यह उस अक्षम के साथ परीक्षणों को दोहराने के लायक हो सकता है, यह देखने के लिए कि क्या 100M एनआईसी पर टीसीपी ऑफलोड इंजन 1 जी संचार के तरीके से हो रहा है (यह टिप्पणी जानबूझकर की गई है) हाथ-लहर सिर्फ आम तौर पर टीओई को लाने के लिए)
फ्लिसेलाइकब्रिक

अच्छा प्रश्न! दोनों सिरों पर TCP विभाजन ऑफ़लोड अक्षम है। जेनेरिक सेग्मेंटेशन ऑफ़लोड दोनों सिरों पर सक्षम है। मैंने इसे टीएसओ सक्षम के साथ भी दोहराया, और इससे कोई फर्क नहीं पड़ा।
सैम

जेनेरिक सेग्मेंट ऑफ़लोड को अक्षम करने का प्रयास करें, कम से कम 100M की ओर, और अपने परीक्षण दोहराएं
FliesLikeABrick

सुझाव के लिए धन्यवाद, लेकिन कोई खुशी नहीं - दोनों पक्षों पर गॉस के साथ समान परिणाम।
सैम

150ms + पर 1Gbps 18Mb से अधिक का एक बहुत बड़ा बैंडविड्थ विलंब उत्पाद देता है। यदि आप अपने सॉकेट बफ़र्स को टक्कर देते हैं तो क्या होता है? tcp_*mem = 4096 1048576 33554432आपने 1Gbps लिंक पर जंबो फ्रेम्स को सक्षम नहीं किया है? यह कहीं न कहीं विखंडन का कारण बन सकता है।
सुपरजामी

जवाबों:


1

मुख्य मुद्दा बड़ी WAN देरी है। यह बहुत खराब हो जाएगा अगर यह भी यादृच्छिक पैकेट खो दिया है।

1, tcp_mem को अधिक मेमोरी आवंटित करने के लिए बड़े सेट की आवश्यकता होती है। उदाहरण के लिए, इसे net.ipv4.tcp_mem = 4643328 6191104 9286656 के रूप में सेट करें

2, आप कई मिनटों तक वायरशर्क / tcpdump के माध्यम से पैकेट पर कब्जा कर सकते हैं, फिर एनालिसिस कर सकते हैं कि क्या यह यादृच्छिक पैकेट खो गया है। आप चाहें तो पैकेट फ़ाइल अपलोड भी कर सकते हैं।

3, आप अन्य tcp मापदंडों जैसे ट्यून करने की कोशिश कर सकते हैं। सेट tcp_westwood = 1 और tcp_bic = 1


धन्यवाद, लेकिन हम उन सभी की कोशिश की है। WAN देरी मुद्दा नहीं है - अगर हम 100Mbps पोर्ट का उपयोग करते हैं तो हम लगभग तुरंत 100Mbps मार सकते हैं, लेकिन जैसे ही 1Gbps में परिवर्तन होता है तो हम टोस्ट हो जाते हैं।
सैम

1

हल किया! पूरी जानकारी के लिए http://comments.gmane.org/gmane.linux.drivers.e1000.devel/11813 देखें

संक्षेप में, ऐसा प्रतीत होता है कि 1Gbps कनेक्टेड सर्वर टीसीपी के घातीय वृद्धि चरण के दौरान ट्रैफ़िक भेज देगा जो कुछ मध्यवर्ती डिवाइस (जो जानता है कि क्या है) में बफ़र्स को बाढ़ देगा । यह दो विकल्प छोड़ता है:

1) प्रत्येक मध्यवर्ती नेटवर्क ऑपरेटर से संपर्क करें और उन्हें मेरे वांछित बैंडविड्थ और आरटीटी के लिए अनुमति देने के लिए उपयुक्त बफ़र्स कॉन्फ़िगर करें। सुंदर संभावना नहीं! 2) फटने को सीमित करें।

मैंने प्रत्येक TCP प्रवाह को अधिकतम 100Mbps पर संचालित करने के लिए चुना। यहाँ संख्या काफी मनमानी है - मैंने पूरी तरह से 100Mbps को चुना क्योंकि मुझे पता था कि पिछला रास्ता 100 एमबीपीएस को संभाल सकता है और मुझे व्यक्तिगत प्रवाह के लिए किसी और की आवश्यकता नहीं थी ।

आशा है कि यह भविष्य में किसी की मदद करेगा।


0

UDP पर iperf का उपयोग करके समान परीक्षणों को दोहराने से समस्या गायब हो जाती है!

लॉस एंजिल्स (1Gbps) से लंदन (1Gbps):> 250Mbps थ्रूपुट

यह समस्या दूर होती नहीं दिख रही है, क्या आपके 75% पैकेट गिराए जा रहे हैं? यदि टीसीपी हर समय धीमी गति से शुरू होता है, तो आपका औसत बैंडवाइट कम हो सकता है।

Btw, क्या आपके पास लंदन के लिए LA और लंदन से लंदन के लिए बेंचमार्क हैं?


मैं उल्लेख करना भूल गया कि ग्राहक एक धीमा है ... यदि हम दो तेज ग्राहकों के साथ दोहराते हैं, तो हम ~ 970Mbps द्वि-दिशात्मक रूप से हिट करते हैं।
सैम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.