संपूर्ण फ़ंक्शन और प्रभाव "डिवाइस पर फ्लशिंग विंडोज राइट-कैश बफर को बंद करें"


11

विंडोज 7 में, डिवाइस मैनेजर का उपयोग करते हुए, डिस्क के गुणों को लाने और नीतियां टैब पर जाने पर, 2 स्विच आइटम होते हैं। कैश लिखें, जिसके बारे में यह सवाल नहीं है।

तथा

[एक्स] डिवाइस पर फ्लशिंग विंडोज राइट-कैश बफर बंद करें <--- यह केवल एक है!

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

सरल शब्दों में, फाइल राइटिंग, फाइल सेविंग, फाइल कॉपीिंग के लिए यह क्या बदलाव करता है?

1. पैरानॉयड कार्यक्रमों के लिए लिखने की क्रियाओं को बदलना: (तथ्य या कल्पना)
क्या यह उस तरह से फ्लश लिखने के काम को बदल देता है जो एक प्रोग्राम के लिए एक कैश फ्लश होने के लिए होता है? कुछ कार्यक्रम लेखन को समाप्त करने पर बहुत अधिक आशय रखते हैं, बिना अटकलें के, क्या ये कार्यक्रम निरंतर सुरक्षात्मक लेखन को जारी रखने में सक्षम हैं, या क्या यह इन कार्यक्रमों के लिए भी बदलता है?

2. प्रभावित कार्यक्रमों
के प्रकार: उन कार्यों / कार्यक्रमों के प्रकार जो परिवर्तन द्वारा प्रभावित नहीं होंगे या नहीं होंगे? टाइप करें, कुछ प्रोग्राम स्ट्रीम, कुछ त्वरित लिखते हैं, कुछ निरंतर हैं, कुछ सुरक्षात्मक हैं (या कोई अन्य प्रकार जिसे आप सरल शब्दों में परिभाषित कर सकते हैं)।

3. क्या आपने कुछ भी देखा, या एक बेंचमार्क भी:
यदि सेटिंग चालू है, तो लेखन में देखने योग्य परिवर्तन क्या हैं? किसी देखे गए व्यवहार के ढीले उदाहरण व्यवहार में परिवर्तन करते हैं। या व्यवहार में कोई परिवर्तन नहीं देखा?

4. होल्डअप या देरी क्या है:
हम जानते हैं कि इनमें से अधिकांश क्रियाएं अधिकांश कंप्यूटरों पर बहुत तेजी से होती हैं, डेटा अंततः लिखा जाएगा। ड्राइव की गति के सापेक्ष, क्या समय का महत्व महत्वपूर्ण है?

मेरे प्रश्न के प्रयोजनों के लिए, जो जोखिम मौजूद है, वह प्रश्नों में से एक नहीं है, यदि आप इसे कवर करना चाहते हैं, तो यह रास्ते में नहीं आएगा।

"कैश बफ़र फ्लशिंग लिखो" का मतलब लगभग यही है, लेकिन लिंक एक अलग ओएस के लिए है। हालाँकि A के पास कुछ जानकारी है, यहाँ तक कि लिंक में प्रयुक्त शब्द समान नहीं है। यह उन सबसे महत्वपूर्ण बातों का भी जवाब नहीं देता है जो एक उपयोगकर्ता जानना चाहता है, कि मैंने यहां रूपरेखा बनाने की कोशिश की है।



1
NTFS फाइलिंग सिस्टम मेटाडेटा भ्रष्टाचार (हालांकि फ़ाइल सामग्री जर्नल नहीं हैं) से बचाने के लिए जर्नलिंग का उपयोग करता है, लेकिन यह केवल तभी काम करता है जब कुछ राइट्स को सही क्रम में होने की गारंटी दी जा सकती है, और विंडोज सही ऑर्डर सुनिश्चित करने के लिए निश्चित समय पर राइट कैश को फ्लश करता है।
डेविड

जवाबों:


