मैं कुछ असामान्य अनुप्रयोग पर काम कर रहा हूं जहां 10k क्लाइंट सभी समय के लिए डेटा को सबमिट करने का प्रयास करते हैं, हर 3 मिनट या उससे भी अधिक समय तक। यह 'अब' कमांड अच्छी तरह सटीक वास्तविक दुनिया में एक बैराज simulates:नोड.जेएस कई समवर्ती कनेक्शनों के साथ संघर्ष कर रहे हैं
ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo"
मैं उबंटू 12.4 पर Node.js उपयोग कर रहा हूँ एक rackspacecloud पर इन प्रस्तुतियाँ इकट्ठा करने के लिए उदाहरण VPS, हालांकि, मैं कुछ बहुत ही दिखाई दे रही है नोड से अजीब व्यवहार, यहां तक कि जब मैं अपने सभी व्यावसायिक तर्क को हटा देता हूं और http अनुरोध को नो-ऑप में बदल देता हूं।
जब परीक्षण लगभग 9 0% हो जाता है, तो यह लंबे समय तक लटकता है। आश्चर्यजनक रूप से, यह 90% पर लगातार होता है - c = n = 10k, 9000 पर; सी = एन = 5 के लिए, 4500 पर; सी = एन = 2 के लिए, 1800 पर। परीक्षण वास्तव में अंततः पूर्ण होता है, अक्सर कोई त्रुटि नहीं। लेकिन एबी और नोड लॉग दोनों परीक्षण चलाने के लगभग 80-90% तक निरंतर प्रसंस्करण दिखाते हैं, फिर पूरा होने से पहले एक लंबा विराम।
जब नोड सामान्य रूप से प्रसंस्करण अनुरोध करता है, तो CPU उपयोग आमतौर पर लगभग 50-70% होता है। लटका अवधि के दौरान, सीपीयू 100% तक चला जाता है। कभी-कभी यह 0 के करीब रहता है। अनियमित सीपीयू प्रतिक्रिया और तथ्य यह है कि यह कनेक्शन की वास्तविक संख्या (केवल% पूर्ण) से असंबंधित प्रतीत होता है, मुझे कचरा कलेक्टर पर संदेह नहीं है।
मैंने स्थानीयहोस्ट पर और रिमोट सर्वर पर चल रहे 'ab' को आजमाया है - एक ही प्रभाव।
मुझे टीसीपी स्टैक से संबंधित कुछ संदेह है, संभवतः समापन कनेक्शन शामिल है, लेकिन मेरे कॉन्फ़िगरेशन परिवर्तनों में से कोई भी मदद नहीं करता है। मेरे परिवर्तन:
- ulimit -n 999999
- जब मैं सुन(), मैं बैकलॉग 10000 करने के लिए सेट
sysctl परिवर्तन कर रहे हैं:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_orphans = 20000
net.ipv4.tcp_max_syn_backlog = 10000
net.core.somaxconn = 10000
net.core.netdev_max_backlog = 10000
मैं भी देखा है कि मुझे यह संदेश कर्नेल लॉग में प्राप्त होता है:
TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters.
मैं इस संदेश से परेशान हूं क्योंकि टीसीपी बैकलॉग कतार कभी भी अतिप्रवाह नहीं होने के लिए पर्याप्त गहरी होनी चाहिए। यदि मैं सिंक कुकीज़ अक्षम करता हूं तो "कुकीज़ भेजना" जाता है "कनेक्शन छोड़ना"।
मुझे लगता है कि यह किसी प्रकार का लिनक्स टीसीपी स्टैक ट्यूनिंग समस्या है और मैंने नेट पर जो कुछ भी पा सकता है उसके बारे में पढ़ा है। मैंने जो कुछ भी कोशिश नहीं की है, वह कोई फर्क नहीं पड़ता। कोई सलाह?
अद्यतन: व्यवहार में कोई बदलाव के साथ 50 के लिए सुनो() बैकलॉग परम सेट tcp_max_syn_backlog, somaxconn, netdev_max_backlog साथ की कोशिश की, और। अभी भी एसईएन बाढ़ चेतावनी पैदा करता है।
एक तरफ ध्यान दें पर मैं इस के लिए बहुत अंतिम समाधान में दिलचस्पी है के रूप में मैं सक्रिय कनेक्शन की उच्च संख्या के साथ NodeJS आवश्यक जानकारी मिल सकती भी। –
इसके लायक होने के लिए, नोड जितना कुशल हो सकता है, 10k कनेक्शन एक बार में कुछ कर रहे हैं, मैं एक एकल वीपीएस पर जाने से अधिक भार लेता हूं। – Brad