2012-07-29 33 views
10

पर FIN ACK (~ 500ms) में देरी भेजता है मेरे पास एक node.js क्लाइंट (10.177.62.7) सर्वर से http Rest सेवा से कुछ डेटा का अनुरोध (10.177.0.1) है। क्लाइंट बस node.js http.request() विधि (एजेंट = झूठी) का उपयोग कर रहा है। क्लाइंट उबंटू 11.10 बॉक्स पर है।क्लाइंट सर्वर

ग्राहक 475ms के बाद एफआईएन एसीके क्यों भेजता है? इतने आहिस्ता क्यो? उसे तुरंत एफआईएन एसीके भेजना चाहिए। मेरे पास इस तरह की कई स्थितियां हैं। पूरे ट्रैफ़िक का लगभग 1% देरी एफआईएन एसीके के साथ अनुरोध है।

क्लाइंट पर सीपीयू निष्क्रिय लगभग 99% है, इसलिए सीपीयू को कम नहीं किया जा रहा है।

यह कैसे डिबग करने के लिए? यह क्या हो सकता है? क्या कोई sysctl विकल्प है जिसे मुझे ट्यून करने की आवश्यकता है?

स्क्रीनशॉट पर दूसरा कॉलम पैकेट के बीच विलुप्त समय है।

Link to bigger picture.

enter image description here

+0

मैंने HTTP के बारे में मेरा उत्तर हटा दिया क्योंकि यह निश्चित रूप से अस्वीकार कर दिया गया था। यद्यपि किसी अन्य जवाब के बारे में सोच नहीं सकते हैं। जैसे ही सॉकेट बंद हो जाता है, एफआईएन बाहर जाना चाहिए। –

+0

@AlanCurry लेकिन * एफआईएन/एसीके * केवल तभी बाहर निकल जाएगा जब ग्राहक ने आने वाली एफआईएन पढ़ ली है और सॉकेट को बंद करने का फैसला किया है, जो कि किसी भी समय ले सकता है। यह node.js का व्यवहार है, टीसीपी/आईपी स्टैक नहीं। – EJP

+0

निश्चित रूप से, लेकिन अगर यह किसी http क्लाइंट लाइब्रेरी में कॉल के बीच में है, तो यह जीवित नहीं है, और सीपीयू लोड 1% है, ईओएफ पढ़ने के बाद सॉकेट को बंद करने में कितना समय लग रहा है? –

उत्तर

4

यह व्यवहार RFC1122 TCP stack की देरी एसीके सुविधा है।

आम तौर पर आप अपने Linux TCP socketdisable delayed ACK करने के लिए TCP_QUICKACK विकल्प जोड़ने चाहिए, लेकिन मुझे लगता है कि (मैं केवल TCP_NODELAY विकल्प के लिए socket.setNoDelay देखा था) जावास्क्रिप्ट Node.js API से स्पष्ट नहीं है।

तो system-wide change on TCP stack लागू करने का आपका विचार अच्छा लगता है लेकिन मुझे इस सॉकेट विकल्प व्यवहार से मेल खाने वाले sysctl नहीं मिला। यहां एक और full list with explanation है।

+0

यह सही उत्तर की तरह दिखता है जब तक ओपी ने अधिक जानकारी नहीं दी है –

+0

आपके उत्तर के लिए धन्यवाद! मेरे पास कुछ अतिरिक्त प्रश्न हैं। क्या यह एफआईएन एसीके या केवल "अकेले" एसीके के लिए मान्य है। क्या आप बता सकते हैं कि क्यों कर्नेल ने एफआईएन/एसीके में देरी की। टीसीपीफ़्लो डेटा में सर्वर से आने वाले प्रत्येक पैकेट के बराबर एक एसीके है। कर्नेल ने ग्राहक एफआईएन/एसीके में देरी क्यों की। यह प्रत्येक 'डेटा' पैकेट एसीके भेजने से बच सकता है। लेकिन यह एफआईएन/एसीके में देरी का चयन करता है? क्या यह संभव है? – Tereska

+0

कृपया आरएफसी 1122 के 4.2.3.2 खंड को पढ़ें ... यह एफआईएन पैकेट के लिए विशिष्ट नहीं है। मैं आपसे सहमत हूं कि डेटा के बिना एफआईएन + एसीके पैकेट में देरी करने का कोई कारण नहीं है। मैं आपको एलकेएमएल पर लिनक्स कर्नेल टीसीपी टीम या विलंबित एसीके तर्क कार्यान्वयन के लिए ओपन सोर्स कोड से संपर्क करने के लिए आमंत्रित करता हूं।शायद उस अनुकूलन से बचने के लिए एक अनुकूलन किया जा सकता है और कम से कम एक नया sysctl स्विच किया जा सकता है। –