खुले कनेक्शन की कम संख्या के लिए MySQL कम प्रतीक्षा_ समय मूल्य


39

मैं एक अधिक व्यस्त साइट चलाता हूं, और घंटों के दौरान मैं अपने वेबसर्वर पर अपने डेटाबेस सर्वर पर 10.000 से अधिक खुले कनेक्शन देखता हूं जब एक नेटस्टैट कमांड चलता है। TIME_WAITराज्य में ९९% कनेक्शन हैं ।

मुझे इस mysql वैरिएबल के बारे में पता चला है: wait_timeout http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout । मेरा अभी भी डिफ़ॉल्ट 28.800 सेकंड पर सेट है।

क्या यह मूल्य कम करना सुरक्षित है?

मेरे प्रश्नों में से अधिकांश में आमतौर पर एक सेकंड लगता है। इसलिए 480 मिनट तक कनेक्शन खुला रखना मूर्खतापूर्ण लगता है।

मैंने भी mysql_pconnectइसके बजाय का उपयोग करने के बारे में सुना है mysql_connect, लेकिन मैं इसके बारे में डरावनी कहानियों के अलावा कुछ भी नहीं पढ़ रहा हूं, इसलिए मुझे लगता है कि मैं इससे दूर रहूंगा।


3
प्रश्न और कनेक्शन के बीच अंतर है। आपको कम से कम यह सुनिश्चित करने की आवश्यकता है कि यदि आपकी वेबसाइट wait_timeoutखुले रहने के लिए सॉफ़्टवेयर से अपेक्षा करती है कि कम कनेक्शन बंद हो जाए, तो आपकी वेब साइट सॉफ़्टवेयर नहीं टूटेगी ।
जॉन गार्डनियर्स

जवाबों:


74

एक mysql पुनरारंभ के बिना मूल्य कम करना बहुत तुच्छ है

मान लीजिए कि आप 30 सेकंड तक का समय कम करना चाहते हैं

सबसे पहले, इसे my.cnf में जोड़ें

[mysqld]
interactive_timeout=30
wait_timeout=30

फिर, आप ऐसा कुछ कर सकते हैं

mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"

इसके बाद के सभी DB कनेक्शन 30 सेकंड में टाइमआउट हो जाएंगे

चेतावनी

स्पष्ट रूप से mysql_close का उपयोग करना सुनिश्चित करें। मुझे अपाचे पर भरोसा नहीं है जैसा कि ज्यादातर डेवलपर्स करते हैं। यदि नहीं, तो कभी-कभी, एक दौड़ की स्थिति होती है, जहां अपाचे एक DB कनेक्शन को बंद कर देता है, लेकिन mysqld को सूचित नहीं करता है और mysqld उस कनेक्शन को तब तक खुला रखता है जब तक कि वह बाहर न निकल जाए। इससे भी बदतर, आप TIME_WAITs को अधिक बार देख सकते हैं। अपने टाइमआउट मूल्यों को समझदारी से चुनें।

UPDATE 2012-11-12 10:10 EDT

चेतावनी

मेरे पोस्ट किए गए सुझावों को लागू करने के बाद, /root/show_mysql_netstat.shनिम्नलिखित पंक्तियों के साथ एक स्क्रिप्ट बनाएं :

netstat | grep mysql > /root/mysql_netstat.txt
cat /root/mysql_netstat.txt | awk '{print $5}' | sed 's/:/ /g' | awk '{print $2}' | sort -u > /root/mysql_netstat_iplist.txt
for IP in `cat /root/mysql_netstat_iplist.txt`
do
        ESCOUNT=`cat /root/mysql_netstat.txt | grep ESTABLISHED | awk '{print $5}' | grep -c "${IP}"`
        TWCOUNT=`cat /root/mysql_netstat.txt | grep TIME_WAIT   | awk '{print $5}' | grep -c "${IP}"`
        IPPAD=`echo "${IP}..................................." | cut -b -35`
        (( ESCOUNT += 1000000 ))
        (( TWCOUNT += 1000000 ))
        ES=`echo ${ESCOUNT} | cut -b 3-`
        TW=`echo ${TWCOUNT} | cut -b 3-`
        echo ${IPPAD} : ESTABLISHED:${ES} TIME_WAIT:${TW}
done
echo ; echo
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n | sed 's/d)/d/'

जब आप इसे चलाते हैं, तो आपको कुछ इस तरह से देखना चाहिए:

