IO माईकल कमिट के दौरान इतनी मंदी (99% IO पर EXT4 JDB2) का इंतजार कर रहा है


14

मैं एक इंडेक्स लिख रहा हूं, अजगर का उपयोग करके, जो दस्तावेजों को अनुक्रमित करता है और उन्हें डेटाबेस में सम्मिलित करता है, इससे पहले कि यह एकल प्रक्रिया थी लेकिन अब मैंने इसे 4 समानांतर प्रक्रियाओं के साथ मल्टीप्रोसेसिंग के लिए बनाया है। प्रत्येक पाठ निष्कर्षण के बाद, यह डेटाबेस में सम्मिलित करता है और एक प्रतिबद्ध करता है।

अब यह IO समस्या से जूझ रहा है, मुख्य IO समस्या मेरी प्रक्रिया नहीं है, बल्कि EXT4 की jdb2, सिस्टम को जमाना है। यह 99.99% है और प्रत्येक सीपीयू कमेटी में IO की प्रतीक्षा करने के लिए सीपीयू की मदद करता है।

मैंने कई लोगों को इंटरनेट पर उस समस्या को देखा और उनका समाधान अवरोधक = 0 का उपयोग करके माउंट करना है। क्या इससे जर्नलिंग पूरी तरह से निष्क्रिय हो जाएगी? मेरे सेवकों के पास यूपीएस है और इसे करने के लिए प्रलोभन देना चाहिए, क्या मुझे?


क्या आपका सारा डाटा InnoDB ???
रोलैंडम्यूसीडीडीबीए

जवाबों:


4

डेटाबेस को नॉन-जर्नलिंग फ़ाइल सिस्टम पर रखें। कम से कम बड़े सर्वर (oracle, sql server) का अपना जर्नल फंक्शन (ट्रांजेक्शन लॉग) होता है और उसी के अनुसार अपने IO को ऑप्टिमाइज़ करते हैं। आपके पास अलग-अलग फ़ाइल सिस्टम और डिस्क पर लॉग और डेटाबेस है और खराब आईओ से निपटने के लिए डेटाबेस की आंतरिक कार्यक्षमता पर भरोसा करते हैं। आम तौर पर कोई भी (बड़ा सेटअप) फ़ाइल सिस्टम परिवर्तन नहीं होते हैं सिवाय लेखन की तारीख के क्योंकि फाइलें विस्तार नहीं करती हैं - वे अपने "अंतिम" आकार (ठीक है, प्रवेश बदल सकते हैं) के साथ उत्पन्न होंगे, और परिवर्तन के रूप में मैंने डेटाबेस द्वारा ट्रैक किया गया है स्तर लेनदेन लॉग।

आप यह भी बताना चाहेंगे कि आपकी हार्डवेयर परत क्या है। ज्यादातर लोग इस बात को कम आंकते हैं कि IOPS किसी डेटाबेस के लिए सीमित कारक है और लगता है कि एक छोटा सा डिस्क सेट एक बड़े डेटाबेस के लिए उचित वातावरण है। जबकि हम में से कुछ बड़ी संख्या में डिस्क का उपयोग करके डेटाबेस पर काम करते हैं, इस प्रकार संभवतः अधिक संख्या में IOPS का समर्थन करते हैं।


मैं डेटा के लिए जर्नल का उपयोग न करके एक फाइलसिस्टम का उपयोग करके इसे संशोधित करूंगा लेकिन केवल मेटाडेटा। Ext4 को इस तरह भी कॉन्फ़िगर किया जा सकता है।
wabbit

हाँ। अंत में जौरीनल आईओ को दोगुना कर देता है - और डेटाबेस लॉग फिर से वही करेगा, इसलिए आप बहुत अधिक आईओपीएस के साथ उठते हैं जितना आपको करना है। और अतिरेक जो मूल रूप से आवश्यक नहीं है। सिस्टम jouirnalling फ़ाइल की सुरक्षा के लिए NICE है .... लेकिन जब एप्लिकेशन पहले से ही ऐसा करता है तो बेकार है, जो डेटाबेस करता है।
टॉमटॉम

