2013-11-20 4 views
5

हमारे (लिनक्स) सर्वर ने {active, once} को अपने सॉकेट के साथ विकल्प का उपयोग किया, और वहां {tcp_error, Socket, etimedout} संदेश पॉप-अप हुए। मुझे पता है कि यह खराब नेटवर्क स्थितियों के कारण हो सकता है, लेकिन इसके बारे में कुछ अजीब बात थी।एक सक्रिय सॉकेट का '{tcp_error, सॉकेट, etimedout} संदेश कहां से आता है?

टीसीपी keepalive सिस्टम-वाइड सक्षम किया गया था हमारे मशीन पर, और वास्तविक विकल्प मान रहे थे:

net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_keepalive_probes = 9 
net.ipv4.tcp_keepalive_intvl = 75 

सॉकेट में कम से कम 20 मिनट में समय-समाप्त होगा जिसका मतलब है, मेरा मानना ​​है। लेकिन आश्चर्यजनक रूप से, हमारी प्रक्रियाओं को 10 सेकंड से भी कम समय में {tcp_error, Socket, etimedout} प्राप्त हुआ।

मैं सोच रहा था, काउंटर इसे gen_tcp:send(...) संचालन द्वारा ट्रिगर किया जाएगा? और फिर मुझे यह असंभव लगता है क्योंकि प्रेषण परिचालन सभी तुल्यकालिक थे, वे तत्काल विफल हो जाएंगे।

तो, मेरा सवाल यह है कि etimedout संदेश कहां से आया था? या यह वास्तव में क्या ट्रिगर किया? मैंने एरलांग वीएम के सी स्रोत के आसपास गुमराह किया, खासकर inet_drv.c, लेकिन अभी तक कोई निष्कर्ष नहीं है।

धन्यवाद।

उत्तर

3

एक टीसीपीडम्प कैप्चर ने दिखाया कि यह टीसीपी रीट्रांसमिशन से टाइमआउट घटना थी।

हमारे सर्वर मशीन 5 के लिए /proc/sys/net/ipv4/tcp_retries2 सेट था, जो, 5 पुनर्संचरण में वियोग के लिए नेतृत्व करते हुए यह मान डेवलपर मशीनों पर 15 चूक है, तो हम समस्या स्थानीय स्तर पर पुन: पेश नहीं कर सका होगा।

gen_tcp:send(...) (अन्य भाषाओं में या समकक्ष एपीआई) से लौटते ही मतलब है कि पैकेट टीसीपी ढेर द्वारा स्वीकार किया जाता है, लेकिन कोई गारंटी नहीं कि यह सहकर्मी तक पहुंच सकता है, और त्रुटियों को उबारने सकता है जब आप अन्य पर अवरुद्ध कर रहे हैं संचालन।

टीसीपी रीट्रांसमिशन here के बारे में कुछ संक्षिप्त विवरण मिला।

संबंधित मुद्दे