जैसा कि प्रश्न शीर्षक से पता चलता है, मुझे एक स्वीकार्य प्रदर्शन प्राप्त करने के लिए यह जानने के लिए एक कठिन समय है कि मेरे आवेदन में क्या सुधार किया जा सकता है (या ओएस, ऑबंटू में ट्यून किया गया है)। लेकिन पहले मैं वास्तुकला की व्याख्या करूँगा:
फ्रंट-एंड सर्वर 8 कोर मशीन है जिसमें 8 गीगा रैम उबंटू 12.04 चल रहा है। एप्लिकेशन को पूरी तरह से जावास्क्रिप्ट में लिखा गया है और नोड.जेएस वी 0.8.22 में चला जाता है (जैसा कि कुछ मॉड्यूल नोड के नए संस्करणों पर शिकायत करते हैं) मैं पोर्ट 80 और 443 से 8 नोड श्रमिकों के लिए प्रॉक्सी HTTP ट्रैफ़िक में nginx 1.4 का उपयोग करता हूं जो प्रबंधित हैं और नोड क्लस्टर एपीआई का उपयोग शुरू कर दिया। मैं वेबसैट कनेक्शन को संभालने के लिए सॉकेट.आईओ 0.9.14 के नवीनतम संस्करण का उपयोग करता हूं, जिस पर मैंने केवल वेबसैकेट और xhr-polling को उपलब्ध ट्रांसपोर्ट के रूप में सक्षम किया है। इस मशीन पर मैं रेडिस (2.2) का एक उदाहरण भी चलाता हूं
मैं 4g RAM और 2 कोर के साथ mongodb (3.6) पर एक दूसरे सर्वर पर लगातार डेटा (जैसे उपयोगकर्ता और स्कोर) संग्रहीत करता हूं।
एप्लिकेशन कुछ महीनों से उत्पादन में है (यह कुछ सप्ताह पहले तक एक ही बॉक्स पर चल रहा है) और इसे प्रति दिन लगभग 18k उपयोगकर्ताओं द्वारा उपयोग किया जा रहा है। यह हमेशा एक मुख्य मुद्दे के अलावा बहुत अच्छी तरह से काम करता है: प्रदर्शन में गिरावट। उपयोग के साथ, प्रत्येक प्रक्रिया द्वारा उपयोग किए जाने वाले सीपीयू की मात्रा तब तक बढ़ती है, जब तक कि यह कार्यकर्ता (जो अब और अनुरोधों की सेवा नहीं करेगा) को स्थिर करता है। मैंने अस्थायी रूप से इसे हल कर दिया है कि प्रत्येक कार्यकर्ता द्वारा उपयोग में आने वाले सीपीयू की जाँच हर मिनट में की जाती है, और यदि यह 98% तक पहुँच जाता है तो इसे फिर से शुरू किया जाता है। तो यहाँ समस्या मुख्य रूप से सीपीयू है, न कि रैम। RAM एक मुद्दा नहीं है क्योंकि मैंने सॉकेट के लिए अपडेट किया है। 0.9.14 (पहले का संस्करण मेमोरी लीक कर रहा था) इसलिए मुझे संदेह है कि यह एक मेमोरी लीकिंग मुद्दा है, खासकर क्योंकि अब यह सीपीयू है जो काफी तेज़ी से बढ़ता है ( मुझे प्रत्येक कार्यकर्ता को एक दिन में लगभग 10-12 बार पुनरारंभ करना होगा!)। उपयोग में रैम ईमानदार होने के साथ-साथ बढ़ती है, लेकिन बहुत धीरे-धीरे, उपयोग के हर 2-3 दिनों में 1 टमटम, और अजीब बात यह है कि यह तब भी जारी नहीं किया जाता है जब मैं पूरी तरह से पूरी तरह से आवेदन को पुनरारंभ करता हूं। यह केवल तभी जारी किया जाता है जब मैं सर्वर को रिबूट करता हूं! यह मैं वास्तव में नहीं समझ सकता ...
मैंने अब नोडफ़्ले की खोज की है जो आश्चर्यजनक है, इसलिए मैं अंत में देख सकता हूं कि मेरे उत्पादन सर्वर पर क्या हो रहा है, और मैं कुछ दिनों से डेटा एकत्र कर रहा हूं। यदि कोई चार्ट देखना चाहता है तो मैं आपको एक्सेस दे सकता हूं, लेकिन मूल रूप से मैं देख सकता हूं कि मेरे पास 80 और 200 समवर्ती कनेक्शन हैं! मैं हजारों अनुरोधों को संभालने के लिए नोड.जेएस की उम्मीद कर रहा था, सैकड़ों नहीं। साथ ही http ट्रैफ़िक के लिए औसत प्रतिक्रिया समय 500 और 1500 मिलीसेकंड के बीच तैरता है जो मुझे लगता है कि वास्तव में बहुत कुछ है। इसके अलावा, ऑनलाइन 1300 उपयोगकर्ताओं के साथ इस क्षण में, यह "ss -s" का आउटपुट है:
Total: 5013 (kernel 5533)
TCP: 8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0
Transport Total IP IPv6
* 5533 - -
RAW 0 0 0
UDP 0 0 0
TCP 4950 4948 2
INET 4950 4948 2
FRAG 0 0 0
जो दिखाता है कि मुझे टाइमवेइट में बहुत सारे बंद कनेक्शन मिले हैं। मैंने अधिकतम खुली फ़ाइलों को 999999 तक बढ़ा दिया है, यहाँ ulimit -a का आउटपुट है:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63724
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63724
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
इसलिए मुझे लगा कि समस्या http ट्रैफ़िक पर हो सकती है कि कुछ कारणों से उपलब्ध पोर्ट / सॉकेट्स (?) को संतृप्त करता है, लेकिन एक बात मुझे समझ में नहीं आती है: जब मैं श्रमिकों को फिर से शुरू करता हूं, और सभी ग्राहक कुछ सेकंड के भीतर पुन: कनेक्ट हो जाते हैं, श्रमिक के सीपीयू पर लोड 1% तक कम हो जाता है और लगभग 1 घंटे (पीक समय पर) के बाद संतृप्त होने तक अनुरोधों को ठीक से सेवा करने में सक्षम है?
मैं मुख्य रूप से एक जावास्क्रिप्ट प्रोग्रामर हूं, एक एसआईएस एडमिन नहीं, इसलिए मुझे नहीं पता कि मुझे अपने सर्वर से निपटने के लिए कितना भार उठाना चाहिए, लेकिन निश्चित रूप से यह प्रदर्शन नहीं कर रहा है जैसा कि इसे करना चाहिए। आवेदन अन्यथा स्थिर है और यह आखिरी समस्या मुझे ऐप के मोबाइल संस्करणों को जहाज करने से रोक रही है जो तैयार हैं, जाहिर है कि वे अधिक लोड लाएंगे और अंततः पूरी चीज़ को क्रैश कर देंगे!
उम्मीद है कि कुछ स्पष्ट है कि मैं गलत कर रहा हूं, और कोई इसे स्पॉट करने में मदद करेगा ... मुझे और अधिक जानकारी के लिए पूछने के लिए स्वतंत्र महसूस हो रहा है, और मुझे प्रश्न की लंबाई के लिए खेद है, लेकिन मुझे विश्वास था कि ... अग्रिम में धन्यवाद!
top
जब सीपीयू का उपयोग 100% के करीब हो तो आप क्या देखते हैं ?