गैर-जर्नलिंग में सर्वश्रेष्ठ प्रदर्शन कौन सा प्रदान करता है? धन्यवाद!
फियो अर्कार Lwin

4

वहाँ हमेशा के लिए एक व्यापार होने जा रहा है लचीलापन और प्रदर्शन के बीच।

MySQL ext4 पर बाधाओं के साथ = 1 डिफ़ॉल्ट वास्तव में एक धीमी गति से नीचे का कारण बनता है, हालांकि पहली कार्रवाई जर्नलिंग को अक्षम करने या डेटा = राइटबैक चालू करने के लिए नहीं होनी चाहिए।

सबसे पहले, यदि लचीलापन उच्च महत्व का है, तो एक बैटरी समर्थित RAID निश्चित रूप से इसके लायक है।

मेरे द्वारा चुने गए माउंट विकल्प, विशेष रूप से गैर-बैटरी समर्थित RAID हैं:

/dev/mapper/vg-mysql--data  /var/lib/mysql/data ext4  defaults,noatime,nodiratime,barrier=1,data=ordered  0 0

यह जानबूझकर डेटा = राइटबैक का उपयोग नहीं कर रहा है, क्योंकि मैं फाइलसिस्टम भ्रष्टाचार का जोखिम नहीं उठाना चाहता हूं, जिसके परिणामस्वरूप "पुराने डेटा क्रैश और जर्नल रिकवरी के बाद फाइलों में दिखाई देते हैं" (उद्धरण है man mount)।

I / O संबंधित सेटिंग्स के चारों ओर पूर्ण लचीलापन के लिए my.cnf में आदर्श कॉन्फ़िगरेशन हैं:

