अलग-अलग गति वाले डिस्क के साथ एक फाइल सिस्टम के साथ कैश कैसे काम करता है?


9

कई डिस्क और एक सॉफ्टवेयर RAID के साथ एक आधुनिक लिनक्स सिस्टम पर धीमी (HDD) और फास्ट (SSD) ड्राइव दोनों को फैलाया जाता है, फाइल सिस्टम को कैसे लिखा जाता है?

Md-raid RAID1 के लिए सरणी को डिस्क के रूप में कॉन्फ़िगर किया जा सकता है --write-mostlyऔर --write-behindजो यह बताता है कि रीड्स को तेज डिस्क से किया जाता है, और यह धीमी डिस्क पर लिखता है। लेकिन यह कैसे कर्नेल स्तर पर कैश किया गया है? क्या कर्नेल कैश md-raid लेयर से पहले या बाद में लिखता है? एक लिखने के अंत में () कॉल डेटा को एक नहीं- --write-behindडिस्क को लिखे जाने की गारंटी है ?

एक के लिए btrfsRAID1 कैसे एक ही स्थिति बाहर अदा कर सकता है? कोई --write-behindकार्यक्षमता नहीं है, इसलिए डिवाइस स्तर या फ़ाइल सिस्टम स्तर पर गिने जाने वाले गंदे पृष्ठ हैं? किस बिंदु पर एक लेखन () वापस आएगा?

vm.dirty_*ratioट्यून इन सेटअपों को कैसे प्रभावित करते हैं?

जवाबों:


7

--write-mostly, --write-behindद्वारा नियंत्रित किया जाता mdचालक आंतरिक रूप से। mdमेटाडेटा रखता है, जैसे कि राइट-इंट्रेंस बिटमैप (जो राइट-बैक फीचर के लिए अनिवार्य है) जो मूल रूप से लॉग करता है कि कौन सा डेटा अभी तक लिखा गया है। कौन सा डेटा अभी भी गायब है। बिजली हानि की घटना होने पर यह आवश्यक है, जब डेटा अभी तक ज्यादातर उपकरणों तक नहीं पहुंचा है। उस स्थिति में प्रभावित डेटा क्षेत्र फिर से सिंक हो जाएगा (आपके मामले में एसएसडी से पढ़ा गया, एचडीडी को लिखें)।

लेकिन यह कैसे कर्नेल स्तर पर कैश किया गया है?

लिखने के पीछे के मामले के लिए, md ड्राइवर मूल रूप से आंतरिक रूप से लिखने के अनुरोध को दोहराता है। मास्टर लिखने का अनुरोध प्राथमिक ड्राइव पर जाता है और ऊपरी परतों को बताता है "ठीक है मैंने यह पहले ही कर लिया है"; कॉपी किए गए राइट रिक्वेस्ट फिर लिखने के लिए ज्यादातर RAID के पीछे-पीछे घूमता रहता है और बिना किसी सूचना के उम्मीद के मुताबिक पूरा होने में अधिक समय लग सकता है।

फिर छापे की परत बहुत सारे कदम उठाती है, यह सुनिश्चित करने के लिए कि कोई भी डेटा लेखन-अधिकतर डिवाइस से नहीं पढ़ा जाएगा, जबकि कतार में अभी भी लंबित लेखन-पीछे अनुरोध हैं। डेटा ज्यादातर राइट-डिवाइस से क्यों पढ़ा जाएगा? ठीक है, SSD विफल हो सकता है तो यह सब वहाँ छोड़ दिया है। यह जटिल है, और लिखने के पीछे कुछ कोने के मामलों का परिचय देता है।

जो शायद यह भी है कि यह केवल RAID -1 स्तर के लिए समर्थित है, दूसरों में से कोई भी नहीं। यद्यपि SSDs को अनिवार्य रूप से RAID-0 और दो-समानता HDDs के रूप में लिखने-पीछे मोड में होने के लिए सिद्धांत रूप में यह समझ में आता है, इस तरह लिखने के पीछे RAID-6 के लिए कोई समर्थन नहीं है। यह केवल RAID-1 है और शायद ही कभी इसका उपयोग किया जाता है।

अन्य कैश सेटिंग्स इससे अप्रभावित रहती हैं, मूल रूप से समग्र कैशिंग तंत्र को इस बात की कोई परवाह नहीं है कि mdड्राइवर ने आंतरिक रूप से चीजों को कैसे लागू किया है। कैश अपना काम करता है और md अपना काम करता है। तो एक फाइलसिस्टम कैशे md के ऊपर एक फाइलसिस्टम के लिए एक ही काम करता है। एक नंगे ड्राइव के ऊपर एक फाइलसिस्टम। (वास्तविकता इससे कहीं अधिक जटिल है, लेकिन आप इसे इस तरह से सोच सकते हैं।)


3

Md-raid RAID1 के लिए सरणी को डिस्क के रूप में कॉन्फ़िगर किया जा सकता है --write-mostlyऔर --write-behindजो यह बताता है कि रीड्स को तेज डिस्क से किया जाता है, और यह धीमी डिस्क पर लिखता है। लेकिन यह कैसे कर्नेल स्तर पर कैश किया गया है? क्या कर्नेल कैश md-raid लेयर से पहले या बाद में लिखता है?

बाद, चूंकि यह सुविधा md-छापे के लिए विशिष्ट है।

आपको इस md-raid फीचर के बारे में सोचना चाहिए बफ़रिंग के रूप में, कैशिंग नहीं। यह निम्नलिखित mdadmविकल्प से घिरा है :

--write-पीछे =

निर्दिष्ट करें कि राइट-बैक मोड सक्षम होना चाहिए (केवल RAID1 के लिए मान्य)। यदि किसी तर्क को निर्दिष्ट किया जाता है, तो वह अधिकतम संख्या में उत्कृष्ट लिखी गई अनुमतियों को सेट करेगा। डिफ़ॉल्ट मान 256 है।

मैं केवल यह सोच सकता हूं कि यह सामान्य कर्नेल और हार्डवेयर बफ़रिंग द्वारा सीमित है (यानी यदि वह छोटा है)। सामान्य कर्नेल बफ़रिंग द्वारा बाध्य है nr_requestsऔर max_hw_sectors_kb। देखते हैं /sys/class/block/$write_behind_device/queue/। हार्डवेयर बफरिंग से मेरा मतलब ड्राइव पर कैश लिखना है।

एक लिखने के अंत में () कॉल डेटा को एक नहीं- --write-behindडिस्क को लिखे जाने की गारंटी है ?

बेशक, आपको लगता है कि लिखने का मतलब है () O_SYNC / O_DSYNC के साथ खोली गई फ़ाइल पर था, या आप वास्तव में लिखना चाहते थे () + fsync ()। यदि नहीं, तो कोई गारंटी बिल्कुल लागू नहीं होती है।


धन्यवाद, लेकिन यह एक और सवाल खड़ा करता है: यदि फ़ाइल O_SYNC के साथ खोली गई थी, तो क्या पहली डिस्क के लिखे जाने के बाद या (इस मामले में सभी डिस्क को लिखा गया है) लिखता है?
स्टीव

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