इन लिनक्स टीसीपी डिफ़ॉल्ट सेटिंग्स का फैसला कैसे किया गया?


13

मैंने हाल ही में उत्पादन में एक समस्या पर नज़र रखने में कुछ समय बिताया है, जहां एक डेटाबेस सर्वर गायब होने poll()से कनेक्टेड क्लाइंट के लिए 2 घंटे तक की अवधि ( libpq क्लाइंट लाइब्रेरी में कॉल के लिए लंबे समय तक प्रतीक्षा ) का कारण होगा। समस्या में खुदाई, मुझे एहसास हुआ कि इन कर्नेल मापदंडों को समायोजित किया जाना चाहिए ताकि गंभीर टीसीपी कनेक्शन को समय पर देखा जा सके:

net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_retries2 = 15

उपरोक्त चार मान एक उबंटू 12.04 मशीन से हैं, और ऐसा लगता है कि ये डिफॉल्ट वर्तमान लिनक्स कर्नेल डिफॉल्ट से अपरिवर्तित हैं ।

ये सेटिंग्स मौजूदा कनेक्शन को खुला रखने के लिए और पक्षपातपूर्ण जांच के साथ बेहद कंजूस होने के लिए भारी पक्षपाती लगती हैं। AIUI, tcp_keepalive_time2 घंटे के डिफ़ॉल्ट का मतलब है जब हम एक दूरस्थ होस्ट के लिए प्रतिक्रिया की प्रतीक्षा कर रहे हैं, हम अपने कनेक्शन को सत्यापित करने के लिए एक रखने योग्य जांच शुरू करने से पहले 2 घंटे तक धैर्यपूर्वक इंतजार करेंगे। और फिर, यदि दूरस्थ होस्ट एक सुधारात्मक जांच का जवाब नहीं देता है, तो हम उन रखवाली जांच को 9 बार ( tcp_keepalive_probes), 75 सेकंड के अलावा ( tcp_keepalive_intvl), फिर से निकालते हैं , ताकि कनेक्शन तय होने से 11 मिनट पहले एक अतिरिक्त मौत हो जाए।

यह उस चीज से मेल खाता है जो मैंने मैदान में देखा है: उदाहरण के लिए, यदि मैं psqlएक दूरस्थ PostgreSQL उदाहरण से जुड़ा एक सत्र शुरू करता हूं, तो कुछ क्वेरी के जवाब में प्रतीक्षा कर रहा है, जैसे।

SELECT pg_sleep(30);

और फिर रिमोट सर्वर से एक भयानक मौत (जैसे उस मशीन पर ट्रैफ़िक ड्रॉप) मर गया है, मैं देखता हूं कि मेरा psql सत्र 2 घंटे और 11 मिनट तक इंतजार कर रहा है, इससे पहले कि उसका कनेक्शन मृत है। जैसा कि आप कल्पना कर सकते हैं, ये डिफ़ॉल्ट सेटिंग्स कोड के लिए गंभीर समस्याएं पैदा करती हैं, जिनके बारे में हम डेटाबेस से बात कर रहे हैं, कहते हैं, एक डेटाबेस विफलता घटना। इन गांठों को मोड़ने से बहुत मदद मिली है! और मैं देख रहा हूं कि इन चूक को समायोजित करने की सिफारिश करने में मैं अकेला नहीं हूं ।

तो मेरे सवाल हैं:

  • चूक इस तरह कब तक रही?
  • इन टीसीपी सेटिंग्स को डिफ़ॉल्ट बनाने के लिए मूल तर्क क्या था?
  • क्या कोई लिनक्स डिस्ट्रोस इन डिफ़ॉल्ट मूल्यों को बदलता है?

और इन सेटिंग्स के लिए तर्क पर किसी भी अन्य इतिहास या परिप्रेक्ष्य की सराहना की जाएगी।


कुछ प्रासंगिक जानकारी यहां ... tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
Drav Sloan

ध्यान दें कि आप पहले तीन सॉकेट विकल्पों के साथ ग्राहक कोड में प्रति-कनेक्शन को बदल सकते हैं TCP_KEEPIDLE, TCP_KEEPCNTऔर TCP_KEEPINTVL
wnoise

1
@ वास्तव में लिनक्स 2.6.37 के बाद से सिस्टम-वाइड TCP_USER_TIMEOUTसेट करने के बजाय सॉकेट विकल्प को निर्दिष्ट करना भी संभव है net.ipv4.tcp_retries2। बेशक कई एप्लिकेशन (जैसे कि यहां मेरे उदाहरण में PostgreSQL) TCP_USER_TIMEOUTअभी तक समर्थन नहीं करते हैं ।
जोश कुपरश्मिड

जवाबों:


6

RFC 1122 धारा 4.2.3.6 में निर्दिष्ट करता है कि रखने की अवधि दो घंटे से कम नहीं होनी चाहिए।


1
अच्छा है, कि ऊपर खुदाई के लिए धन्यवाद। मुझे लगता है कि ज्यादातर इस सवाल का जवाब देता है कि tcp_keepalive_timeचूक 7200 क्यों है , हालांकि मैं अभी भी अन्य तीन प्रासंगिक सेटिंग्स के लिए मिसाल / स्पष्टीकरण में दिलचस्पी लूंगा।
जोश कुपर्शमीद

मेरे जवाब को
हटाते हुए

1
@ coteyr वैसे भी, मैं इस प्रयास की सराहना करता हूं। IIRC में आपके उत्तर पर एक पेचीदा टिप्पणी थी जो यह बताती थी कि पहले के लिनक्स कर्नेल में डिफ़ॉल्ट 15 मिनट था। मुझे इस बात में दिलचस्पी होगी कि कैसे / क्यों 2 घंटे में बदल गया, या पहली जगह में 15 मिनट के लिए सेट हो गया।
जोश कुपर्शमीद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.