मेरे एक उत्पादन वातावरण में, हमारे पास RedHat क्लस्टर पर दो इंस्टेंसेस चल रहे हैं, जिसमें क्लस्टर के साथ एक उत्पादन उदाहरण जुड़ा हुआ है।
हमारे पास 24 जी इनमोडी बफर पूल के साथ 1251 मुख्य मेमोरी है, जो कि उदाहरण 1 और 12 जी द्वारा कब्जा कर लिया गया है। यह 2 रेडहैट क्लस्टर से जुड़ा नहीं है। डेटा और लेन-देन लॉग दोनों LVM डिस्क विभाजन पर एक एक्स 3 फ़ाइल सिस्टम के साथ स्थित हैं।
एक प्रदर्शन को बढ़ावा देने और बेहतर I / O थ्रूपुट के लिए मैंने बदलने innodb_flush_method
का फैसला किया है O_DIRECT
।
MySQL प्रलेखन के संदर्भ में:
जहाँ एक सराय पर InnoDB डेटा और लॉग फाइलें स्थित हैं, यह पाया गया है कि तीन के एक कारक द्वारा सरल कथनों के प्रदर्शन
innodb_flush_method
को कमO_DIRECT
कर सकते हैंSELECT
।
उच्च प्रदर्शन MySQL Ver 2 और 3 का उल्लेख करते हुए, यह कहा गया कि InnoDB डेवलपर्स ने उपयोग के साथ बग पाए innodb_flush_method=O_DSYNC
। O_SYNC
और O_DSYNC
इसके समान हैं fsync()
और fdatasync()
: O_SYNC
डेटा और मेटाडेटा दोनों को सिंक करता है, जबकि O_DSYNC
डेटा को केवल सिंक करता है।
यदि यह सब बिना किसी सलाह के बहुत सारे स्पष्टीकरण की तरह लग रहा है, तो यहां सलाह है:
यदि आप एक यूनिक्स-जैसे ऑपरेटिंग सिस्टम का उपयोग करते हैं और आपके RAID नियंत्रक में बैटरी-समर्थित रिटेक है, तो हम अनुशंसा करते हैं कि आप उपयोग करें
O_DIRECT
। यदि नहीं, तो या तो डिफ़ॉल्ट याO_DIRECT
शायद आपके आवेदन के आधार पर सबसे अच्छा विकल्प होगा।
गुग्लिंग द्वारा, मुझे यह बेंचमार्क रिपोर्ट मिली : O_DSYNC
बनामO_DIRECT
बेंच मार्क रिपोर्ट: =================== 1 बी रो कॉम्प्लेक्स ट्रांजेक्शनल टेस्ट, 64 थ्रेड्स * सैन O_DIRECT: पढ़ने / लिखने के अनुरोध: 31560140 (8766.61 प्रति सेकंड)। * सैन O_DSYNC: अनुरोध पढ़ें / लिखें: 5179457 (प्रति सेकंड 1438.52)। * सैन fdatasync: पढ़ने / लिखने के अनुरोध: 9445774 (प्रति सेकंड 2623.66)। * स्थानीय-डिस्क O_DIRECT: पढ़ने / लिखने के अनुरोध: 3258595 (905.06 प्रति सेकंड)। * स्थानीय-डिस्क O_DSYNC: अनुरोध पढ़ें / लिखें: 3494632 (970.65 प्रति सेकंड।) * स्थानीय-डिस्क fdatasync: पढ़ने / लिखने के अनुरोध: 4223757 (1173.04 प्रति सेकंड)।
हालाँकि, O_DIRECT
OS स्तर कैश अक्षम करता है, जहाँ डबल कैशिंग अक्षम किया जा सकता है जो कुछ बेहतर I / O थ्रूपुट दिखाते हैं।
क्या इसके O_DIRECT
बजाय साथ जाना अच्छा है O_DSYNC
? ये दो विकल्प थोड़े भ्रमित करने वाले हैं। कौन सा विकल्प कुछ बेहतर I / O थ्रूपुट दिखा सकता है और प्रदर्शन में वृद्धि के बिना डेटा पर प्रभाव पढ़ सकता है, विशेष रूप से उत्पादन में पढ़ता / लिखता है? आपके व्यक्तिगत अनुभव के आधार पर कोई बेहतर सुझाव?
मैं पोस्ट में रोलैंडो अपडेट देख सकता था :
फिर भी इन दोनों मापदंडों पर थोड़ा भ्रम है। जहाँ मैं अधिकांश उत्पादन विन्यास टेम्प्लेट का उपयोग करके देख सकता था
O_DIRECT
, वहाँ मैंने कोई सिफारिश नहीं देखीO_DSYNC
।
प्रणाली
- MySQL 5.1.51-एंटरप्राइज़-जीपीएल-प्रो-लॉग
- Red Hat Enterprise Linux सर्वर रिलीज़ 5.5
- छापे नियंत्रक के साथ डीआईएल डीआरएसी जिसमें बैटरी बैक कैश 512MB है
- डेल पीईआरसी एक बैटरी बैक-अप यूनिट (बीबीयू) के साथ H700 को नियंत्रित करता है।
अतिरिक्त जानकारी
mysql> 'innodb_thread_concurrency' जैसे वैरिएबल दिखाएं; + --------------------------- + ------- + | चर_नाम | मान | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 पंक्ति में सेट (0.00 सेकंड) mysql> 'innodb_read_io_threads' जैसे चर दिखाते हैं; खाली सेट (0.00 सेकंड) mysql> 'innodb_write_io_threads' जैसे चर दिखाएं; खाली सेट (0.00 सेकंड)
हम डिफ़ॉल्ट प्लगइन का उपयोग कर रहे हैं, इसलिए मैंने InnoDB स्थिति से जानकारी पोस्ट की है:
mysql> चयन करें * प्लग इन से जहां PLUGIN_NAME '% innodb%' और PLUGIN_TYPE 'STORAGE इंजन' \ G को पसंद करता है ************************** 1. पंक्ति ********************* ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: सक्रिय करें PLUGIN_TYPE: भंडारण इंजन PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase ओए PLUGIN_DESCRIPTION: लेनदेन, पंक्ति-स्तरीय लॉकिंग और विदेशी कुंजियों का समर्थन करता है PLUGIN_LICENSE: GPL 1 पंक्ति में सेट (0.00 सेकंड)