[root@*** ~]# /root/ShowConnProfiles.sh
10.48.22.4......................... : ESTABLISHED:00002 TIME_WAIT:00008
10.48.22.8......................... : ESTABLISHED:00000 TIME_WAIT:00002
10.64.51.130....................... : ESTABLISHED:00001 TIME_WAIT:00000
10.64.51.133....................... : ESTABLISHED:00000 TIME_WAIT:00079
10.64.51.134....................... : ESTABLISHED:00002 TIME_WAIT:00001
10.64.51.17........................ : ESTABLISHED:00003 TIME_WAIT:01160
10.64.51.171....................... : ESTABLISHED:00002 TIME_WAIT:00000
10.64.51.174....................... : ESTABLISHED:00000 TIME_WAIT:00589
10.64.51.176....................... : ESTABLISHED:00001 TIME_WAIT:00570


      1 established
      1 Foreign
     11 LISTEN
     25 ESTABLISHED
   1301 TIME_WAIT

यदि आप अभी भी TIME_WAITsकिसी भी दिए गए वेब सर्वर के लिए बहुत सारे mysql देखते हैं, तो यहां दो कदम उठाने की जरूरत है:

ESCALATION # 1

आक्रामक वेब सर्वर पर लॉग इन करें और अपाचे को पुनः आरंभ करें:

service httpd stop
sleep 30
service httpd start

यदि आवश्यक हो, तो इसे सभी वेब सर्वरों पर करें

service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)

ESCALATION # 2

आप निम्नलिखित के साथ OS को mysql या किसी अन्य ऐप के लिए TIME_WAITs मारने के लिए बाध्य कर सकते हैं:

SEC_TO_TIMEWAIT=1
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_recycle
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_reuse

इससे TIME_WAITs का समय 1 सेकंड में समाप्त हो जाएगा।

क्रेडिट देने के लिए जहां क्रेडिट देय है ...


1
इसके लिए लगभग 2k विचार और केवल 2 अप वोट (मेरा, तो 1 सहित), wtf ?! यह एक बेहतरीन जवाब है। क्षमा करें मैं केवल 1 वोट दे सकता हूं!
jwbensley

मैंने इस तकनीक की कोशिश की, और मेरे पास बहुत से CLOSE_WAIT कनेक्शन (2622) थे, लेकिन TIME_WAIT कनेक्शन नहीं थे। मुझे इस परिणाम की व्याख्या कैसे करनी चाहिए?
डकैती

4

यदि आपको MySQL सर्वर पर बहुत से TIME_WAIT कनेक्शन मिल रहे हैं तो इसका मतलब है कि MySQL सर्वर कनेक्शन बंद कर रहा है। इस उदाहरण में सबसे संभावित मामला यह होगा कि एक मेजबान या कई मेजबान एक ब्लॉक सूची में शामिल हो गए। आप इसे चलाकर साफ़ कर सकते हैं:

mysqladmin flush-hosts

आपके द्वारा प्रति IP रन किए गए कनेक्शनों की संख्या की सूची प्राप्त करने के लिए:

 netstat -nat | awk {'print $5'} | cut -d ":" -f1 | sort | uniq -c | sort -n

आप यह भी पुष्टि कर सकते हैं कि यह आपके ग्राहकों में से एक को हो रहा है जो 3306 को पोर्ट करने के लिए कनेक्ट करने और टेलनेट को परेशान कर रहा है। यह कुछ इस तरह से एक संदेश दिखाएगा:

telnet mysqlserver 3306
Trying 192.168.1.102...
Connected to mysqlserver.
Escape character is '^]'.
sHost 'clienthost.local' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.

1

यदि आपके पास अपने MySQL सर्वर के लिए बहुत से TIME_WAIT कनेक्शन हैं, तो इसका मतलब है कि आप कोड आपके DB के खिलाफ बहुत सारी क्वेरी चला रहे हैं, और प्रत्येक क्वेरी के लिए कनेक्शन खोलना / बंद करना।

इस स्थिति में, आपको MySQLi एक्सटेंशन का उपयोग करके अपने DB सर्वर पर लगातार कनेक्टिविटी का उपयोग करना चाहिए।

http://php.net/manual/en/mysqli.persistconns.php

यदि आप MySQLi का उपयोग नहीं कर सकते हैं, तो आपको अपने MySQL कॉन्फ़िगरेशन में थ्रेड_कैशे_साइज़ पैरामीटर का उपयोग करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.