MySQL innorb_flush_method चर पर स्पष्टीकरण


21

मुझे यह स्वीकार करने से शुरू करें कि मैं हार्ड डिस्क के आंतरिक कामकाज से बहुत अनजान हूं। इसलिए जब मैंने चर innodb_flush_method के लिए मैनुअल पर पढ़ा , तो उसने मुझे भ्रमित कर दिया। क्या मुझे O_DSYNC और O_DIRECT में अंतर पर आम आदमी की शर्तों में एक स्पष्टीकरण मिल सकता है, और यह कैसे पता चलेगा कि यह डेटाबेस सर्वर पर एक प्रदर्शन समस्या है।

मेरे सेटअप के कुछ आँकड़े: मैक OSX 10.6 (32-बिट कर्नेल, चूंकि आर्किटेक्चर पुराना है) MySQL 5.1.49-64bit चल रहा है (उम्मीद है कि यह मुझे मेमोरी का उपयोग करने की अनुमति देगा)। 8 जीबी रैम, ~ 6 जीबी के मासूम डेटा / इंडेक्स।


2
मुझे नहीं पता कि क्या मैक ओएस एक्स एक उचित प्रत्यक्ष आईओ विकल्प का समर्थन करता है - मुझे नहीं लगता कि यह किया था। आप आज जिस दूसरे व्यक्ति को देख रहे हैं, उस मैनुअल पेज से भ्रमित हो रहे हैं। मेरे पास यहाँ पर एक खुला बग है: Bugs.mysql.com/bug.php?id=54306
Morgan Tocker

जवाबों:


16

यहाँ एक विवरण है कि कैसे fdatasync()काम करता है बनाम कैसे fsync()काम करता है

fdatasync()फ़ाइल के सभी डेटा बफ़र्स को डिस्क (सिस्टम कॉल रिटर्न से पहले) को फ्लश करता है। यह जैसा दिखता है, fsync()लेकिन मेटाडेटा को अपडेट करने के लिए आवश्यक नहीं है, जैसे कि एक्सेस टाइम। डेटाबेस या लॉग फ़ाइलों तक पहुंचने वाले एप्लिकेशन अक्सर एक छोटा डेटा टुकड़ा लिखते हैं (जैसे, एक लॉग फ़ाइल में एक लाइन) और फिर fsync()तुरंत कॉल करें ताकि यह सुनिश्चित हो सके कि लिखित डेटा हार्डडिस्क पर संग्रहीत है। दुर्भाग्य से, fsync()हमेशा दो लेखन कार्य आरंभ करेंगे

  • नव लिखित डेटा के लिए एक लेखन ऑपरेशन
  • इनोड में संग्रहीत संशोधन समय को अद्यतन करने के लिए एक लेखन ऑपरेशन

यदि संशोधन समय लेन-देन की अवधारणा का हिस्सा नहीं है, तो fdatasync()अनावश्यक इनकोड डिस्क लिखने के संचालन से बचने के लिए उपयोग किया जा सकता है।

अंग्रेजी में, O_DSYNCतेजी से है O_DIRECTके बाद से O_DIRECTकॉल fsync()दो बार (लॉग के लिए और एक डेटा के लिए) और fsync()दो लिखने के संचालन के माध्यम से सत्यापन डेटा लिखता है। का उपयोग करते हुए O_DSYNCकॉल fdatsync()और fsync()। आप fdatasync()एक एसिंक्रोनस fsync()(डेटा सत्यापित नहीं कर रहे हैं) करने के बारे में सोच सकते हैं ।

संख्याओं को देखते हुए, O_DSYNCचार ऑप्स लिखते हैं, जिनमें से दो को सत्यापित किया जाता है, जबकि fsync()चार राइट्स ऑपरेशन, सभी को बाद में सत्यापित किया जाता है ।

निष्कर्ष

  • O_DSYNC
    • की तुलना में तेज O_DIRECT
    • विलंबता या एकमुश्त दुर्घटना के कारण डेटा संगत नहीं हो सकता है
  • O_DIRECT
    • ज्यादा स्थिर
    • डेटा संगत
    • स्वाभाविक रूप से धीमा

मुझे उम्मीद है कि यह उत्तर मदद करता है, और मुझे आशा है कि मैंने आपके लिए चीजों को बदतर नहीं किया।


2
इंगित करने के लायक: O_DIRECT का उपयोग केवल टेबल-स्पेस फाइलों पर किया जाता है, लॉग पर नहीं। इसके अलावा - O_DIRECT उपयोगी होने जा रहा है या नहीं यह हार्डवेयर पर निर्भर करता है। मैं लेखक के सवाल के लिए एक टिप्पणी के रूप में एक खुले दस्तावेज़ बग से जुड़ा हुआ हूं।
मॉर्गन Tocker

यह स्पष्ट करने के लिए धन्यवाद, मॉर्गन। मैं इसे ठीक कर दूंगा।
रोलैंडम्यूसीडीडीबीए

O_DSYNC समकालिक है, आप यह कैसे निष्कर्ष निकाल सकते हैं कि यह अतुल्यकालिक + fsync है?
noonex

@noonex fdatasync () इसके डेटा के लिए समकालिक है, इसके मेटाडेटा के लिए नहीं। Informit.com/articles/article.aspx?p=23618&seqNum=5 के अनुसार , This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.जिस समय मैंने अपनी पोस्ट 3.5 वर्ष पहले लिखी थी, यह सच था, खासकर लिनक्स के पुराने संस्करणों के साथ।
रोलैंडमाइसीडीडीबीए

@noonex en.wikipedia.org/wiki/Sync_(Unix) के अनुसार , The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.(यह विकी अंतिम बार 28 जुलाई, 2014 को अपडेट किया गया था)।
RolandoMySQLDBA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.