यदि कोई क्लाइंट MySQL-सर्वर से जुड़ता है, तो यह आमतौर पर एक स्थानीय पोर्ट खोलता है, उदाहरण:
localhost:12345 -> mysqlserver:3306
यदि क्लाइंट कनेक्शन बंद कर देता है, तो क्लाइंट को TIME_WAIT मिलता है। टीसीपी रूटिंग के कारण, अस्थायी बंदरगाह पर एक पैकेट देर से आ सकता है। TIME_WAIT में एक कनेक्शन बस इन पैकेटों को छोड़ देता है। TIME_WAIT के बिना, स्थानीय पोर्ट को किसी अन्य कनेक्शन के लिए पुन:उपयोग किया जा सकता है और पूर्व कनेक्शन से पैकेट प्राप्त हो सकता है।
वेब पर एक उच्च लगातार एप्लिकेशन पर जो प्रति अनुरोध एक mysql- कनेक्शन खोलता है, TIME_WAIT कनेक्शन की एक उच्च मात्रा अपेक्षित है। इसमें कुछ भी गलत नहीं है।
यदि आपकी स्थानीय पोर्ट सीमा बहुत कम है, तो समस्याएँ हो सकती हैं, इसलिए आप आउटगोइंग कनेक्शन को और नहीं खोल सकते। सामान्य टाइमआउट 60 सेकंड पर सेट है। तो कम रेंज पर प्रति सेकंड 400 से अधिक अनुरोधों पर पहले से ही एक समस्या हो सकती है।
जांचें:
TIME_WAIT की राशि की जांच करने के लिए, आप निम्न आदेश का उपयोग कर सकते हैं:
$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
"tw" के बाद का मान, इस मामले में 33365, TIME_WAIT की राशि दर्शाता है।
समाधान:
ए। TIME_WAIT ट्यूनिंग (लिनक्स आधारित ओएस उदाहरण):
TIME_WAIT के लिए समयबाह्य कम करें:
# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
स्थानीय पोर्ट के लिए पोर्ट रेंज बढ़ाएँ:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
सेटिंग्स /proc/sys/net/ipv4/tcp_tw_recycle
और /proc/sys/net/ipv4/tcp_tw_reuse
दिलचस्प भी हो सकता है। (लेकिन हमने इन सेटिंग्स के साथ अजीब साइड इफेक्ट्स का अनुभव किया है, इसलिए बेहतर है कि इनसे बचें। इसमें अधिक जानकारी उत्तर
)
बी। लगातार कनेक्शन
कुछ प्रोग्रामिंग भाषाएं और पुस्तकालय लगातार कनेक्शन का समर्थन करते हैं। एक अन्य समाधान स्थानीय रूप से स्थापित प्रॉक्सी जैसे "ProxySQL" का उपयोग कर सकता है। यह नए और बंद कनेक्शन की मात्रा को कम करता है।