हाल ही में हमारे पास एक अपाचे सर्वर था जो SYN बाढ़ के कारण बहुत धीरे-धीरे जवाब दे रहा था। इसके लिए समाधान tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf
) को सक्षम करना था ।
यदि आप अधिक पृष्ठभूमि चाहते हैं तो मैंने इस बारे में एक प्रश्न यहां पोस्ट किया है ।
सिंक्रनाइज़ेशन को सक्षम करने के बाद, हमने निम्नलिखित संदेश को लगभग 60 सेकंड में / var / log / संदेश में देखना शुरू किया:
[84440.731929] possible SYN flooding on port 80. Sending cookies.
Vinko Vrsalovic ने मुझे सूचित किया कि इसका मतलब है कि बैकलॉग पूर्ण हो रहा है, इसलिए मैंने tcp_max_syn_backlog को 4096 तक उठाया। कुछ बिंदु पर मैंने tcp_synack_retries को 3 (5 के डिफ़ॉल्ट से नीचे) जारी करके कम किया sysctl -w net.ipv4.tcp_synack_retries=3
। ऐसा करने के बाद, आवृत्ति गिरनी शुरू हो गई, संदेशों के अंतराल में लगभग 60 और 180 सेकंड के बीच अंतर था।
अगला मैंने जारी किया sysctl -w net.ipv4.tcp_max_syn_backlog=65536
, लेकिन अभी भी लॉग में संदेश मिल रहा है।
इस सब के दौरान, मैं SYN_RECV राज्य में कनेक्शनों की संख्या देख रहा हूं (चलाकर watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'
), और यह लगभग 240 से अधिक नहीं जाता है, बैकलॉग के आकार की तुलना में बहुत कम है। फिर भी मेरे पास एक Red Hat सर्वर है जो लगभग 512 (इस सर्वर पर सीमा 1024 की डिफ़ॉल्ट है) पर घूमता है।
क्या कोई अन्य tcp सेटिंग्स है जो बैकलॉग के आकार को सीमित करेगा या क्या मैं गलत पेड़ को भौंक रहा हूं? netstat -tuna
बैकलॉग के आकार के संबंध में SYN_RECV कनेक्शन की संख्या होनी चाहिए ?
अद्यतन करें
जैसा कि सबसे अच्छा मैं बता सकता हूं कि मैं यहां वैध कनेक्शन के साथ काम कर रहा हूं, netstat -tuna|wc -l
लगभग 5000 के आसपास हो जाता है। मैं आज इस पर शोध कर रहा हूं और इस पोस्ट को एक last.fm कर्मचारी से पाया गया है, जो उपयोगी नहीं है।
मैंने यह भी पाया है कि tcp_max_syn_backlog का कोई प्रभाव नहीं पड़ता है जब सिंकुकीज़ सक्षम होते हैं ( इस लिंक के अनुसार )
इसलिए अगले चरण के रूप में मैंने sysctl.conf में निम्नलिखित सेट किया:
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=5
net.ipv4.tcp_max_syn_backlog = 65536
# default=1024
net.core.wmem_max = 8388608
# default=124928
net.core.rmem_max = 8388608
# default=131071
net.core.somaxconn = 512
# default = 128
net.core.optmem_max = 81920
# default = 20480
फिर मैंने अपनी प्रतिक्रिया समय परीक्षण, sysctl -p
दौड़ाया और अक्षम सिंक्युकी द्वारा सेटअप किया sysctl -w net.ipv4.tcp_syncookies=0
।
ऐसा करने के बाद SYN_RECV राज्य में कनेक्शन की संख्या अभी भी 220-250 के आसपास बनी हुई थी, लेकिन कनेक्शन फिर से देरी से शुरू हो रहे थे। एक बार जब मैंने इन देरी पर ध्यान दिया तो मैंने सिंक्युकी को फिर से सक्षम किया और देरी रुक गई।
मेरा मानना है कि जो मैं देख रहा था वह अभी भी प्रारंभिक स्थिति से एक सुधार था, हालांकि कुछ अनुरोधों में अभी भी देरी हो रही थी जो सिंक्यूकी सक्षम होने से बहुत खराब है। तो ऐसा लग रहा है कि मैं उनके साथ सक्षम हूं जब तक कि हम लोड से निपटने के लिए कुछ और सर्वर ऑनलाइन नहीं पा सकते। फिर भी, मुझे यकीन नहीं है कि सर्वर के बफ़र्स पूर्ण होने पर मुझे उन्हें फिर से अक्षम करने का एक वैध कारण दिखाई दे रहा है (केवल)।
लेकिन सिंक बैकलॉग SYN_RECV राज्य में केवल ~ 250 कनेक्शन के साथ भरा हुआ नहीं दिखता है! क्या यह संभव है कि SYN बाढ़ संदेश एक लाल हेरिंग है और यह syn_backlog के अलावा कुछ और है जो भर रहा है?
अगर किसी के पास कोई अन्य ट्यूनिंग विकल्प हैं, तो मैंने अभी तक कोशिश नहीं की है, मैं उन्हें बाहर की कोशिश करने में अधिक खुश हूं, लेकिन मुझे आश्चर्य है कि अगर किसी कारण से syn_backlog सेटिंग ठीक से लागू नहीं हो रही है।