2010-04-15 15 views
9

में "बहुत अधिक कनेक्शन" त्रुटि के लिए मूल कारण कैसे ढूंढें I मैं एक वेब सेवा चला रहा हूं जो एल्गोरिदम चलाता है जो प्रतिदिन लाखों कॉलों की सेवा करता है और कुछ पृष्ठभूमि प्रसंस्करण भी चलाता है। प्रत्येक अब और मैं कुछ सेकंड के लिए "MySQL बॉक्स से कनेक्ट करने के प्रयासों में" बहुत सारे कनेक्शन "त्रुटि को देखता हूं। हालांकि यह आवश्यक नहीं है कि मैं उच्च ट्रैफ़िक के समय या कुछ भी अपनी उंगली डाल सकूं।MySQL/PHP

मैं इसे बाधा उत्पन्न करना चाहता हूं। विशिष्ट समय के अलावा यह होता है कि सर्वर CPU और मेमोरी के मामले में भी लोड नहीं होता है, और इसमें 2-3 कनेक्शन (धागे) खुले होते हैं और सब कुछ सुचारू रूप से काम करता है। (मैं ज़ब्बिक्स का उपयोग करता हूं जब ऐसा होता है की निगरानी के लिए)

कैसे यह पता लगाने के लिए?

+1

क्या आप गैर-उत्पादन मशीन पर समस्या का पुनरुत्पादन कर सकते हैं? क्या आपको उपयुक्त हार्डवेयर बॉक्स और एक ड्राइवर सिस्टम के साथ तनाव परीक्षण वातावरण मिला है जो उत्पादन भार को अनुकरण कर सकता है? यदि नहीं, तो जितनी जल्दी हो सके एक प्राप्त करें। अन्यथा आपको इसे उत्पादन में डीबग करने की कोशिश करनी होगी, जिसमें सामान्य क्वेरी लॉग को चालू करने जैसी उच्च जोखिम वाली चीजें शामिल होंगी। – MarkR

+0

अपडेट- मैंने बहुत से कनेक्शन समस्या होने पर सफलतापूर्वक शो प्रोसेसलिस्ट चलाया है। मुझे जो मिला वह यह है: कुल 151 प्रश्नों की एक सूची (मेरा अंक कनेक्शन 150 पर सेट है)। उनमें से 2 मेरे पीसी (शो प्रोसेसलिस्ट) से बाकी सभी प्रश्न कमांड 374-395 के समय मूल्य के साथ हैं, उनके राज्य को लॉक किया गया है, जो राज्य है, FULLTEXT प्रश्नों में से 3 अपडेट हैं बाकी सभी चुने गए हैं। मैं कैसे समझ सकता हूं कि इस लॉक अप के कारण क्या हुआ? – Nir

+0

अच्छी तरह से यह कहना मुश्किल है कि समस्या का कारण क्या है, लेकिन मुझे पूरा यकीन है कि यह सिस्टम को छेड़छाड़ करने वाला एक प्रश्न है। यह देखने का प्रयास करें कि उनमें से कौन सा निष्पादन का सबसे लंबा समय है और ऐसा लगता है कि बहुत बार दोहराया जाता है। इसके बाद, यह सिर्फ सही इंडेक्स बनाने और आपके प्रश्नों को अनुकूलित करने का मामला है, लेकिन यहां कोई भी आपको यह बताने में सक्षम नहीं होगा कि आपकी स्कीमा और प्रश्न – matei

उत्तर

3

क्या MySQL तालिका प्रकार आप उपयोग कर रहे हैं? MyISAM या InnoDB (या कोई अन्य)? MyISAM तालिका स्तर लॉकिंग का उपयोग करेगा, ताकि आप एक परिदृश्य में भाग सकें जहां आप एक भारी चयन चल रहा है, उसके बाद एक ही तालिका और कई चुनिंदा प्रश्नों के अपडेट के बाद। आखिरी चुनिंदा प्रश्नों को तब तक इंतजार करना होगा जब तक कि अपडेट समाप्त नहीं हो जाता (जो कि तु आरएन को पहले तक इंतजार करना पड़ता है - भारी - चयन समाप्त हो गया है)।

InnoDB के लिए innotop जैसे टूल डेडलॉक के कारण को खोजने के लिए उपयोगी हो सकता है (http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/ देखें)।

बीटीडब्ल्यू जो लॉक उत्पन्न होता है वह क्वेरी लॉक स्थिति में नहीं है।

+0

मेरी तालिकाओं को बिना माईसैम, + कुछ मेमोरी टेबल पर देखे बिना क्या करना है। – Nir

+0

