डिस्क पर डेटा लिखने में देरी के पीछे दर्शन क्या है?


72

लिनक्स में, कमांड का एक अंतिम निष्पादन जैसे कि cpया ddमतलब यह नहीं है कि डेटा डिवाइस को लिखा गया है। उदाहरण के लिए, syncड्राइव पर "सुरक्षित रूप से हटाएं" या "बेदखल करना" फ़ंक्शन को कॉल करना है ।

इस तरह के दृष्टिकोण के पीछे दर्शन क्या है? एक बार में डेटा क्यों नहीं लिखा गया? क्या कोई खतरा नहीं है कि I / O त्रुटि के कारण लेखन विफल हो जाएगा?


16
याद रखें कि सिस्टम कॉल और रीड एंड राइट एक बार में एक बाइट के साथ काम कर सकते हैं, लेकिन डिस्क ड्राइव केवल निश्चित आकार के ब्लॉक को पढ़ या लिख ​​सकते हैं। एक समय में बाइट के लिए ओवरहेड I / O बफरिंग के बिना असहनीय होगा। बफरिंग के साथ, यह सहने योग्य है।
जोनाथन लेफ़लर

जवाबों:


47

इस तरह के दृष्टिकोण के पीछे दर्शन क्या है?

दक्षता (डिस्क विशेषताओं का बेहतर उपयोग) और प्रदर्शन (एप्लिकेशन को लिखने के तुरंत बाद जारी रखने की अनुमति देता है)।

एक बार में डेटा क्यों नहीं लिखा गया?

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

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

क्या कोई खतरा नहीं है कि IO त्रुटि के कारण लेखन विफल हो जाएगा?

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

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

दूसरी ओर, बहुत अधिक उपयोगकर्ताओं और अनुप्रयोगों को न तो सुरक्षा की आवश्यकता होती है और न ही उस सुरक्षा की परवाह होती है जो सिंक्रोनस लिखते हैं। यदि कोई क्रैश या पावर आउटेज है, तो अंतिम 30 सेकंड के डेटा को खोने का खतरा अक्सर होता है। जब तक कोई वित्तीय लेन-देन शामिल नहीं होता है या ऐसा ही कुछ होता है जो उनके समय के 30 सेकंड से बहुत अधिक लागत होगी, प्रदर्शन में भारी लाभ (जो भ्रम नहीं है लेकिन बहुत वास्तविक है) अतुल्यकालिक लिखते हैं, जो बड़े पैमाने पर जोखिम को कम करने की अनुमति देता है।

अंत में, तुल्यकालिक लेखन वैसे भी लिखे गए डेटा की सुरक्षा के लिए पर्याप्त नहीं है। क्या आपके आवेदन को वास्तव में यह सुनिश्चित करने की आवश्यकता है कि जो कुछ भी होता है, उनका डेटा खो न जाए, कई डिस्क पर डेटा प्रतिकृति और कई भौगोलिक स्थानों पर आग, बाढ़, आदि जैसी आपदाओं का विरोध करने के लिए जगह की आवश्यकता होती है।


लागत के साथ-साथ इस बात पर विचार करें कि क्या कुछ ऐसा किया गया है जो सहेजे गए डेटा पर निर्भर करता है। यदि मैं अपने उपन्यास पर टाइप कर रहा हूं, क्रमिक रूप से बचत कर रहा हूं, और पावर-कट का मतलब है कि मैं काम के 30 सेकंड खो देता हूं, तो उस 30 सेकंड के मूल्य की परवाह किए बिना मैं उस राज्य को पुनर्प्राप्त करता हूं जो वास्तव में टाइपिंग की प्रक्रिया के दौरान हुआ था , और मैं वहां से फिर से शुरू कर सकता हूं। दूसरी ओर, अगर मैं "सेव" को हिट करता हूं और फिर अपने डेस्क पर अपने पेपर टूडू लिस्ट से कुछ पार करता हूं, तो जब मैं ठीक होता हूं तो मेरी हार्ड डिस्क और मेरे पेपर के बीच असंगतता होती है। यह आम तौर पर फिर से शुरू करने के लिए कठिन है ...
स्टीव जेसप

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