9
  1. पहले सवाल में आपका कहना कल्पना है। विंडोज एपीआई कॉल जैसे कि अभी भी यह सुनिश्चित करेगा कि डेटा भौतिक मीडिया के लिए सभी तरह से बाहर हो जाता है, यहां तक ​​कि लिखने के साथ बफर फ्लशिंग अक्षम है। तो, प्रोग्राम जो "सुरक्षित" हैं और जानते हैं कि वे जो कर रहे हैं वह ठीक होने वाला है। .NET जैसे कॉल्स , आदि अंत में इस API को कहते हैं।FlushFileBuffers() FileStream.Flush()

  2. प्रोग्राम जो बहुत सारे डिस्क I / O को FlushFileBuffers()सीधे कॉल किए बिना करते हैं, या किसी भी सहायक एपीआई जो अंततः इसे कॉल करता है, को सबसे अधिक ध्यान देने योग्य प्रदर्शन वृद्धि दिखाई देगी। उदाहरण के लिए, यदि आप गैर-आवश्यक I / O चला रहे थे, जहां डेटा खो जाता है तो यह ठीक है, जैसे BOINC (यदि यह खो जाता है तो आप बस फ़ाइल को फिर से डाउनलोड करें या गणना की पुन: गणना करने का प्रयास करें), आप कॉल करने से बच सकते हैं FlushFileBuffers(), और बस एक एपीआई को कॉल करें जैसे WriteFile()- डेटा को लिखने के लिए बफर हो जाएगा, लेकिन यह वास्तव में संभावित रूप से लंबे समय तक नहीं लिखा जाएगा, जैसे कि फाइल डिस्क्रिप्टर बंद होने पर, या जब प्रोग्राम से बाहर निकलता है। दुर्भाग्य से यह भी संभव है कि यदि सिस्टम क्रैश हो जाता है (जैसे कि बीएसओडी), तो सभी डेटा खो जाता है, इसलिए यह वास्तव में महत्वपूर्ण हैअगर आप किसी भी प्रकार के मूल्यवान / गैर-बदली जाने वाली डेटा से काम कर रहे हैं, जिसे आप कॉल करते हैं FlushFileBuffers(), चाहे बफर फ्लशिंग सक्षम है या नहीं! अन्यथा एक साधारण ड्राइवर बग (आपके ग्राफिक्स ड्राइवर में उदाहरण के लिए) आपको बहुत अधिक डेटा खो सकता है।

  3. कोई भी मानदंड नहीं मिल सकता है, लेकिन आप इसे उन कार्यक्रमों के साथ और अधिक नोटिस करेंगे, जो ऊपर दिए गए दूसरे आइटम में विवरण को फिट करते हैं।

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

निम्नलिखित छद्मकोश पर विचार करें:

1: seek to a certain block (1)
2: write a couple megabytes of data into blocks starting at (1)
3: wait 2 seconds
4: seek to another block (2)
5: write some more megabytes of data into blocks starting at (2)
6: seek back to block (1)
7: write some more megabytes of data into blocks starting at (1)
8: wait 10 minutes
9: seek to block (1)
10: write some megabytes of data into blocks starting at (1)
11: wait 5 seconds
12: seek to block (2)
13: write some megabytes of data into blocks starting at (2)
14: explicit call to FlushFileBuffers()

साथ निस्तब्धता बफर स्वत: 5 सेकंड पर :

  • 2, 5 और 7 पर होने वाले लेखन रैम में होते हैं और डिस्क चलती नहीं है, जब तक कि पहले लिखने के बाद 5 सेकंड बीत चुके हों, और तब नवीनतम डेटा (लाइन 7 से) ब्लॉक (1) और 1 में लिखा जाता है। केवल ब्लॉक (2) में लिखा गया डेटा ही लिखा जाता है।
  • 10 और 13 लाइनों पर होने वाले लेखन, जो ब्लॉक (1) और (2) में डेटा को अधिलेखित करते हैं, को फिर से डिस्क पर लिखना पड़ता है
  • तो उस समय की कुल संख्या जो ब्लॉक (1) रैम को लिखी गई है , वह है 3, और डिस्क पर , 2. उस ब्लॉक की कुल संख्या जो 2 बार रैम को लिखी गई है , वह है 2, और डिस्क पर , 2।

स्वचालित 5 सेकंड बफ़र के साथ बंद (आपके प्रश्न में चेकबॉक्स का प्रभाव):

  • 2, 5, 7, 10 और 13 पर होने वाली राइट्स रैम में होती है और डिस्क चलती नहीं है, जब तक कि लाइन 14 को निष्पादित नहीं किया जाता है, और तब नवीनतम डेटा (लाइनों 10 और 13 से) ब्लॉक (1) में लिखा जाता है। और (२)। लाइनों 2, 5, और 7 से पुराना डेटा कभी हार्ड डिस्क को हिट नहीं करता है!

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