शो प्रोसेसलिस्ट ने मुझे लॉक स्टेटस में एक और FULLTEXT प्रारंभिक स्थिति में एक प्रश्न दिया। उत्तरार्द्ध में सबसे कम प्रक्रिया आईडी है। क्या यह निश्चित है कि इस प्रक्रिया से जुड़ी क्वेरी लॉकिंग है? – Nir

+0

यह होना चाहिए, लॉकड राज्य में रहने वाले अन्य प्रश्नों को समाप्त करने की प्रतीक्षा कर रहे हैं। – wimvds

6

कोशिश पर कोई रचनात्मक विचारों एक खुला mysql सांत्वना है और एक

SHOW PROCESSLIST;
जारी क्या देखने के लिए करने के लिए प्रश्नों को निष्पादित किया जा रहा है। [Mysqld] अनुभाग में

log-slow-queries=/var/log/mysql-log-slow-queries.log

और

set-variable=long_query_time=1
का उपयोग क्या न्यूनतम समय एक प्रश्न के क्रम में लेना चाहिए धीमी गति से विचार किया जाना है परिभाषित करने के लिए: वैकल्पिक रूप से आप धीमी गति से प्रश्नों लॉगिंग सक्षम सकता है (my.cnf में इस लाइन डालें। (परिवर्तनों को प्रभावी होने के लिए mysql को पुनरारंभ करना याद रखें)

2

SHOW OPEN TABLES कमांड MySQL में सभी तालिकाओं की लॉक स्थिति प्रदर्शित करेगा। यदि आपके एक या अधिक प्रश्न कनेक्शन बैकलॉक का कारण बन रहे हैं, तो SHOW PROCESSLIST को संयोजित करें और खुली तालिकाओं को इसे कम करना चाहिए क्योंकि वास्तव में कौन सी क्वेरी कार्य को पकड़ रही है।

+0

त्रुटियों के दौरान मैंने खुले टैबलेट दिखाए हैं। मुझे table_name क्या मुझे यह मानने का अधिकार है कि यह तालिका लॉक है? और सभी कनेक्शन इस तालिका के प्रश्नों में अवरुद्ध हैं? – Nir

+0

'148' का अर्थ है कि आपके पास उस विशेष तालिका पर 148 ताले सक्रिय और/या लंबित हैं। यदि यह InnoDB है, तो कोई बड़ा सौदा नहीं है, क्योंकि वह इंजन पंक्ति-स्तर लॉकिंग कर सकता है, लेकिन यदि यह माईसाम है तो यह एक बड़ा सौदा है, क्योंकि यह केवल टेबल-स्तरीय ताले ही कर सकता है। यदि यह InnoDB है, तो आप देख सकते हैं कि 'सक्रिय INNODB स्थिति' के माध्यम से सक्रिय प्रश्न/ताले क्या हैं। इसके आउटपुट का हिस्सा प्रश्नों और त्रुटियों/ताले की एक सूची है। –

0

आपके कार्यान्वयन के बहुत अधिक जानने के बिना, और सामान्य रूप से PHP, लेकिन क्या आप सुनिश्चित हैं कि आपको डीबी कनेक्शन को कम करने में कोई समस्या नहीं है? E.g कनेक्शन जो अनुरोध के बाद भी खुला रहता है संसाधित हो गया है?

PHP में जब स्क्रिप्ट समाप्त होता है या mysql_close($conn); पर कॉल करते समय एक कनेक्शन आमतौर पर बंद हो जाता है लेकिन यदि आप किसी भी प्रकार के होमग्राउंड कनेक्शन पूलिंग का उपयोग करते हैं, तो इससे समस्याएं उत्पन्न हो सकती हैं।

1

की प्रतिलिपि प्राप्त खोज के लिए MySQL में इस बग से संबंधित हो सकता: http://bugs.mysql.com/bug.php?id=37067

इस मामले में, की प्रतिलिपि प्राप्त प्रारंभ वास्तव में MySQL लटका हुआ है। दुर्भाग्यवश कोई समाधान प्रतीत नहीं होता है।

1

पुराना विषय। हालांकि, मुझे बस यह समस्या थी और ऐसा इसलिए था क्योंकि मेरे पास एक mysqldump स्क्रिप्ट प्रति दिन 3 बार निर्धारित की गई थी। इन समय, यदि मेरे वेब एप्लिकेशन को उचित उपयोग भी मिल रहा था, तो सभी वेब एप्लिकेशन प्रश्नों ने स्वयं को एक-दूसरे के ऊपर कतारबद्ध किया जबकि mysqldump डेटाबेस में सभी तालिकाओं को लॉक कर रहा था।सबसे अच्छा विकल्प एक अलग मशीन पर प्रतिकृति दास को सेट करना है, और उत्पादन सर्वर से बजाए अपने बैकअप को दास से लेना है।