CoreOS: tcpdump रहस्यमय तरीके से नेटवर्क समस्या (उपयोग किए गए सॉकेट की अत्यधिक संख्या) को हल करता है


14

मुझे आज आपके लिए एक रहस्य मिल गया है। हम Azure पर CoreOS (2023.5.0 / Linux 4.19.25-coreos) पर आधारित एक छोटा, तीन नोड इलास्टिक्स खोज समूह चलाते हैं। Elasticsearch होस्ट नेटवर्क मोड में एक डॉक कंटेनर के अंदर चलाया जाता है। एक वर्ष से अधिक के लिए लगभग पूरी तरह से रखरखाव मुफ्त चलाने के बाद हम मशीनों को एक बहुत ही दिलचस्प स्थिति में प्रवेश करते हुए देख रहे हैं।

अपडेट करें

यह समस्या लिनक्स कर्नेल में एक ड्राइवर को फिक्स करके हल की गई थी । नीचे उत्तर देखें।

लक्षण

मूल रूप से, प्रभावित मशीन और अन्य दो नोड्स के बीच नेटवर्किंग मर जाती है। सभी एक ही वर्चुअल नेटवर्क और एक ही सबनेट में होते हैं और दूसरे के साथ ususally संचार कर सकते हैं। प्रभावित नोड अभी भी अन्य सबनेट (मैं इसे में ssh कर सकते हैं) और एक अलग peered आभासी नेटवर्क से पहुँचा जा सकता है। मशीन में इंटरनेट के लिए (बहुत धब्बेदार) कनेक्शन भी है, लेकिन ज्यादातर अनुरोध समय से बाहर हो जाते हैं।

हमने देखा है कि एक प्रभावित नोड पर, रिपोर्ट की गई "सॉकेट्स" की संख्या /proc/net/sockstatबहुत अधिक है (एक स्वस्थ नोड पर ~ 300 के बजाय 4.5k)। मॉनिटरिंग से पता चलता है कि यह संख्या तेजी से बढ़ रही है कि नोड अनुपलब्ध हो गया है।

मज़े की बात यह है कि हम इन प्रयुक्त सॉकेट्स के स्रोत की पहचान नहीं कर सकते हैं:

# cat /proc/net/sockstat
sockets: used 4566
TCP: inuse 2 orphan 0 tw 2 alloc 98 mem 4
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# cat /proc/net/sockstat6
TCP6: inuse 98
UDP6: inuse 1
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse 0 memory 0

इसके अलावा मशीन ठीक लगती है। कोई संदिग्ध प्रक्रिया नहीं चल रही है, सीपीयू का उपयोग कम से कम है और उपलब्ध मेमोरी की पैलेट है।

एक ही सबनेट में "अगम्य" वीएम को पिंग EAGAINकरने से कुछ प्रतिक्रियाएं होती हैं recvmsgऔर फिर ENOBUFSसे वापस आने के लिए पार हो जाती है sendmsgस्ट्रेस पिंग आउटपुट यहाँ

मैंने कुछ अतिरिक्त आउटपुट एकत्र किए हैं (सिस्टम में कोई भी संशोधन करने से पहले) और इसे इस gist में पोस्ट किया है: https://gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726437107c

विश्लेषण

हमने वह सब कुछ बंद करने की कोशिश की है जो हम सर्वर पर सोच सकते हैं, जिसमें इलास्टिक्सर्च पहला संदिग्ध है। लेकिन इलास्टिसर्च कंटेनर को बंद करने से उपयोग किए गए सॉकेट को खाली नहीं किया जाता है। सभी कोरओएस-संबंधित प्रक्रियाओं (अपडेट-इंजन, लॉकस्मिथ, ...) या यहां तक ​​कि पूरे डॉकर रनटाइम या एज़्योर-विशिष्ट सामान के लिए एक ही बात। मदद के लिए कुछ भी नहीं लग रहा था।

लेकिन अब यह भी अजीब हो जाता है: हमने tcpdumpमशीन पर चलने का प्रयास किया कि क्या चल रहा है। और निहारना: समस्या खुद हल हो गई, कनेक्टिविटी बहाल हो गई। हमारा सिद्धांत था कि tcpdump किसी प्रकार का syscall करता है जो इसे हल करता है। हमने gdb के साथ tcpdump चलाया और सभी syscalls पर ब्रेकपॉइंट सेट किए। Breakpoints का भार के माध्यम से कदम के बाद, हम अंत में पाया गया कि कैप्चरिंग सॉकेट (विशेष रूप से पर अनेक मोड सेट का कार्य libpcap में इस लाइन ) बात यह है कि फिर सेट करता है सॉकेट एक सामान्य अवस्था में काउंटर और हमें रिटर्न इस्तेमाल किया है।