[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

मैंने प्रदर्शन बढ़ाने के लिए व्यापार-नापसंद के निम्नलिखित अनुक्रम का विकल्प चुना है:

  1. sync_binlog = 0: यह पहला MySQL कॉन्फिगरेशन है जिसे मैं पूरी रीसेंसी से दूर करता हूं। इसका कारण यह है कि यह एक महत्वपूर्ण प्रदर्शन में सुधार देता है, खासकर जहां binlog_format=row(दुर्भाग्य से जीरा के लिए आवश्यक)। मैं क्लस्टर में पर्याप्त MySQL प्रतिकृतियां का उपयोग कर रहा हूं कि यदि बिनलॉग को एक बिजली हानि परिदृश्य से दूषित हो गया तो मैं दूसरी प्रतिकृति से एक द्विआधारी प्रतिलिपि बनाऊंगा।
  2. innodb_flush_log_at_trx_commit = 2: जबकि पूर्ण ACID अनुपालन के लिए 1 का मान आवश्यक है, 2 के मान के साथ "लॉग बफर प्रत्येक कमेटी में फाइल के लिए लिखा जाता है, लेकिन इस पर फ्लश टू डिस्क ऑपरेशन नहीं किया जाता है। हालांकि, फ्लश पर। लॉग फाइल प्रति सेकंड एक बार भी होती है जब मूल्य 2 होता है। ध्यान दें कि प्रक्रिया शेड्यूलिंग मुद्दों के कारण प्रति सेकंड फ्लशिंग एक बार प्रति सेकंड होने की 100% गारंटी नहीं है। " (MySQL डॉक्स से उद्धरण)
  3. उपयोग करने के लिए माउंट विकल्पों को अपडेट करें data=writeback। ध्यान दें कि यदि यह आपका रूट फाइल सिस्टम है, तो आपको कर्नेल कमांड लाइन विकल्प भी पास करना होगा। मैंने उस पर कोडरवल में कुछ कदम एक साथ रखे
  4. के विभिन्न मूल्यों का परीक्षण करें innodb_flush_method। O_DIRECT को कुछ वर्कलोड में प्रदर्शन में सुधार करने के लिए दिखाया गया है, लेकिन यह एक ऐसा नहीं है कि यह आपके वातावरण में काम करेगा।
  5. SSDs में अपग्रेड करें, जिस स्थिति में आप भी वृद्धि करना चाहते हैं innodb_io_capacityसेटिंग्स जैसे, और धुन innodb_adaptive_flushing, innodb_read_io_threads, innodb_write_io_threads, innodb_purge_threads, और अन्य संभावित सेटिंग्स।

3

यह काफी संभावना है कि आपका I / O बैकएंड लोड के साथ अच्छी तरह से मुकाबला नहीं कर रहा है। आपको यह सुनिश्चित करना चाहिए कि आपका फाइल सिस्टम डेटा जर्नल नहीं कर रहा है। मैं data=writeback,relatime,nobarrierपहले त्वरित और गंदे अनुकूलन के रूप में आपके डेटाबेस के डेटा विभाजन के लिए माउंट करने के लिए मापदंडों का उपयोग करने का सुझाव दूंगा।

इसके अलावा, आपके लक्षणों के कारण, आप स्पष्ट रूप से अपने नियंत्रक के साथ राइटिंग कैशिंग का उपयोग नहीं कर रहे हैं। आपको यह सुनिश्चित करना चाहिए कि आप अपने नियंत्रक पर बैटरी-समर्थित या फ्लैश-समर्थित लेखन कैश का उपयोग कर रहे हैं और इसे सक्षम करें - इससे आपको डेटा हानि या भ्रष्टाचार के जोखिम को बढ़ाए बिना महत्वपूर्ण प्रदर्शन को बढ़ावा देना चाहिए। ध्यान दें कि बैटरी या फ्लैश बैकअप के बिना राइट कैश का उपयोग करने से डेटा हानि या भ्रष्टाचार का जोखिम काफी बढ़ जाता है - इसलिए केवल परीक्षण उद्देश्यों और / या यदि आप नुकसान उठा सकते हैं, तो ऐसा करें।


तो कैसे के बारे में: डेटा = राइटबैक, रिलेटाइम, नोबैरियर और फिर पूरी तरह से mysql लॉगिंग को अक्षम करें? मुझे लगता है कि यह चीजों को बहुत गति देगा?
फ़िओ अर्कार Lwin

hdpram -i से पता चलता है कि मैं राइट कैशिंग का उपयोग कर रहा हूं। इतना हम्म ??
फ्यो अर्कार Lwin

@ V3ss0n आप एक ट्रांजेक्शनल इंजन के लिए लॉगिंग को अक्षम नहीं कर सकते हैं - यह इसका बहुत दिल है। आप अपने मुख्य डेटाबेस डेटा (रैंडम रीड / राइट्स) की तुलना में लेनदेन लॉग को डिस्क के एक अलग सेट में स्थानांतरित करने का विकल्प चुन सकते हैं क्योंकि इसमें पूरी तरह से अलग एक्सेस पैटर्न (ज्यादातर रैखिक लिखते हैं) - यह एक सामान्य रूप से अनुशंसित कॉन्फ़िगरेशन है। आपके संग्रहण सेटअप के लिए: आप एक RAID नियंत्रक का उपयोग नहीं कर रहे हैं, लेकिन बस व्यक्तिगत रूप से कैश पर लिख रहे हैं? यह आपके किसी भी तुल्यकालिक लिखने में मदद नहीं करेगा क्योंकि वे स्पष्ट कैश फ्लश अनुरोधों के साथ आते हैं।
wabbit

के nobarrierरूप में ही है barrier=0?
निक कॉटरेल

@NicCottrell हाँ, वे समान हैं।
कूटन

3

यह एक पुराना प्रश्न है, लेकिन हमने एक ही समर्पित सर्वर पर पिछले सप्ताह (हाई आईओ वेट, और भयानक इंसर्ट / अपडेट स्पीड) का सामना किया।

tune2fs -O "^has_journal" /dev/<drive>JDB2 प्रक्रिया के कारण IO प्रतीक्षा को समाप्त करने के साथ जर्नलिंग को अक्षम करना सबसे तेज़ समाधान था। जब तक आपके पास बैटरी समर्थित ड्राइव नहीं है, तब तक यह अनुशंसित नहीं है क्योंकि आप दुर्घटना की स्थिति में डेटा खो देंगे। यदि आप doublewriteMySQL में सक्षम हैं, तो InnoDB टेबल सुरक्षित हैं । लेकिन .frm, लॉग्स आदि जैसी फाइलें सुरक्षित नहीं हैं। हमने इन फ़ाइलों को किसी अन्य ड्राइव (विशेषकर बिन लॉग्स) पर ले जाने की कोशिश की, लेकिन jdb2 IO प्रतीक्षा अभी भी कायम है। इसलिए इसने हमें बहुत सहज नहीं छोड़ा।

data=writeback,relatime,nobarrierपूरे विभाजन पर जर्नलिंग को अक्षम करने के रूप में इसे लिखने / पढ़ने में तेजी लाने में मदद नहीं की। Ext4 के लिए अधिक विकल्प EXT4 डॉक्टर में हैं

हमारे मामले में असली अपराधी था sync_binlog। हमने सेट किया 1था /etc/mysql/my.cnfऔर यह प्रदर्शन को मार रहा था ।

पर्कोना ने यहां इसकी पुष्टि की है । हम इसे डिफ़ॉल्ट रूप से सेट करते हैं 0और प्रदर्शन 500% से अधिक होता है।


0

इस डेटा को डालने के लिए आप किस डेटाबेस इंजन का उपयोग कर रहे हैं?

यदि यह MyISAM है: तो इसे लिखने के दौरान पूरी तालिका को लॉक करना होगा, इसलिए समवर्ती सम्मिलित थ्रेड्स किसी भी सिस्टम को मार देंगे, चाहे कितना भी शक्तिशाली हो।

सुनिश्चित करें कि आप इन तालिकाओं के लिए InnoDB का उपयोग कर रहे हैं।


चूंकि वह लेनदेन कर रहा है, इसलिए इंजन MyISAM नहीं होगा क्योंकि MyISAM लेनदेन का समर्थन नहीं करता है।
wabbit

अर्र, ब्रेनफार्ट।
एडेप्टर

मैं innodb का उपयोग कर रहा हूँ, mysql5.5 अंतरंग के लिए डिफ़ॉल्ट।
फ़िओ अर्कार Lwin

0

इसके अलावा, सीधे mysql से संबंधित नहीं है, लेकिन कुछ एचडी को आक्रामक पावर प्रबंधन के कारण ext4 के साथ समस्या है ... जब ऐसा होता है, तो मशीन लोड बिना किसी स्पष्ट गतिविधि के बढ़ जाता है।

इसे निष्क्रिय करने का प्रयास करें। पहले आपके पास जो भी मूल्य है (यदि आपको इसे रिबूट किए बिना वापस करने की आवश्यकता है) की जांच करें और फिर इसे अक्षम करें।

वर्तमान मूल्य की जाँच करें:

    hdparm -B /dev/sda

इसे अक्षम करें

   hdparm -B 255 /dev/sda

(या जो भी आपका एचडी है) और परीक्षण करें। संभवतः अधिकांश मुद्दों के लिए मदद नहीं करेगा, लेकिन यह कुछ उपयोगकर्ताओं को वहां से बाहर निकालने में मदद कर सकता है। रिबूटिंग मान को रीसेट कर देगा, या मैन्युअल रूप से पिछले मान के लिए 255 को बदल देगा।

यदि यह मदद करता है, /etc/default/hdparmया /etc/hdparm.confबूट पर सेट करके या अधिक स्थायी कॉन्फ़िगरेशन के लिए जाँच करें ।

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