1
@SteveJessop मैं आपके उदाहरण से सहमत हूं लेकिन मैं एक आकस्मिक उपयोगकर्ता से मैन्युअल रूप से सिंक करने की उम्मीद नहीं करूंगा। यदि संपादक कीमती उपन्यास लिखने के लिए उपयोग किया जाता है, तो fsync या समान नहीं है जब दस्तावेज़ सहेजा जाता है, तो यह तय किया जाने वाला एक बग है, जैसे कि बगसलाउन्चैड.नेट /ubuntu/+source/libreoffice/+bug/832326 । मैं vi (vim) का उपयोग मेरा लिखने के लिए करेगा, vim डिफ़ॉल्ट रूप से सहेजने पर fsync कॉल करता है।
jlliagre

59

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

कभी-कभी फाइलें केवल अस्थायी रूप से मौजूद होती हैं ... एक प्रोग्राम कुछ काम करता है और काम पूरा होने के तुरंत बाद फाइल को हटा देता है। यदि आप उन लिखने में देरी करते हैं, तो आप उन्हें पहले स्थान पर कभी नहीं लिखने के साथ दूर हो सकते हैं।

क्या कोई खतरा नहीं है कि IO त्रुटि के कारण लेखन विफल हो जाएगा?

ओह, बिल्कुल। इस तरह के मामले में, आमतौर पर पूरा फाइल सिस्टम रीड-ओनली मोड में चला जाता है, और सब कुछ भयानक होता है। लेकिन ऐसा शायद ही कभी होता है, सामान्य तौर पर प्रदर्शन के फायदों को खोने का कोई मतलब नहीं है।


कुछ HDD नियंत्रकों में बैटरी बैकअप होता है, इसलिए बिजली की विफलता की स्थिति में जब तक कि बिजली बहाल नहीं हो जाती तब तक नियंत्रक पर संरक्षित डेटा संरक्षित रहता है। यह उन डेटाबेस अनुप्रयोगों में उपयोग की अनुमति देता है जहां डेटा खोना एक विकल्प नहीं है।
स्ट्रेटनॉ

लिनक्स स्टोर डेटा को अभी तक रैम में नहीं लिखा है, एचडीडी में नहीं। एचडीडी के पास अपना कैश भी है।
बारफू अल्बिनो

यदि प्रक्रिया बंद हो जाती है तो किसी भी फ़ाइल को किसी प्रक्रिया द्वारा खोलना काफी सुविधाजनक होगा। यह स्वयं प्रक्रिया को प्रभावित नहीं करेगा, लेकिन यह शेल स्क्रिप्ट को सरल करेगा और जैसे (जिसे अब संपूर्ण फाइलसिस्टम को सिंक करना है)
MSalters

14
यह एक भ्रम से अधिक है। एसिंक्रोनस राइट्स अनुप्रयोगों के समग्र प्रदर्शन में सुधार करता है।
jlliagre

4
@frostschutz: केवल अस्थायी रूप से मौजूद फ़ाइलों के अलावा, यह भी तथ्य है कि फाइलों के कुछ क्षेत्रों को बार-बार लिखा जाता है।
Matthieu एम।

26

अतुल्यकालिक, बफ़र्ड I / O लिनक्स से पहले और यूनिक्स से पहले भी उपयोग में था। यूनिक्स के पास था, और इसलिए इसके सभी ऑफशूट हैं।

यहाँ रिची और थॉम्पसन ने अपने सीएसीएम पेपर द यूनिक्स टाइम-शेयरिंग सिस्टम में लिखा है :

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


अपने प्रश्न में, आपने यह भी लिखा:

क्या कोई खतरा नहीं है कि IO त्रुटि के कारण लेखन विफल हो जाएगा?

