मैंने हाल ही में उत्पादन में एक समस्या पर नज़र रखने में कुछ समय बिताया है, जहां एक डेटाबेस सर्वर गायब होने 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_time
2 घंटे के डिफ़ॉल्ट का मतलब है जब हम एक दूरस्थ होस्ट के लिए प्रतिक्रिया की प्रतीक्षा कर रहे हैं, हम अपने कनेक्शन को सत्यापित करने के लिए एक रखने योग्य जांच शुरू करने से पहले 2 घंटे तक धैर्यपूर्वक इंतजार करेंगे। और फिर, यदि दूरस्थ होस्ट एक सुधारात्मक जांच का जवाब नहीं देता है, तो हम उन रखवाली जांच को 9 बार ( tcp_keepalive_probes
), 75 सेकंड के अलावा ( tcp_keepalive_intvl
), फिर से निकालते हैं , ताकि कनेक्शन तय होने से 11 मिनट पहले एक अतिरिक्त मौत हो जाए।
यह उस चीज से मेल खाता है जो मैंने मैदान में देखा है: उदाहरण के लिए, यदि मैं psql
एक दूरस्थ PostgreSQL उदाहरण से जुड़ा एक सत्र शुरू करता हूं, तो कुछ क्वेरी के जवाब में प्रतीक्षा कर रहा है, जैसे।
SELECT pg_sleep(30);
और फिर रिमोट सर्वर से एक भयानक मौत (जैसे उस मशीन पर ट्रैफ़िक ड्रॉप) मर गया है, मैं देखता हूं कि मेरा psql सत्र 2 घंटे और 11 मिनट तक इंतजार कर रहा है, इससे पहले कि उसका कनेक्शन मृत है। जैसा कि आप कल्पना कर सकते हैं, ये डिफ़ॉल्ट सेटिंग्स कोड के लिए गंभीर समस्याएं पैदा करती हैं, जिनके बारे में हम डेटाबेस से बात कर रहे हैं, कहते हैं, एक डेटाबेस विफलता घटना। इन गांठों को मोड़ने से बहुत मदद मिली है! और मैं देख रहा हूं कि इन चूक को समायोजित करने की सिफारिश करने में मैं अकेला नहीं हूं ।
तो मेरे सवाल हैं:
- चूक इस तरह कब तक रही?
- इन टीसीपी सेटिंग्स को डिफ़ॉल्ट बनाने के लिए मूल तर्क क्या था?
- क्या कोई लिनक्स डिस्ट्रोस इन डिफ़ॉल्ट मूल्यों को बदलता है?
और इन सेटिंग्स के लिए तर्क पर किसी भी अन्य इतिहास या परिप्रेक्ष्य की सराहना की जाएगी।
TCP_KEEPIDLE
, TCP_KEEPCNT
और TCP_KEEPINTVL
।
TCP_USER_TIMEOUT
सेट करने के बजाय सॉकेट विकल्प को निर्दिष्ट करना भी संभव है net.ipv4.tcp_retries2
। बेशक कई एप्लिकेशन (जैसे कि यहां मेरे उदाहरण में PostgreSQL) TCP_USER_TIMEOUT
अभी तक समर्थन नहीं करते हैं ।