वे कहते हैं कि आपको एक बैटरी बैकअप का उपयोग करना चाहिए क्योंकि आप नहीं चाहते कि रैम में 35 मिनट का लिखित डेटा बफ़र किया जाए जो डिस्क पर नहीं लिखा है क्योंकि आपका प्रोग्रामर आलसी था और उसने फोन नहीं किया FlushFileBuffers(), और फिर एक बिजली की विफलता। बेशक, एक बैटरी बैकअप बीएसओडी का कारण बनने वाले चालक कीड़ों से आपकी रक्षा नहीं करता है ...।


0

चैटबॉट जॉन कैविल के जवाब के समर्थन में , मैंने थोड़ा परीक्षण कार्यक्रम लिखा है:

// ...
byteEx btTest;
btTest.resize(1024*1024, 0xff); // 1MB data

CSysFile sfTest(byT("test.bin"));

swTest.Start(); // Begin timing by call `QueryPerformanceCounter` API
for (UINT i=0; i<10000; ++i) // Write 1MB data for 10000 times
{
    sfTest.SeekBegin();
    sfTest.Write(btTest); // Call `WriteFile` API 
//  sfTest.Flush();       // Call `FlushFileBuffers` API
}
swTest.Stop(); // Calculate the time-consuming start from `swTest.Start() `
// ...

और इसे सक्षम करें "सक्षम डिवाइस पर फ्लशिंग विंडोज राइट-कैश बफर बंद करें" विकल्प के साथ सैमसंग 950pro NVMe डिस्क पर।

परिणाम है:

D:\tmp> test        // without sfTest.Flush();
00:00:00.729766     // use 0.73 seconds without FlushFileBuffers()

D:\tmp> test        // with sfTest.Flush();
00:00:06.736167     // use 6.74 seconds with FlushFileBuffers()

तो आप देख सकते हैं कि FlushFileBuffersअनुरोध सिस्टम द्वारा छोड़ा नहीं गया है (विंडोज FlushFileBuffersसक्षम होने पर भी कॉल को अनदेखा नहीं करता है)।


कृपया अपने उत्तर से अपनी टिप्पणी हटा दें। यह है कभी नहीं एक जवाब के रूप कमेंटरी प्रस्तुत करने के लिए स्वीकार्य।
रामहाउंड

@ASBai: (1) मुझे पता है C ++ (मुझे लगता है कि आपका प्रोग्राम क्या लिखा है), लेकिन मुझे Windows API नहीं पता है। क्या आप अपने कोड को थोड़ा समझा सकते हैं? (यह ध्यान रखें कि सुपर उपयोगकर्ता के कुछ उपयोगकर्ता प्रोग्रामर बिल्कुल नहीं हैं । प्रति से ।) विशेष रूप से, क्या है swTest(और इसे घोषित क्यों नहीं किया गया है)? (२) क्या आप कह रहे हैं कि आपने अपने प्रोग्राम की दो प्रतियां बनाई हैं, एक sfTest.Flush()कॉल सहित और एक नहीं (यानी, इसके साथ टिप्पणी की गई), और उनकी तुलना की? कृपया समझाएँ। (३) मैं अंग्रेजी जानता हूं, लेकिन मैं आपके अंतिम वाक्य को नहीं समझ सकता।
स्कॉट

@ रामहुड, लेकिन मुझे वोट देने या कोई टिप्पणी छोड़ने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसे कैसे हल किया जाए?
ASBai

@Scott (1), swTest एक उच्च रिज़ॉल्यूशन टाइमर है, यह टाइमिंग करने के लिए विंडोज़ प्लेटफॉर्म पर QueryPerformanceCounter एपीआई का उपयोग करता है (मुझे लगता है कि यह एक महत्वपूर्ण बिंदु नहीं है :-)। (२) हां, बिल्कुल। (3) मेरी खराब अंग्रेजी के लिए क्षमा करें, मैं सिर्फ यह कहना चाहता हूं: चैटबॉट जॉन कैविल सही है, FlushFileBuffersविकल्प सक्षम होने पर भी विंडोज कॉल को नजरअंदाज नहीं करता है (मैंने देखा कि कुछ अन्य स्रोत दुखी हैं कॉल की अनदेखी की जाएगी जब यह विकल्प सक्षम हो गया है )। मैं उत्तर में कुछ और टिप्पणियाँ
जोड़ूंगा

@ASBai - आपको उत्तर के रूप में टिप्पणी प्रस्तुत नहीं करनी चाहिए। यह वास्तव में मायने नहीं रखता है, आपके पास एक टिप्पणी प्रस्तुत करने के लिए आवश्यक प्रतिष्ठा नहीं है, क्योंकि एक टिप्पणी को कभी भी उत्तर के रूप में प्रस्तुत नहीं किया जाना चाहिए।
रामहुंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.