उच्च लोड पर टीसीपी रीसेट के साथ मेरा वेब सर्वर कनेक्शन क्यों छोड़ रहा है?


10

मेरे पास nginx के साथ एक छोटा VPS सेटअप है। मैं इससे जितना संभव हो उतना प्रदर्शन निचोड़ना चाहता हूं, इसलिए मैं अनुकूलन और लोड परीक्षण के साथ प्रयोग कर रहा हूं।

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

मैं 2GB लाइनोड VPS पर Ubuntu 14.04 LTS (64-बिट) चला रहा हूं।

इस ग्राफ को सीधे पोस्ट करने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है, इसलिए यहां ब्लिट्ज.आईओ ग्राफ का लिंक दिया गया है:

यहाँ छवि विवरण दर्ज करें

यहाँ चीजें हैं जो मैंने कोशिश की हैं और समस्या के स्रोत का पता लगाने के लिए:

  • Nginx config मान worker_rlimit_nofile8192 पर सेट है
  • उपयोगकर्ता और उपयोगकर्ता (जो nginx के रूप में चलाता है) के nofileलिए दोनों कठिन और नरम सीमा के लिए 64000 पर सेट हैrootwww-data/etc/security/limits.conf
  • कोई संकेत नहीं हैं कि कुछ भी गलत हो रहा है /var/log/nginx.d/error.log(आम तौर पर, यदि आप फ़ाइल डिस्क्रिप्टर सीमा में चल रहे हैं, तो nginx त्रुटि संदेशों को प्रिंट करेगा)

  • मेरे पास ufw सेटअप है, लेकिन नियमों को सीमित करने की कोई दर नहीं है। Ufw लॉग इंगित करता है कि कुछ भी अवरुद्ध नहीं किया जा रहा है और मैंने उसी परिणाम के साथ ufw को अक्षम करने का प्रयास किया है।

  • इसमें कोई सांकेतिक त्रुटियां नहीं हैं /var/log/kern.log
  • इसमें कोई सांकेतिक त्रुटियां नहीं हैं /var/log/syslog
  • मैंने निम्नलिखित मान जोड़ दिए हैं /etc/sysctl.confऔर उन्हें sysctl -pबिना किसी प्रभाव के साथ लोड किया है:

    net.ipv4.tcp_max_syn_backlog = 1024
    net.core.somaxconn = 1024
    net.core.netdev_max_backlog = 2000
    

कोई विचार?

संपादित करें: मैंने एक नया परीक्षण किया, एक बहुत छोटी फ़ाइल (केवल 3 बाइट्स) पर 3000 कनेक्शन के लिए रैंपिंग। यहाँ Blitz.io ग्राफ है:

ब्लिट्ज.आईओ ग्राफ

फिर से, ब्लिट्ज के अनुसार ये सभी त्रुटियां "टीसीपी कनेक्शन रीसेट" त्रुटियां हैं।

यहाँ लिनोइड बैंडविड्थ ग्राफ है। ध्यान रखें कि यह 5 मिनट का औसत है, इसलिए यह कम पास को थोड़ा फ़िल्टर्ड करता है (तात्कालिक बैंडविड्थ शायद बहुत अधिक है), लेकिन फिर भी, यह कुछ भी नहीं है:

यहाँ छवि विवरण दर्ज करें

सी पी यू:

यहाँ छवि विवरण दर्ज करें

मैं / हे:

यहाँ छवि विवरण दर्ज करें

यहाँ htopपरीक्षण के अंत के पास है: htop

मैंने कुछ भिन्न (लेकिन समान दिखने वाले) परीक्षण पर tcpdump का उपयोग करते हुए कुछ ट्रैफ़िक कैप्चर किए, त्रुटियों के शुरू होने पर कैप्चर शुरू करना: sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

यदि कोई इस पर एक नज़र डालना चाहता है (~ 20MB): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=haring

यहाँ Wireshark से एक बैंडविड्थ ग्राफ है:

यहाँ छवि विवरण दर्ज करें (लाइन सभी पैकेट हैं, नीले रंग की पट्टियाँ टीसीपी त्रुटी हैं)

कैप्चर की मेरी व्याख्या से (और मैं कोई विशेषज्ञ नहीं हूं), ऐसा लग रहा है कि टीसीपी आरएसटी झंडे लोड परीक्षण स्रोत से आ रहे हैं, सर्वर नहीं। इसलिए, यह मानते हुए कि लोड परीक्षण सेवा के पक्ष में कुछ गलत नहीं है, क्या यह मान लेना सुरक्षित है कि यह लोड परीक्षण सेवा और मेरे सर्वर के बीच नेटवर्क प्रबंधन या DDOS शमन के कुछ प्रकार का परिणाम है?

