मैं इस प्रश्न में एकल सर्वर से 40Gbps देने के लिए सर्वोत्तम संभव कॉन्फ़िगरेशन / हार्डवेयर का पता लगाना चाहता हूं।
परिस्थिति
हमारे पास एक वीडियो शेयर प्रॉक्सी सर्वर है जो इसके पीछे धीमे स्टोरेज सर्वर से चोटियों को हटाता है। सभी ट्रैफ़िक केवल HTTP है। सर्वर एक रिवर्स प्रॉक्सी (सर्वर पर कैश नहीं की गई फ़ाइलें) और एक वेबसर्वर (स्थानीय ड्राइव पर संग्रहीत फ़ाइलें) के रूप में कार्य करता है।
वर्तमान में कुछ 100TB फाइलें और बैकएंड स्टोरेज सर्वर पर बढ़ रहे हैं।
कैशिंग तंत्र को स्वतंत्र रूप से कार्यान्वित किया जाता है और यह प्रश्न अपने आप में कैशिंग के बारे में नहीं है क्योंकि यह बहुत अच्छी तरह से काम करता है - वर्तमान में 14Gbps बचाता है, बैकएंड सर्वरों को केवल 2Gbps में पास करता है। इसलिए कैश का उपयोग अच्छा है।
लक्ष्य
एक मशीन से 40Gbps या उससे भी अधिक थ्रूपुट प्राप्त करें।
हार्डवेयर 1
HW: सुपरमाइक्रो SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), 16GB DDR4 RAM, 2x सुपरमाइक्रो 10G STGN-i1S (LACP L3 + 4)
SSD: 1x 512GB Samsung, 2x 500GB Samsung, 2x480GB Intel 535, 1x 240GB Intel S3500
सिस्टम:
- irqbalancer बंद हो गया
- प्रत्येक इंटरफ़ेस के लिए set_irq_affinity (ixgbe ड्राइवर टैरबॉल में स्क्रिप्ट के माध्यम से)
- ixgbe-4.3.15
- मैं / हे अनुसूचक समय सीमा
- iptables खाली (अनलोड किए गए मॉड्यूल)
- फ़ाइल सिस्टम: XFS
nginx:
- भेज देना
- aio धागे
- Directio 1M
- tcp_nopush पर
- tcp_nodelay पर
जैसा कि रेखांकन पर देखा जाता है, हम 12.5Gbps पुश करने में सक्षम थे। दुर्भाग्य से सर्वर अप्रतिसादी था।
2 चीजें हैं जिन्होंने मेरा ध्यान खींचा। पहले एक IRQ की उच्च राशि है। इस मामले में मैं दुर्भाग्य से / खरीद / व्यवधान से रेखांकन नहीं है। दूसरी बात थी हाई सिस्टम लोड, जो मुझे लगता है कि kswapd0 के कारण 16G RAM के साथ काम करने में समस्याएँ आ रही थीं।
हार्डवेयर 2
HW: सुपरमाइक्रो SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), 128GB DDR4 रैम, 2x सुपरमाइक्रो 10G STGN-i1S
SSD, सिस्टम कॉन्फ़िगरेशन हार्डवेयर के समान है। Nginx पर Sendfile है (aio / sendfile आगे की तुलना में)।
यह बेहतर लगता है, इसलिए अब हमारे पास एक सर्वर है, जो चोटियों में काम करता है, हम कुछ अनुकूलन कर सकते हैं।
Sendfile बनाम aio थ्रेड्स
मैंने Sendfile को अक्षम करने और इसके बजाय aio थ्रेड्स का उपयोग करने का प्रयास किया।
- भेज देना
- aio धागे
- Directio 1M (जो हमारे पास मौजूद सभी फाइलों से मेल खाता है)
बनाम
- पर भेज देना
फिर 15:00 बजे मैंने वापस सेंडफाइल और फिर से लोड किए गए नग्नेक्स पर स्विच किया (इसलिए मौजूदा कनेक्शन को खत्म करने में थोड़ा समय लगा)। यह अच्छा है कि ड्राइव उपयोग (iostat द्वारा मापा गया) नीचे चला गया। यातायात पर कुछ भी नहीं बदला है (दुर्भाग्य से zabbix ने बंधन 0 से डेटा एकत्र नहीं करने का फैसला किया है)।
Sendfile चालू / बंद
बस भेजने को चालू / बंद करने की कोशिश की। पुनर्निर्धारित व्यवधान के अलावा कुछ भी नहीं बदला है।
irqbalancer एक सर्वर / cron / अक्षम के रूप में
जैसा कि @lsd ने उल्लेख किया है कि मैंने irqbalancer को cron के माध्यम से निष्पादित करने के लिए सेटअप करने की कोशिश की:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
दुर्भाग्य से यह मेरे मामले में मदद नहीं की। नेटवर्क कार्डों में से एक ने अजीब व्यवहार करना शुरू कर दिया:
मुझे यह नहीं मिला कि ग्राफ़ में क्या गलत था और जैसा कि अगले दिन फिर से हुआ, मैंने सर्वर में लॉग इन किया और देखा कि एक कोर 100% (सिस्टम उपयोग) पर था।
मैंने एक सेवा के रूप में असमानता शुरू करने की कोशिश की, परिणाम अभी भी वही था।
तब मैंने set_irq_affinity स्क्रिप्ट का उपयोग करने का निर्णय लिया और इसने समस्या को तुरंत ठीक कर दिया और सर्वर ने 17Gbps को फिर से धकेल दिया।
हार्डवेयर 3
हमने नए हार्डवेयर में अपग्रेड किया: 2U 24 (+2) ड्राइव चेसिस (6xSFF), 2x Xeon E5-2620v4, 64GB DDR4 रैम (4x16GB मॉड्यूल्स), 13x SSD, 2x वर्मिस्रो (इंटेल चिप के साथ) नेटवर्क कार्ड। नए सीपीयू ने प्रदर्शन में बहुत सुधार किया।
वर्तमान सेटअप बना हुआ है - सेंडफाइल, आदि। केवल अंतर यह है कि हम केवल एक ही सीपीयू को दोनों नेटवर्क कार्ड (set_irq_affinity स्क्रिप्ट के माध्यम से) को संभालने देते हैं।
20Gbps की सीमा पूरी हो चुकी है।
अगला लक्ष्य? 30Gbps।
प्रदर्शन में सुधार करने के लिए मुझे विचारों पर शूट करने के लिए स्वतंत्र महसूस करें। मुझे इसका लाइव परीक्षण करने और यहां कुछ भारी रेखांकन साझा करने में खुशी होगी।
कोई विचार कैसे सीपीयू पर सॉफ्टरक्यू की बड़ी मात्रा से निपटने के लिए?
यह क्षमता योजना के बारे में सवाल नहीं है - मेरे पास पहले से ही हार्डवेयर और यातायात है। मैं हमेशा ट्रैफ़िक को कई सर्वरों में विभाजित कर सकता हूं (जो मुझे भविष्य में वैसे भी करना होगा) और पैसे के साथ समस्या को ठीक करना। हालांकि यह एक वास्तविक लाइव परिदृश्य में सिस्टम अनुकूलन और प्रदर्शन ट्यूनिंग के बारे में एक सवाल है।