अतिरिक्त खोज

  • हमने सत्यापित किया है कि झंडे के tcpdumpसाथ चलने से -p/--no-promiscuous-modeउपयोग किए गए सॉकेट्स काउंटर को साफ नहीं करते हैं और मशीन को एक उपयोगी स्थिति में वापस कर देते हैं।
  • रनिंग उपयोग किएifconfig eth0 txqueuelen 1001 गए सॉकेट को काउंटर पर रीसेट करता है लेकिन कनेक्टिविटी बहाल नहीं होती है।
  • साथ ip link set eth0 promisc onही मैन्युअल मोड को सेट करना भी कनेक्टिविटी को बहाल नहीं करता है।
    • net.ipv4.xfrm4_gc_thresh 32768 पर सेट है और इसे थोड़ा बढ़ाने से समस्या का समाधान नहीं होता है।

सॉकेट का इस्तेमाल किया

हम एज़्योर के संपर्क में रहे हैं जो इस तरह से चकित हैं जैसे हम हैं। मैं समझता हूं कि यह समस्या नहीं है, बल्कि सिर्फ एक लक्षण है। लेकिन यह एकमात्र मूर्त चीज है जो मुझे अब तक मिली है। मेरी आशा है कि लक्षण को समझकर मैं मूल कारण के करीब पहुँच सकता हूँ। Azure पर नेटवर्क इंटरफ़ेस इस नेटवर्क ड्राइवर के साथ चलाया जाता है ।

शायद कोरोस / कर्नेल को दोष देना है?

समयावधि के दृष्टिकोण से, समस्याएं 2019-03-11 को शुरू हुईं, जिस दिन कोरओएस ऑटो-अपडेट से नवीनतम संस्करण में बदल गया। रिलीज नोट्स के अनुसार , इस अपडेट में 4.15.23 से 4.19.25 तक कर्नेल अपडेट था । मैं अभी भी चैंज के माध्यम से जा रहा हूं यह देखने के लिए कि क्या कुछ भी वहां एक मुद्दा हो सकता है। अब तक मैंने केवल यह पाया है कि हाइपर नेटवर्क ड्राइवर को हाल के महीनों में कुछ अपडेट मिले हैं , जो सभी 4.19.25 का हिस्सा नहीं लगते हैं। 4.19.25 को जो पैचसेट लागू हुआ वह प्रभावशाली नहीं है , लेकिन एक नकली nf_conntrack_ipv4 मॉड्यूल का परिचय देने वाला पैच नया है।

अद्यतन: संभव संबंधित आने वाले कर्नेल पैच?

मदद!

अब तक, हमारे पास निम्नलिखित प्रश्न हैं:

  • इस "सॉकेट्स" मेट्रिक को आसमान छूने के लिए क्या कारण हो सकता है? मैंने इस मीट्रिक के लिए कर्नेल स्रोतों के माध्यम से पढ़ा है और यह सिर्फ एक काउंटर के रूप में प्रतीत होता है कि वे वास्तव में किस तरह के सॉकेट हैं या किस तरह से बनाए गए हैं।

  • लगभग ४.५ k पर फ्लैटलाइन क्यों है? यह किस सीमा के कारण होगा?

  • क्या कर्नेल 4.14.96 और 4.19.25 के बीच कुछ महत्वपूर्ण परिवर्तन हुआ?

  • setsockopt()Libpcap में कॉल राज्य को रीसेट क्यों करता है ?

संबंधित कोरओएस बग: https://github.com/coreos/bugs/issues/2572


खुले सॉकेट एक परिणामी समस्या है, रूट समस्या IMHO नहीं है। एक ब्रिज डिवाइस पर मैकवैलन डिवाइस (अपने स्वयं के मैक पते के साथ) के साथ एक लिनक्स सिस्टम पर मेरा यह व्यवहार था। पुल को सेट करने के लिए मैकविलेन उपकरणों को काम करने के लिए कहा गया। मैं कोरोस या नीला नहीं जानता। समस्या यह है कि एक अंतर्निहित परत ऊपरी स्तरों पर मैक पते के बारे में नहीं जानती है।
एंड्रियास एमआर

आपकी टिप्पणी के लिये धन्यवाद! मुझे लगता है कि उपयोग किए जाने वाले सॉकेट्स की उच्च संख्या मूल कारण नहीं है, मैं सिर्फ एक ठोस चीज पर चिपके हुए हूं जिसे मैं मशीन पर असामान्य रूप से पहचान सकता हूं।
स्टीफ़न क्लेन

हाय स्टीफन। कोई खबर? कृपया रिपोर्ट 1) WOL सक्षम है? 2) sysctl -w net.ipv4.route.flush = 1 हल करता है? 3) बिना किसी काम के राज्य में arp कैश क्या है? काम की अवस्था में?
मैसिमो

जवाबों:


4

सबसे पहले, बहुत अच्छी तरह से लिखित प्रश्न के लिए धन्यवाद!

