2013-06-22 11 views
13

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

express = require('express') 
http = require('http') 

app = express() 
server = http.Server(app) 

io = require('socket.io').listen(server) 

io.sockets.on('connection', function(sock){ 
    sock.on('perf', function(data, cb){ 
     cb([Date.now()]); //respond with the current time 
    }) 
}) 

app.get('/', function(req, res){ 
    res.header("Access-Control-Allow-Origin", "*") 
    res.header("Access-Control-Allow-Methods", "HEAD,GET,PUT,POST,DELETE") 
    res.header("Access-Control-Allow-Headers", "X-Requested-With") 

    res.end(JSON.stringify([Date.now().toString()])); //http equivalent of perf function 
}) 

server.listen(process.env.PORT || 6655, function(){ 
    console.log('listening now') 
}) 

मैं सॉकेट के साथ एक सरल खाली HTML पृष्ठ था:

वैसे भी, इस परीक्षण (और सुनिश्चित करें कि यह मेरे खेल के कोड की वजह से नहीं था बनाने के) के लिए, मैं एक न्यूनतम परीक्षण मामले का निर्माण किया। io जो समय-समय पर perf घटना और समय को कॉलबैक के लिए कितना समय लगेगा।

graph showing lag spike

ध्यान दें कि बार लंबाई समय की राशि, नहीं रैखिक मात्रा का वर्गमूल का प्रतिनिधित्व करता है: और यह अभी भी एक ही बात को दर्शाता है।

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

अजीब बात यह है कि यदि आप इसे एक से अधिक ब्राउज़र विंडो और विभिन्न ब्राउज़रों में खुल, वहाँ विभिन्न ब्राउज़रों के बीच एक संबंध है (और तथ्य यह है कि यह पूरी तरह से अनुपस्थित या कुछ सर्वर पर काफी कम हो जाते है), जो लगता है हो रहा है है यह इंगित करने के लिए कि यह एक सर्वर पक्ष घटना है। हालांकि, कुछ ब्राउज़र के लिए विलंबता स्पाइक्स होती हैं लेकिन अन्य नहीं, और एक ही सत्र के दो क्रोम विंडोज़ वस्तुतः सटीक डुप्लीकेट होते हैं, जो बताते हैं कि यह ऐसा कुछ है जो स्थानीय रूप से होता है (प्रति कंप्यूटर, या प्रति ब्राउज़र, नेटवर्किंग वार)।

बाएं से दाएं करने के लिए: Chrome गुप्त, क्रोम (नियमित), फायरफॉक्स, क्रोम (नियमित)

charts on four windows

वैसे भी, इस महीने के लिए मुझे भ्रमित किया गया है और मैं वास्तव में क्या समझ करना चाहते हैं इसका कारण बन रहा है और इसे कैसे ठीक किया जाए।

+1

मैं उत्सुक हूं कि अगर आप सीधे सर्वर पर स्थानीय कनेक्शन खोल सकते हैं (शायद फ़ैंटोमज की तरह कुछ) और उसी माप को निष्पादित करें, यदि आप समान स्पाइक देखेंगे या नहीं। मैं भी उत्सुक हूं कि आप किस ब्राउज़र का उपयोग कर रहे हैं और क्या कोई फ़्लैश, लंबे मतदान या आईफ्रेम पर वापस आ रहा है। ऐसा लगता है कि आप सत्रों के बिना एक्सप्रेस चला रहे हैं, इसलिए यह सत्र से संबंधित जीसी या ऐसा कुछ नहीं प्रतीत होता है, और आप सकारात्मक हैं कि सर्वर पुनरारंभ या कुछ भी नहीं कर रहा है (जो संभवतः सभी ब्राउज़रों के लिए स्पाइक्स दिखाएगा एक ही समय, तो शायद नहीं, लेकिन सिर्फ पूछने के लिए)। – hoonto

+0

मुझे लगता है कि आप पहले ही सर्वर आंकड़ों की निगरानी कर रहे हैं? उत्सुकता है कि एक ही समय में स्मृति या सीपीयू में कोई सहसंबंधित स्पाइक्स या बूंदें हैं। यदि आपके पास डेटासेंटर तक पहुंच है, तो आप वहां स्थानीय स्विच में प्लग कर सकते हैं और अधिकांश नेटवर्क हस्तक्षेप को खत्म कर सकते हैं, लेकिन शायद यह एक विकल्प नहीं है ... अगर वे डेटा के अंदर से सॉकेट.ओ निगरानी सेवा की पेशकश करते हैं तो यह अच्छा होगा। केंद्र। – hoonto