हां, लेखन विफल हो सकता है और कार्यक्रम कभी भी इसके बारे में नहीं जान सकता है। हालांकि कभी भी अच्छी बात नहीं है, इस के प्रभाव को उन मामलों में कम से कम किया जा सकता है जहां I / O त्रुटि एक सिस्टम पैनिक उत्पन्न करती है (कुछ OS'es पर यह कॉन्फ़िगर करने योग्य है - घबराने के बजाय, सिस्टम चलना जारी रख सकता है लेकिन प्रभावित फाइलसिस्टम है अनमाउंट या माउंटेड रीड-ओनली)। उपयोगकर्ताओं को तब सूचित किया जा सकता है कि उस फाइलसिस्टम का डेटा संदिग्ध है। और एक डिस्क ड्राइव को नियमित रूप से मॉनिटर किया जा सकता है यह देखने के लिए कि क्या इसकी बढ़ी हुई दोष सूची तेजी से बढ़ रही है, जो एक संकेत है कि ड्राइव विफल हो रहा है।

बीएसडी ने fsyncसिस्टम कॉल को जोड़ा ताकि एक कार्यक्रम निश्चित हो सके कि आगे बढ़ने से पहले इसका फ़ाइल डेटा पूरी तरह से डिस्क पर लिखा गया था, और बाद में यूनिक्स सिस्टम ने सिंक्रोनस राइट्स करने के लिए विकल्प प्रदान किए हैं। GNU dd के पास conv=fsyncयह सुनिश्चित करने का विकल्प है कि कमांड के बाहर निकलने से पहले सभी डेटा को लिख दिया गया है। यह हटाने योग्य फ्लैश ड्राइव पर लिखते समय काम आता है, जहां बफर डेटा को लिखने में कई मिनट लग सकते हैं।

फ़ाइल भ्रष्टाचार का एक अन्य स्रोत अचानक सिस्टम बंद है, उदाहरण के लिए बिजली की हानि। वस्तुतः सभी वर्तमान प्रणालियाँ अपने फाइल सिस्टम में साफ / गंदे झंडे का समर्थन करती हैं । ध्वज को तब साफ करने के लिए सेट किया जाता है जब कोई और डेटा नहीं लिखा जाता है और फाइल सिस्टम अनमाउंट होने वाला होता है, आमतौर पर सिस्टम शटडाउन के दौरान या मैन्युअल रूप से कॉल करने से umount। सिस्टम आमतौर fsckपर रिबूट पर चलेंगे यदि वे पता लगाते हैं कि फाइलसिस्टम साफ बंद नहीं थे।


मान लें कि हम HDD से बाहरी ड्राइव पर संगीत की प्रतिलिपि बनाते हैं। ऐसा हो सकता है कि बाहरी ड्राइव भ्रष्ट है और लेखन विफल हो जाएगा। यह गलत डेटा के साथ प्रोग्राम चलाने का कारण नहीं होगा। और यह एक बाहरी डिवाइस पर एक असफल IO पर आतंक करने के लिए एक overkill लगता है।
मर्मिस्ट्ज़

अच्छी बात। मैं अपना उत्तर संशोधित करूंगा।
मार्क प्लॉटनिक

15

कई अच्छे उत्तर, लेकिन मुझे एक और बात जोड़ने दें ... याद रखें कि यूनिक्स एक बहु-प्रक्रिया और बहु-उपयोगकर्ता प्रणाली है, इसलिए संभावित रूप से कई उपयोगकर्ता (लगभग) फ़ाइल-संचालन (एस्प) लिखते हैं। उसी समय। पुराने धीमे हार्ड-डिस्क के साथ - शायद नेटवर्क पर माउंट किया गया है - इसमें न केवल समय लगेगा (जिसके लिए प्रोग्राम मूल रूप से लॉक-अप और उपयोगकर्ताओं को इंतजार करना होगा), लेकिन रीड / राइट-हेड को स्थानांतरित करने के बहुत सारे कारण आगे और पीछे डिस्क।

इसलिए इसके बजाय, लिखित प्रतीक्षा की जाने वाली फाइलों को कुछ समय के लिए मेमोरी में रखा जाता था, और इसके बाद छाँटा जाता था , जहां उन्हें डिस्क पर अंत-अप करना चाहिए ... और जब बफर भरा था - या डिस्क-सिंक डेमॉन ने प्रतीक्षा की थी आवश्यक सेकंड की संख्या (मुझे लगता है कि यह आमतौर पर 30 सेकंड के बारे में था) - पूरे बफर को डिस्क में "क्रम में" लिखा गया था, राइट-हेड के साथ केवल एक निरंतर व्यापक गति करने के लिए, फाइलों को डिस्क के रूप में लिखना यह चला गया ... सभी जगह कूदने के बजाय।

आज के तेजी से डिस्क के साथ - ठोस-राज्य उपकरणों का उल्लेख नहीं करने के लिए - लाभ बहुत कम है ... स्पष्ट रूप से एक घर के लिनक्स सिस्टम पर, जहां एक समय में केवल एक उपयोगकर्ता काम कर रहा है, और केवल कुछ कार्यक्रमों के साथ।

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


2
एक्सएफएस यह भी तय नहीं करता है कि राइटआउट तक डेटा कहां रखा जाए। विलंबित-आवंटन आवंटनकर्ता को अपने निर्णयों को आधार बनाने के लिए बहुत अधिक जानकारी देता है। जब कोई फ़ाइल पहली बार लिखी जा रही है, तो यह जानने का कोई तरीका नहीं है कि यह एक 4k फ़ाइल या 1G-and-still-बढ़ती फाइल होगी। अगर कहीं पर 10G सन्निहित खाली जगह है, तो इसकी शुरुआत में 4k फ़ाइल डालना अच्छा नहीं है। बड़ी फ़ाइल को एक बड़े खाली स्थान की शुरुआत में रखने से विखंडन कम हो जाता है।
पीटर कॉर्डेस

13

यह लिनक्स के लिए विशिष्ट नहीं है, और इसे पेज कैश कहा जाता है (जो लिनक्स काफी अच्छा करता है)। Http://linuxatemyram.com/ भी देखें ; इसलिए यदि कोई फ़ाइल लिखी जाती है, तो कुछ सेकंड बाद फिर से पढ़ें, बहुत बार डिस्क I / O की आवश्यकता नहीं होती है।

मुख्य लाभ यह है कि कई प्रणालियों पर, बहुत सी रैम है, और इसमें से कुछ को कर्नेल द्वारा कैश के रूप में उपयोग किया जा सकता है। तो कुछ फाइल ऑपरेशन इस कैशिंग का लाभ ले सकते हैं। इसके अलावा, डिस्क I / O समय बहुत अधिक धीमा है (आमतौर पर SDD के लिए कई हजार बार, और मैकेनिकल हार्ड डिस्क के लिए लगभग एक लाख गुना धीमा) RAM की तुलना में।

एप्लिकेशन कोड इस कैशिंग के बारे में संकेत दे सकता है: उदाहरण के लिए देखें posix_fadvise (2) और madvise (2)


8

कताई पट्टियाँ रैम की तुलना में धीमी होती हैं। हम इस तथ्य को 'छिपाने' के लिए रीडिंग / राइटिंग का उपयोग करते हैं।

IO लिखने के बारे में उपयोगी बात यह है कि इसे तुरंत पढ़ने के लिए डिस्क IO की आवश्यकता नहीं है - एक रीड के विपरीत, जहां आप उपयोगकर्ता को डिस्क पर पूरा होने तक डेटा वापस नहीं कर सकते।

इस प्रकार लिखते हैं कि एक नरम समय की कमी के तहत काम करते हैं - जब तक कि हमारी निरंतर थ्रूपुट हमारी डिस्क से अधिक नहीं होती है, हम एक लेखन कैश में बहुत सारे प्रदर्शन दंड छिपा सकते हैं।

और हमें कैश लिखने की ज़रूरत है - स्पिनिंग डिस्क तुलनात्मक रूप से बहुत धीमी है। लेकिन ऐसा करने के लिए आधुनिक RAID प्रकार के संचालन के लिए एक महत्वपूर्ण जुर्माना है।

एक RAID 6 उदाहरण के लिए, एक लिखने के लिए IO को पूरा करना होगा:

  • अद्यतन ब्लॉक पढ़ें
  • पठन पठन १
  • समता 2 पढ़ें
  • नया ब्लॉक लिखें
  • लिखना समता १
  • समता लिखो २

इस प्रकार प्रत्येक लेखन वास्तव में 6 आईओ संचालन है - और विशेष रूप से जब आपको बड़े एसएटीए ड्राइव की तरह धीमी डिस्क मिली है, तो यह बहुत महंगा हो जाता है।

लेकिन वहाँ एक अच्छा आसान समाधान है - लिखना coalescing। यदि आप एक बफर में 'पूर्ण पट्टी' लिख सकते हैं, तो आपको अपनी डिस्क से समता को पढ़ने की आवश्यकता नहीं है - आप इसकी गणना कर सकते हैं कि आपके पास स्मृति में क्या है।

ऐसा करने के लिए यह बहुत ही वांछनीय है, क्योंकि तब आपके पास कोई प्रवर्धन नहीं है। वास्तव में, आप RAID 1 + 0 की तुलना में कम लेखन दंड के साथ समाप्त कर सकते हैं।

विचार करें:

RAID 6, 8 + 2 - 10 स्पिंडल।

लिखने के लिए 8 लगातार डेटा ब्लॉक - कैश में समता की गणना करें, और प्रत्येक डिस्क पर एक ब्लॉक लिखें। 10 प्रति 8 लिखता है, का अर्थ है 1.25 का जुर्माना। RAID 1 + 0 के 10 डिस्क्स में अभी भी 2 का लिखित जुर्माना है (क्योंकि आपको प्रत्येक सबमिरर को लिखना होगा)। तो इस परिदृश्य में, आप वास्तव में RAID 6 को RAID1 + 0 से बेहतर प्रदर्शन कर सकते हैं। वास्तविक दुनिया के उपयोग में, आपको मिश्रित IO प्रोफ़ाइल का थोड़ा अधिक हिस्सा मिलता है।

तो लिख कैशिंग RAID सेट के कथित प्रदर्शन के लिए एक बड़ा अंतर बनाता है - आप राम की गति पर लिखने के लिए और कम लिखने का जुर्माना है - अगर आप ऐसा करते हैं तो आपके निरंतर थ्रूपुट में सुधार होता है।

और यदि आप नहीं करते हैं, तो आप एसएटीए के धीमी गति से प्रदर्शन को पीड़ित करते हैं, लेकिन इसे 6 से गुणा करें और वहां कुछ विवाद जोड़ें। आपका 10 तरीका SATA RAID-6 बिना किसी कैशिंग के बिना एक ही ड्राइव से थोड़ा तेज होगा ... लेकिन बहुत ज्यादा नहीं।

आप हालांकि एक जोखिम लेते हैं - जैसा कि आप ध्यान दें - पावर लॉस का मतलब डेटा लॉस है। आप इसे कैश फ्लशिंग साइकल, बैटरी को कैश करके या SSD या अन्य गैर-वाष्पशील कैश का उपयोग करके कम कर सकते हैं।


7

अन्य किसी भी उत्तर में विलंबित आवंटन का उल्लेख नहीं किया गया है । XFS, ext4, BTRFS और ZFS सभी इसका उपयोग करते हैं। एक्सएफ 4 अस्तित्व में आने से पहले से इसका उपयोग कर रहा है, इसलिए मैं इसे उदाहरण के रूप में उपयोग करूंगा:

एक्सएफएस यह भी तय नहीं करता है कि राइटआउट तक डेटा कहां रखा जाए। विलंबित-आवंटन आवंटनकर्ता को अपने निर्णयों को आधार बनाने के लिए बहुत अधिक जानकारी देता है। जब कोई फ़ाइल पहली बार लिखी जा रही है, तो यह जानने का कोई तरीका नहीं है कि यह एक 4k फ़ाइल या 1G-and-still-बढ़ती फाइल होगी। अगर कहीं पर 10G सन्निहित खाली जगह है, तो इसकी शुरुआत में 4k फ़ाइल डालना अच्छा नहीं है। बड़ी फ़ाइल को एक बड़े खाली स्थान की शुरुआत में रखने से विखंडन कम हो जाता है।


4

यहाँ सभी अन्य उत्तर सामान्य मामले के लिए न्यूनतम अधिकतर सही हैं, और मैं उनमें से किसी को भी पढ़ने से पहले सलाह दूंगा, लेकिन आपने dd और dd में एक विशिष्ट उपयोग का मामला बताया है जिसमें मई कैशिंग शामिल नहीं है। कैशिंग लिखें मुख्य रूप से फाइलसिस्टम स्तर पर लागू किया जाता है। कच्चे उपकरण सामान्य रूप से कैशिंग नहीं लिखते हैं (कई डिवाइस ड्राइवर जैसे छापे या lvm मोम की एक और गेंद हैं)। चूंकि dd का उपयोग अक्सर कच्चे ब्लॉक उपकरणों के साथ किया जाता है, इसलिए यह bs और संबंधित विकल्पों को कच्चे उपकरणों पर बेहतर प्रदर्शन के लिए बड़े लेखन की अनुमति देता है। यह तब उपयोगी नहीं है जब दोनों एंडपॉइंट नियमित फाइलें हैं (हालांकि बड़े लिखते हैं कि इस मामले में कम सिस्टम कॉल का उपयोग किया जाता है)। दूसरी आम जगह जहां यह विशेष रूप से दिखाई देता है, वह mtools पैकेज के साथ है जो कि एक यूजरस्पेस फैट फाइल सिस्टम कार्यान्वयन है। फ्लॉपी ड्राइव के साथ mtools का उपयोग करना हमेशा अविश्वसनीय रूप से सुस्त लगता है क्योंकि उपकरण पूरी तरह से तुल्यकालिक होते हैं और फ्लॉपी ड्राइव अविश्वसनीय रूप से धीमा होते हैं। फ्लॉपी को माउंट करना और कर्नेल वसा फ़ाइल सिस्टम का उपयोग करना umount को छोड़कर अधिक उत्तरदायी है जो तुल्यकालिक है (और इसके लिए डेटा हानि को रोकने के लिए बहुत महत्वपूर्ण है, विशेष रूप से हटाने योग्य डिवाइस जैसे फ्लॉपी के लिए)। केवल कुछ अन्य कार्यक्रम हैं जो मुझे नियमित रूप से कच्चे उपकरणों के साथ उपयोग किए जाने के बारे में पता है जैसे विशेष रूप से कॉन्फ़िगर किए गए डेटाबेस (जो अपने स्वयं के लेखन कैशिंग को लागू करते हैं), टार, और विशेष उपकरण और फाइलसिस्टम उपकरण जैसे कि चडस्क, एमकेएफएस और एमटी। फ्लॉपी को माउंट करना और कर्नेल वसा फ़ाइल सिस्टम का उपयोग करना umount को छोड़कर अधिक उत्तरदायी है जो तुल्यकालिक है (और इसके लिए डेटा हानि को रोकने के लिए बहुत महत्वपूर्ण है, विशेष रूप से हटाने योग्य डिवाइस जैसे फ्लॉपी के लिए)। केवल कुछ अन्य कार्यक्रम हैं जो मुझे नियमित रूप से कच्चे उपकरणों के साथ उपयोग किए जाने के बारे में पता है जैसे विशेष रूप से कॉन्फ़िगर किए गए डेटाबेस (जो अपने स्वयं के लेखन कैशिंग को लागू करते हैं), टार, और विशेष उपकरण और फाइलसिस्टम उपकरण जैसे कि चडस्क, एमकेएफएस और एमटी। फ्लॉपी को माउंट करना और कर्नेल वसा फ़ाइल सिस्टम का उपयोग करना umount को छोड़कर अधिक उत्तरदायी है जो तुल्यकालिक है (और इसके लिए डेटा हानि को रोकने के लिए बहुत महत्वपूर्ण है, विशेष रूप से हटाने योग्य डिवाइस जैसे फ्लॉपी के लिए)। केवल कुछ अन्य कार्यक्रम हैं जो मुझे नियमित रूप से कच्चे उपकरणों के साथ उपयोग किए जाने के बारे में पता है जैसे विशेष रूप से कॉन्फ़िगर किए गए डेटाबेस (जो अपने स्वयं के लेखन कैशिंग को लागू करते हैं), टार, और विशेष उपकरण और फाइलसिस्टम उपकरण जैसे कि चडस्क, एमकेएफएस और एमटी।


4
लिनक्स ब्लॉक डिवाइस डिफ़ॉल्ट रूप से पेज कैश को पढ़ / लिखते हैं। O_DIRECTयदि आप कैश को बायपास करना चाहते हैं तो आपको इसका उपयोग करना होगा। dd oflag=direct। IIRC, ब्लॉक उपकरणों पर I / O को निर्देशित करने के लिए कुछ यूनियनों को डिफ़ॉल्ट करता है। (और संरेखित ब्लॉकों को पढ़ने / लिखने की आवश्यकता होती है, जो कि लिनक्स नहीं करता है क्योंकि यह अभी भी पेजकेच लिख रहा है।)
पीटर कॉर्ड्स

3

दर्शन असुरक्षित-बाय-डिफ़ॉल्ट है।

दो उचित और स्पष्ट रणनीतियाँ संभव हैं: फ्लश डिस्क को तुरंत लिखने या लिखने में देरी करता है। UNIX ने ऐतिहासिक रूप से उत्तरार्द्ध को चुना। इसलिए सुरक्षा प्राप्त करें, आपको fsyncबाद में कॉल करना होगा ।

हालाँकि, आप डिवाइस को विकल्प के साथ बढ़ते हुए sync, या प्रति-फ़ाइल को खोलकर सुरक्षा को निर्दिष्ट कर सकते हैं O_SYNC

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


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

2

यह थ्रूपुट में एक महान वृद्धि के लिए विश्वसनीयता की एक छोटी राशि का व्यापार करता है।

मान लीजिए, उदाहरण के लिए, एक वीडियो कम्प्रेसिंग प्रोग्राम। विलंबित लेखन ("राइट बैक") के साथ:

  1. फ्रेम को संपीड़ित करने में 10ms खर्च करें
  2. डिस्क पर फ्रेम लिखें
  3. लिखने के लिए डिस्क को पूरा लिखने के लिए 10ms की प्रतीक्षा करें
  4. गोटो १

बनाम

  1. फ्रेम को संपीड़ित करने में 10ms खर्च करें
  2. डिस्क पर फ्रेम लिखने की समस्या (पृष्ठभूमि में पूरी होती है)
  3. गोटो १

दूसरा संस्करण दो बार तेजी से प्रकट होता है क्योंकि यह एक ही समय में सीपीयू और डिस्क का उपयोग कर सकता है, जबकि पहला संस्करण हमेशा एक या दूसरे की प्रतीक्षा कर रहा है।

आम तौर पर आप स्ट्रीमिंग संचालन और बल्क फ़ाइल संचालन के लिए राइट-बैक चाहते हैं, और डेटाबेस और डेटाबेस जैसे अनुप्रयोगों के लिए राइट-थ्रू।


1

कई अनुप्रयोगों में, भंडारण उपकरण रुक-रुक कर डेटा पढ़ने में व्यस्त रहेंगे। यदि कोई सिस्टम हमेशा उस समय तक लिखने में सक्षम होता है जब स्टोरेज डिवाइस डेटा पढ़ने में व्यस्त नहीं होता है, तो एप्लिकेशन के दृष्टिकोण से राइट्स को पूरा होने में शून्य समय लगेगा। केवल ऐसी परिस्थितियाँ जिसमें लिखना तात्कालिक नहीं होगा जब:

  1. लिखने वाले बफ़र्स को इस बिंदु तक भरें कि वास्तव में पूर्ण लिखने तक कोई और आस्थगित-लिखित अनुरोध स्वीकार नहीं किया जा सकता है।

  2. उस उपकरण को बंद करना या निकालना आवश्यक है जिसके लिए लिखना लंबित है।

  3. एक आवेदन विशेष रूप से पुष्टि करता है कि वास्तव में एक लेखन पूरा हो गया है।

वास्तव में, यह केवल उपरोक्त आवश्यकताओं के कारण है जो लिखते हैं कि वास्तव में कभी भी जगह लेने की आवश्यकता होती है। दूसरी ओर, आमतौर पर कोई कारण नहीं होता है कि कोई भी लंबित लिखावट कभी न करे जब कोई उपकरण अन्यथा निष्क्रिय हो जाएगा, तो बहुत सारे सिस्टम उन्हें प्रदर्शन करते हैं।


0

यह भी है:

"हाय, जो मो" लिखें इससे
तेज है:
"हाय,"
लिखें "जो"
लिख "मो"

और भी:

"हाय, आप कैसे हैं?"
इससे अधिक तेज़ है:
"हाय, व्हाट्स अप?"
हटाएं कि
लिखें "हाउडी, हाउ आर यू?"
हटाएं कि
लिखें "हाय, आप कैसे हैं?"

रैम में डिस्क की तुलना में संशोधनों और एकत्रीकरण के लिए बेहतर है। बैचिंग डिस्क इस तरह की चिंताओं से एप्लिकेशन डेवलपर्स को मुक्त करती है।

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