जैसा कि आपके द्वारा वर्णित विवरण का स्तर बहुत अधिक है और आप पहले से ही जीडीबी स्तर पर हैं, मुझे लगता है कि मेरा उत्तर आपके लिए बहुत अधिक उपयोग नहीं होगा। वैसे भी, यहाँ एक कोशिश है:

  • शायद आप पहले से ही की तरह कुछ की कोशिश की ss -aeऔर lsof -n?
  • क्या ऐसा होने dmesgपर कुछ भी दिलचस्प होता है?
  • क्या आप सर्वर पर iptables का उपयोग करते हैं?
  • यदि आप tcpdump (कहते हैं, ip link set [interface] promisc on) की तुलना में किसी अन्य तरीके का उपयोग करके प्रोमिसस मोड सेट करते हैं , तो क्या यह भी समस्या को ठीक करता है?
  • क्या आपने किसी भी संदिग्ध प्रक्रियाओं, फाइलों या अन्य अजीब गतिविधि के लिए जाँच की है? बस सोच रहा था कि शायद कुछ बिन बुलाए बुरा प्रक्रिया खुद को छिपाते हुए छाया में दुबका हुआ है, और जब भी प्रोमिसिट मोड सेट किया जाता है तो वह चुप हो जाता है?
  • यदि आप tcpdump रनिंग बैकग्राउंड को छोड़ देते हैं, तो क्या यह समस्या वापस आएगी?

आशा है कि ये आपकी मदद करेगा।


1
आपके जवाब के लिए धन्यवाद! मैंने वास्तव में आपके द्वारा संदर्भित कुछ आदेशों का आउटपुट एकत्र किया है। अब वे प्रश्न ( gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c ) से भी जुड़े हुए हैं । अजीब बात यह है कि जिस तरह से कम सॉकेट्स की सूचना मिलती है ss, lsofऔर netstat"सॉकेट्स यूज्ड" की तुलना में /proc/net/sockstat। केवल कुल गणना (जो उस फ़ाइल से सिर्फ पढ़ने के लिए प्रतीत होती है) ही है। iptablesरन हैं, लेकिन विशेष नियम नहीं हैं (देखें देखें), मैंने खुद को प्रोमिसस मोड सेट करने या लगातार tcpdump चलाने की कोशिश नहीं की है। अगली बार ऐसा करेंगे।
Stephan Klein

मैंने ss -aepiअपने आउटपुट कलेक्शन के आउटपुट को जोड़ा है : gist.github.com/privatwolke/… - अफसोस की बात यह है कि जब ऐसा हो रहा है तो कुछ भी ठीक नहीं है। वास्तव में, घटना से पहले नवीनतम प्रविष्टि 5 दिन पुरानी है।
Stephan Klein

जोड़ा गया dmesg / journalctl -kउत्पादन।
स्टीफन क्लेन

मैंने सत्यापित किया है कि ip link set eth0 promisc onअकेले मशीन को एक उपयोगी स्थिति में पुनर्स्थापित नहीं करता है।
स्टीफन क्लेन

हैलो, क्या आपने इस साइट के अन्य प्रश्न पर एक नज़र डाली है? serverfault.com/questions/614453/… ऐसा लगता है कि आप xfrm4 डेस्ट कैश को कम कर रहे हैं। आप इसे इस कर्नेल सेटिंग के साथ बढ़ा सकते हैं: xfrm4_gc_thresh - INTEGER The threshold at which we will start garbage collecting for IPv4 destination cache entries. At twice this value the system will refuse new allocations. जहाँ तक मैं बता सकता हूँ कि यह IPsec से संबंधित है, जो कि आप यहाँ नहीं चल रहे हैं, हालाँकि।
पेड्रो पेरेज़

0

यह लिनक्स कर्नेल में hv_netsvc ड्राइवर के बग के कारण हुआ था। हम इसे Microsoft डेवलपर के साथ हल कर सकते हैं और अपस्ट्रीम को ठीक करने में कामयाब रहे।

मैं प्रतिबद्ध संदेश यहाँ उद्धृत करूँगा क्योंकि यह समस्या को बहुत अच्छी तरह से बताता है:

जब RX बफर संदेशों के कारण रिंग बफर लगभग पूर्ण हो जाता है, तो एक TX पैकेट "कम वॉटरमार्क" तक पहुंच सकता है और कतार बंद होने का कारण बन सकता है। यदि TX समापन कतार रोक से पहले आता है, तो वेकअप छूट सकता है।

यह पैच EAGAIN और सफलता दोनों मामलों को कवर करने के लिए अंतिम लंबित पैकेट के लिए चेक को स्थानांतरित करता है, इसलिए आवश्यक होने पर कतार मज़बूती से जागेगी।

भविष्य के संदर्भ के लिए, इसे ठीक करने वाली प्रतिबद्धता https://github.com/torvalds/linux/commit/6d9cfab853ca60b2f77b5e4c40443216988cba1f है

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