+1

असल में, आप एक स्थानीय सॉकेट.ओ नोड क्लाइंट लिख सकते हैं और इसे उसी सर्वर पर स्थानीय रूप से चला सकते हैं, और उसे भी माप सकते हैं। आपको स्पैम करने के लिए खेद है, प्रदर्शन समस्याएं एक घास के मैदान में सुई की तरह हो सकती हैं, इसलिए बस कुछ भी फेंकने की कोशिश कर रहा हूं जिसके बारे में मैं सोच सकता हूं कि समस्या को कुछ विशिष्ट क्षेत्र में कम करने में मदद मिल सकती है। – hoonto

उत्तर

0

मुझे पता है कि यह अजीब लग सकता है लेकिन क्या आपको लगता है कि यह नोड के साथ कोई समस्या नहीं है लेकिन ओएस सेटिंग के साथ। क्या आपने अपनी फाइल हैंडल की जांच की है और ओएस सॉकेट में दिखाए जा रहे कनेक्शन की संख्या है? क्या आपने यह भी सुनिश्चित किया है कि ओएस में सॉकेट टाइमआउट पर्याप्त कम है? मैंने दूसरे कोड के साथ समान ध्वनि प्रदर्शन समस्याओं में भाग लिया है और यह ओएस बन गया है और कोड नहीं। पैकेज को भी जांचें और देखें कि सॉकेट पर खुले अनुमत कनेक्शन के लिए क्या है। मैंने नोड कोड को नहीं देखा है, लेकिन जावा में http क्लाइंट लाइब्रेरी के साथ एक समान समस्या में भाग गया। एप्लिकेशन का बैक अप लिया गया था और कनेक्शन की संख्या के साथ यह केवल कॉन्फ़िगरेशन समस्या थी।

1

मुझे लगता है कि आपके पास सीपीयू या रैम समस्या है या नहीं।

एकमात्र चीज जो "आश्चर्यजनक" तरीके से नोड को धीमा कर सकती है वह कचरा कलेक्टर है - यह देखने के लिए --trace* के साथ अपना नोड चलाने का प्रयास करें। (node --v8-options देखें।)

मैं व्यक्तिगत रूप से मानता हूं कि आपको इससे कुछ भी पता नहीं है, क्योंकि - और यह सिर्फ मेरी भावना है - यह मुद्दा कहीं और है।

500ms गुणा की उस पूर्ण देरी के साथ मुझे लगता है कि आपके पास एक पैकेट नुकसान है। आप ifconfig के साथ जांच सकते हैं यदि यह एक सामान्य मुद्दा है और फिर tcpdump पैकेट्स और देखें कि वे पुनः प्रेषण करते हैं या नहीं।

+0

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

0

यह कारण आप नागेल के एल्गोरिदम के कारण क्यों देखते हैं। यह I/O पर उपयोग किया जाने वाला एक एल्गोरिदम है जो थोड़ी देर के लिए डेटा बफर करता है और फिर डेटा के बड़े हिस्से भेजता है। इसका उपयोग आपको ट्रांसमिशन (सॉकेट में) बचाने के लिए किया जाता है। आप इसके बारे में अधिक पढ़ सकते हैं http://en.wikipedia.org/wiki/Nagle's_algorithm

नागल के एल्गोरिदम को अक्षम करने के लिए (अच्छा जब आप जितनी जल्दी हो सके छोटे अनुरोधों को भेजना चाहते हैं) तो आप socket.setNoDelay (true) कर सकते हैं; यदि आप net.Socket() का उपयोग कर रहे हैं। Socket.io के मामले में मेरा मानना ​​है कि नागल पहले से ही Websockets के लिए डिफ़ॉल्ट रूप से अक्षम है लेकिन अन्य प्रोटोकॉल के लिए जरूरी नहीं है। मैं नेट के साथ एक परीक्षण चलाने की सिफारिश करता हूं। Node.js से सॉकेट, नागल को अक्षम करें और देखें कि आपको क्या मिलता है।

+3

नागल केवल प्रति कनेक्शन आधार पर काम करता है और छोटे पैकेजों को बड़े पैमाने पर जोड़ता है। यह मुद्दा यहां नहीं हो सकता क्योंकि आपके पास प्रत्येक कॉल के लिए एक नया कनेक्शन है। जब आप रीयलटाइम स्ट्रीमिंग करते हैं तो नागल केवल एक समस्या बन सकता है। – CFrei