धन्यवाद!


क्या आपका प्रदाता किसी प्रकार का DDoS शमन कर रहा है? यह आपके परीक्षण में हस्तक्षेप कर सकता है।
माइकल हैम्पटन

@ मिचेल हैम्पटन मैं काफी निश्चित हूं कि लिनोइड ऐसा नहीं करता है।
EEAA

क्या आप लाइनोड कंट्रोल पैनल से नेटवर्क ग्राफ पोस्ट कर सकते हैं? यह परीक्षण वास्तव में कितना बैंडविड्थ ले रहा है?
EEAA

मैंने थोड़ी अधिक जांच की और बहुत अधिक जानकारी के साथ मूल पोस्ट को अपडेट किया। मैंने लिनोड के साथ यह भी पुष्टि की कि वे डीडीओएस शमन नहीं करते हैं, हालांकि यह जरूरी नहीं है कि लोड परीक्षण सेवा और लिनोड के बीच एक नेटवर्क प्रदाता कोई भी काम नहीं कर रहा है। धन्यवाद!
एरिक स्वान

1
क्या कोई कारण है जो आप केवल net.core.netdev_max_backlog2000 तक सेट करते हैं? मैंने कई उदाहरण देखे हैं कि यह गीगाबिट (और 10Gig) कनेक्शन के लिए अधिक परिमाण का क्रम है।
मोशे कटज़

जवाबों:


1

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

वास्तव में दोनों छोर से एक pcap फ़ाइल की आवश्यकता होगी। आप जो देखना चाहते हैं वह है यदि कनेक्शन का प्रयास भेजा जाता है, लेकिन कभी सर्वर तक नहीं पहुंचता है, लेकिन फिर भी ऐसा प्रतीत होता है जैसे कि यह सर्वर द्वारा रीसेट किया गया था। यदि ऐसा है तो लाइन के साथ कुछ को कनेक्शन को रीसेट करना होगा। एनएटी पूल थकावट इस प्रकार की समस्याओं का एक सामान्य स्रोत है।

इसके अलावा, netstat -st आपको कुछ अतिरिक्त जानकारी दे सकता है।


1

मेरे हाल के इसी तरह के ट्यूनिंग अनुभवों के आधार पर, कुछ विचारों को आज़माने के लिए। संदर्भ के साथ:

आप कहते हैं कि यह एक स्थिर पाठ फ़ाइल है। बस अगर कोई अपस्ट्रीम प्रोसेसिंग चल रही है, तो जाहिर तौर पर डोमेन सॉकेट टीसीपी पोर्ट आधारित कनेक्शन पर टीसीपी थ्रूपुट में सुधार करता है:

https://rtcamp.com/tutorials/php/fpm-sysctl-tweaking/ https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

अपस्ट्रीम समाप्ति के बावजूद:

Multi_accept और tcp_nodelay सक्षम करें: http://tweaked.io/guide/nginx/

टीसीपी धीमी शुरुआत अक्षम करें: /programming/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

ऑप्टिमाइज़ TCP TCP विंडो (initcwnd): http://www.nateware.com/linux-network-tuning-n-2013.html


1

अधिकतम खुली फ़ाइलों को सेट करने के लिए (यदि वह आपके मुद्दे का कारण है) तो आपको "fs.file-max = 64000" को /etc/sysctl.conf में जोड़ना होगा


0

कृपया, देखें कि TIME_WAITकमांड का उपयोग करके राज्य में कितने पोर्ट हैं netstat -patunl| grep TIME | wc -lऔर net.ipv4.tcp_tw_reuse1 में बदल जाता है।


मैं कैसे देखूंगा कि TIME_WAITराज्य में कितने बंदरगाह हैं ?
एरिक स्वान

का उपयोग कर netstatया ss। मैंने पूरी कमांड के साथ अपना जवाब अपडेट किया!
fgbreel

मैंने परीक्षण फिर से किया है और watch -n 1 'sudo netstat -patunl | grep TIME | wc -l'पूरे परीक्षण के दौरान 0 लौटाता हूं । मुझे यकीन है कि मेरे द्वारा ऊपर पोस्ट किए गए PCAP फ़ाइल के विश्लेषण के आधार पर, लोड टेस्टर और मेरे सर्वर के बीच किसी के द्वारा डीडीओएस शमन के परिणामस्वरूप रीसेट हो रहे हैं, लेकिन अगर कोई पुष्टि कर सकता है कि महान होगा!
एरिक स्वान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.