लिनक्स के उपयोग से तनाव परीक्षण एसडी कार्ड


19

मैं कल किसी के साथ थोड़ी बहस में पड़ गया और / या मेरे उत्तर की सत्यता के बारे में यहाँ , विज़।, कि लॉगिंग और एफए मेटा डेटा को एक सभ्य (GB +) आकार के एसडी कार्ड पर पहनने के लिए पर्याप्त महत्वपूर्ण नहीं हो सकता है। समय (वर्ष और वर्ष) की एक उचित मात्रा में बाहर। प्रतिवाद के झटके से लग रहा था कि मुझे गलत होना चाहिए क्योंकि एसडी कार्ड पहनने वाले लोगों की ऑनलाइन कई कहानियां हैं।

चूंकि मेरे पास एसडी कार्ड वाले डिवाइस हैं जिनमें आरडब्ल्यू रूट फाइलसिस्टम हैं जो 24/7 पर बचे हैं, मैंने अपनी संतुष्टि से पहले आधार का परीक्षण किया था। मैंने इस परीक्षण को थोड़ा मोड़ दिया है, इसे दोहराया (उसी कार्ड का उपयोग करते हुए, वास्तव में) और इसे यहां प्रस्तुत कर रहा हूं। मेरे पास दो केंद्रीय प्रश्न हैं:

  1. क्या जिस विधि का उपयोग मैंने कार्ड को व्यवहार्य बनाने में करने की कोशिश की थी, उसे ध्यान में रखते हुए कि यह लगातार कम मात्रा में डेटा फिर से लिखने के प्रभावों को पुन: पेश करने के लिए है ?
  2. क्या मैंने कार्ड को सत्यापित करने के लिए जिस विधि का उपयोग किया था वह अभी भी ठीक है?

मैं यहाँ सवाल SO या SuperUser के बजाय यहाँ रख रहा हूँ क्योंकि पहले भाग पर आपत्ति करने से शायद यह दावा करना होगा कि मेरा परीक्षण वास्तव में उस कार्ड पर नहीं लिखा है जिस तरह से मुझे यकीन है कि यह करता है, और कुछ की आवश्यकता होती है linux का विशेष ज्ञान।

[यह भी हो सकता है कि एसडी कार्ड किसी तरह की स्मार्ट बफरिंग या कैशे का उपयोग करते हों, जैसे कि एक ही जगह पर बार-बार लिखने से कोई कमी हो सकती है / पहनने के लिए कम खतरा होता है। मुझे इसका कहीं भी कोई संकेत नहीं मिला है, लेकिन मैं इसके बारे में एसयू से पूछ रहा हूं ]

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

हार्डवेयर में निस्तब्धता के लिए, मैं POSIX लाइब्रेरी कॉल पर निर्भर था fdatasync():

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>

// Compile std=gnu99

#define BLOCK 1 << 16

int main (void) {
    int in = open ("/dev/urandom", O_RDONLY);
    if (in < 0) {
        fprintf(stderr,"open in %s", strerror(errno));
        exit(0);
    }

    int out = open("/dev/sdb1", O_WRONLY);
    if (out < 0) {
        fprintf(stderr,"open out %s", strerror(errno));
        exit(0);
    }

    fprintf(stderr,"BEGIN\n");

    char buffer[BLOCK];
    unsigned int count = 0;
    int thousands = 0;
    for (unsigned int i = 1; i !=0; i++) {
        ssize_t r = read(in, buffer, BLOCK);
        ssize_t w = write(out, buffer, BLOCK);
        if (r != w) {
            fprintf(stderr, "r %d w %d\n", r, w);
            if (errno) {
                fprintf(stderr,"%s\n", strerror(errno));
                break;
            }
        }
        if (fdatasync(out) != 0) {
            fprintf(stderr,"Sync failed: %s\n", strerror(errno));
            break;
        }
        count++;
        if (!(count % 1000)) {
            thousands++;
            fprintf(stderr,"%d000...\n", thousands);
        }
        lseek(out, 0, SEEK_SET);
    }
    fprintf(stderr,"TOTAL %lu\n", count);
    close(in);
    close(out);

    return 0;
}                                 

मैंने इसे ~ 8 घंटे तक चलाया, जब तक कि मैंने विभाजन की शुरुआत में 2 मिलियन + नहीं लिख लिए /dev/sdb11 मैं आसानी से इस्तेमाल कर सकता था /dev/sdb(कच्चे उपकरण और विभाजन नहीं) लेकिन मैं यह नहीं देख सकता कि इससे क्या फर्क पड़ेगा।

फिर मैंने एक फाइल सिस्टम बनाने और माउंट करने की कोशिश करके कार्ड को चेक किया /dev/sdb1। यह काम करता है, जो मुझे रात भर के लिए लिखी गई विशिष्ट ब्लॉक को इंगित करता है, संभव था। हालांकि, इसका मतलब यह नहीं है कि कार्ड के कुछ क्षेत्रों को खराब नहीं किया गया था और पहनने के स्तर से विस्थापित किया गया था, लेकिन सुलभ छोड़ दिया गया था।

परीक्षण करने के लिए, मैंने badblocks -v -wविभाजन पर उपयोग किया । यह एक विनाशकारी रीड-राइट टेस्ट है, लेकिन लेवलिंग पहनें या नहीं, यह कार्ड की व्यवहार्यता का एक मजबूत संकेत होना चाहिए क्योंकि यह अभी भी प्रत्येक रोलिंग लेखन के लिए जगह प्रदान करना चाहिए। दूसरे शब्दों में, यह कार्ड को पूरी तरह से भरने के लिए शाब्दिक समकक्ष है, फिर यह जांचना कि वह सब ठीक था। कई बार, क्योंकि मैंने कुछ पैटर्न के माध्यम से बैडब्लॉक को काम करने दिया।

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

1 कार्ड एक पुराना 4 जीबी सैंडिस्क कार्ड था (इस पर इसका कोई "वर्ग" नंबर नहीं है) जो मैंने मुश्किल से इस्तेमाल किया है। एक बार फिर से, ध्यान रखें कि यह 2 मिलियन नहीं है जो शाब्दिक रूप से एक ही भौतिक स्थान पर लिखता है; पहनने के कारण "पहले ब्लॉक" को परीक्षण के दौरान नियंत्रक द्वारा लगातार ले जाया जाता है, क्योंकि शब्द बताता है, पहनने से बाहर।


यह नीचे उल्लिखित कारणों के लिए एक अविश्वसनीय परीक्षण है। इसके अलावा, आप badblocksफ्लैश ड्राइव पर पृष्ठ विफलताओं को दिखाने के लिए उपयोग नहीं कर सकते हैं (और यह दावा करना कि बहुत भ्रामक है)। जिन्हें नियंत्रक द्वारा नियंत्रित किया जाता है और पता चलने पर स्थान आरक्षित करने के लिए मैप किया जाता है। ड्राइव पर डेटा का भौतिक लेआउट I / O करते समय आपके द्वारा देखे जाने वाले भौतिक लेआउट के समान नहीं है, यही कारण है कि पहनने का स्तर इसकी पारदर्शिता बनाए रखता है। इस में से कोई भी I / O के दौरान आपको दिखाई नहीं देता है। ज़्यादातर, अगर ड्राइव SMART का समर्थन करती है, तो आप नियंत्रक से विफलताओं और शेष आरक्षित स्थान के बारे में थोड़ी जानकारी प्राप्त कर सकते हैं।
जेसन सी

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

फिर भी एक और बिंदु जो आपके परीक्षण को अवास्तविक बनाता है वह यह है कि एक पृष्ठ (और आमतौर पर काफी) विफल हो सकता है लेकिन फिर भी एसडी कार्ड को 100% बाद में छोड़ सकते हैं। उस स्थिति में जहां नियंत्रक द्वारा विफलता का पता लगाया जाता है, लेकिन डेटा को पढ़ने में असमर्थ होता है, जब नियंत्रक ब्लॉक को कॉपी करने का प्रयास करता है तो फाइलसिस्टम डेटा भ्रष्ट हो सकता है।
जेसन सी

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

1
मैं उस विशेष कार्ड के बारे में नहीं जानता, लेकिन उनमें से ज्यादातर वैसे भी कम से कम पहले से ही मृत हैं। इन लोगों ने एसडी कार्ड के कम से कम एक ब्रांड पर माइक्रोकंट्रोलर को हैक किया: bunniestudios.com/blog/?p=3554 इस विषय पर उन्होंने जो घंटे की बात की वह बहुत अच्छी थी।
मिकसेर

जवाबों:


11

मुझे लगता है कि एक एसडी कार्ड का तनाव परीक्षण सामान्य समस्याग्रस्त 2 चीजें हैं:

  1. लेवलिंग पहनना कोई गारंटी नहीं है कि अगला लिखने वाला वास्तव में एसडी पर समान भौतिक स्थानों का उपयोग कर रहा है। याद रखें कि अधिकांश एसडी सिस्टम सक्रिय रूप से एक ब्लॉक ले रहे हैं जैसा कि हम इसे जानते हैं और भौतिक स्थान को आगे बढ़ाते हैं जो कथित "पहनने" के आधार पर इसके चारों ओर पीठ करता है जिसे प्रत्येक स्थान के अधीन किया गया है।

  2. विभिन्न प्रौद्योगिकियां (एमएलसी बनाम एसएलसी) दूसरा मुद्दा जो मैं इसके साथ देखता हूं, वह है प्रौद्योगिकियों में अंतर। एसएसडी के एसएलसी प्रकार मैं एमएलसी किस्म के मुकाबले कहीं अधिक लंबा जीवन होने की उम्मीद करूंगा। इसके अलावा एमएलसी पर बहुत अधिक सख्त सहिष्णुता है कि आपको एसएलसी से निपटने की जरूरत नहीं है, या कम से कम वे इस तरह से असफल होने के लिए बहुत अधिक सहिष्णु हैं।

    • एमएलसी - मल्टी लेवल सेल
    • एसएलसी - सिंगल लेवल सेल

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

जीवन प्रत्याशा

मुझे यह लिंक मिला जो इस बात पर थोड़ी चर्चा करता है कि हार्डवेयर कितने समय तक चल सकता है। इसका शीर्षक है: नो योर एसएसडी - एसएलसी बनाम एमएलसी

एसएलसी

SLC ssds की गणना की जा सकती है, अधिकांश भाग के लिए, सबसे अच्छे अनुमानों के अनुसार, औसतन 49 वर्ष और 149 वर्ष के बीच कहीं भी रहना है। मेमोराइट परीक्षण 100Gb प्रति दिन के औसत लेखन के साथ 200 साल से अधिक के लेखन धीरज जीवनकाल वाले 128Gb SSD को मान्य कर सकता है।

एमएलसी

यह वह जगह है जहां एमएलसी डिजाइन कम हो जाता है। अभी तक कोई भी जारी नहीं किया गया है। किसी ने वास्तव में जांच नहीं की है कि एमएलसी के साथ किस तरह की जीवन प्रत्याशा का आश्वासन दिया गया है, इसके अलावा, यह काफी कम होगा। मुझे कई अलग-अलग विश्वास प्राप्त हुए हैं जो औसतन 10 से 1 जीवनकाल तक के एससीएल डिजाइन के पक्ष में हैं। एक रूढ़िवादी अनुमान यह है कि प्रत्येक निर्माता के नियंत्रकों के भीतर 'वियर लेवलिंग एल्ग्रोथम्स' की उन्नति के आधार पर, अधिकांश जीवनकाल अनुमान 7 से 10 साल के बीच होगा।

तुलना

लिखने के चक्र के तरीके की तुलना करने के लिए, एक एमसीएल में जीवनकाल में 100,000 पूर्ण लेखन चक्र होंगे, जिसमें जीवनकाल 10,000 लिखने का चक्र होगा। यह 'पहनने लेवलिंग' के उपयोग के आधार पर काफी बढ़ सकता है।


1
WRT वियर लेवलिंग "इस बात की कोई गारंटी नहीं है कि अगला लिखने वाला वास्तव में SD पर समान भौतिक स्थानों का उपयोग कर रहा है" - यह प्रश्न स्लम में माना जाता है! बहुत स्पष्ट रूप से, मुझे लगता है ... पहनने के स्तर के बिना, मैं कभी भी इस परीक्षा को पास करने की उम्मीद नहीं करूंगा क्योंकि मैं किसी भी लिखित-चक्र के जीवनकाल से परे जा रहा हूं। परीक्षण पहनने की प्रभावशीलता को साबित करने के उद्देश्य से है , इसे अनदेखा न करें। यह तथ्य कि मैं एक ही स्पष्ट स्थान पर 2 मिलियन बार लिख सकता हूं, यह दर्शाता है कि पहनने का स्तर प्रभावी है।
गोल्डीलॉक्स

WRT # 2, गुणवत्ता और प्रौद्योगिकी निश्चित रूप से एक कार्ड को दूसरे से अलग करेगी। मेरा कहना है कि एक रन-ऑफ-द-मिल सस्ते सैंडिस्क कार्ड अभी भी किसी की तुलना में लंबे समय तक चलेगा, अगर किसी व्यक्ति को प्रति दिन लिखे गए डेटा की मात्रा अपेक्षाकृत कम है।
गोल्डीलॉक्स

@goldilocks - ठीक है, ठीक है, मुझे इसके बारे में मत मारो। 8-), तो आप क्या कह रहे हैं कि अगर मैं पर्याप्त मात्रा में डेटा लिखता हूं, जैसे कि मैं समीकरण से लेवलिंग को प्रभावी ढंग से समाप्त करता हूं, और इस पर बैडब्लॉक चलाता हूं, तो क्या यह पर्याप्त लेवलिंग की प्रभावकारिता दिखाने के लिए है?
स्लम

1
@goldilocks - क्या मैंने सिर्फ पैंडोरा का बॉक्स खोला है?
स्लम

1
(उदाहरण के लिए: यदि आप किसी चित्र को लिखकर SD कार्ड को क्लोन करते हैं और fstrimबाद में नहीं कर सकते हैं / नहीं कर सकते हैं , तो आपने पूरी तरह से डायनेमिक वियर लेवलिंग को निष्क्रिय कर दिया है [आपको स्थिर ग्रेड लेवलिंग के साथ एक उपभोक्ता ग्रेड एसडी कार्ड खोजने के लिए कठिन दबाया जाएगा] उपयोग के रूप में हर पृष्ठ को चिह्नित करना।)
जेसन सी

6

आपके परीक्षण के साथ कई समस्याएँ हैं, कुछ फ़र्ज़ी, कुछ नहीं। यह आपके लक्ष्य पर भी निर्भर करता है। दो सूक्ष्म, फजी मुद्दों की तरह हैं:

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

हालांकि, वे यकीनन पांडित्य हैं। अधिक गंभीर है:

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

लेवल लेयरिंग: मुख्य मुद्दा यह है कि वियर लेवलिंग आपके टेस्ट में एक बड़ा बदलाव है। यह नियंत्रक (आमतौर पर) पर होता है, और किसी भी मामले में इसका पारदर्शी भी प्रत्यक्ष डिवाइस की तलाश + पढ़ने / लिखने के लिए होता है। आपके उदाहरण में, आप वास्तव में पहनने वाले राज्य को नहीं जानते हैं (विशेष रूप से, TRIM कमांड को ब्लॉक मुक्त करने के लिए जारी किया गया है) ...)?

आपके डिवाइस पर डायनेमिक वियर लेवलिंग (वस्तुतः सभी उपभोक्ता ग्रेड स्टोरेज डिवाइस में मौजूद) के लिए, यह किसी भी स्थिति में हो सकता है: एक चरम पर, कोई भी पेज मुफ्त में चिह्नित नहीं किया जाता है, और इसलिए केवल उन पेजों पर कंट्रोलर को काम करना पड़ता है के साथ आरक्षित स्थान (यदि कोई हो) वाले हैं। ध्यान दें कि वहाँ अगर है डिवाइस पर आरक्षित अंतरिक्ष, यह होगा पूरी तरह से विफल इससे पहले कि आप की गारंटी हो रही शुरू करते हैं पेज राईट पर विफल रहता है (यह मानते हुए कोई अन्य पृष्ठों मुक्त शेष के रूप में चिह्नित कर रहे हैं)। दूसरे चरम पर, प्रत्येक पृष्ठ को मुफ्त में चिह्नित किया जाता है, जिस स्थिति में आपको सैद्धांतिक रूप से डिवाइस के प्रत्येक पृष्ठ को विफल होने से पहले लिखना शुरू करना होता है।

स्टेटिक वियर लेवलिंग के लिए (जिसमें SSDs होते हैं, SD कार्ड नहीं होते हैं, और थंब ड्राइव अलग-अलग होते हैं): डिवाइस पर हर पेज पर बार-बार लिखने से अलग, इसके आस-पास वास्तव में कोई रास्ता नहीं होता है।

... दूसरे शब्दों में, पहनने के स्तर का विवरण है कि आपके पास जानने का कोई तरीका नहीं है और निश्चित रूप से नियंत्रित करने का कोई तरीका नहीं है - विशेष रूप से गतिशील पहनने लेवलिंग उपयोग में है या नहीं, स्थिर पहनने के स्तर का उपयोग करना है या नहीं, और वियर लेवलिंग के लिए डिवाइस पर आरक्षित स्थान की मात्रा (जो कि कुछ मामलों में कंट्रोलर [या ड्राइवर के पास नहीं दिखाई देती है, जैसे M-Systems पुराने DiskOnChip])।

एसएलसी / एमएलसी: एसएलसी बनाम एमएलसी के रूप में, यह उन सीमाओं पर बहुत सीधा प्रभाव डालता है जो आप देखने की उम्मीद करेंगे, लेकिन सामान्य पहनने की प्रक्रिया और परीक्षण प्रक्रिया दोनों के लिए समान है। कई विक्रेता अपने सस्ते उपभोक्ता उत्पादों के लिए एसएलसी या एमएलसी प्रकाशित नहीं करते हैं या नहीं, हालांकि किसी भी फ्लैश ड्राइव का दावा है कि प्रति पृष्ठ 100k + चक्र सीमा एसएलसी (सरलीकृत ट्रेडऑफ एसएलसी = धीरज, एमएलसी = घनत्व) है।

कैशिंग: कैशिंग के लिए के रूप में, यह थोड़ा iffy है। ओएस स्तर पर, सामान्य मामले में, निश्चित रूप से, fsync / fdatasync यह गारंटी नहीं देता है कि डेटा वास्तव में लिखा गया है। हालाँकि, मुझे लगता है कि यह मान लेना सुरक्षित है कि यह (या कम से कम कंट्रोलर ने ऐसा करने के लिए प्रतिबद्ध है, यानी इस मामले में कैश में लिखा नहीं जाएगा), क्योंकि हटाने योग्य ड्राइव आम तौर पर सामान्य उपयोग पैटर्न के लिए डिज़ाइन किए गए हैं "इजेक्ट" (अनमाउंट> सिंक) फिर निकालें (पावर कट)। हालांकि हम निश्चित रूप से नहीं जानते हैं, एक शिक्षित अनुमान कहता है कि यह मान लेना सुरक्षित है कि सिंक गारंटी देता है कि लेखन पूरी तरह से होगा, विशेष रूप से लिखित में -> सिंक -> वापस पढ़ें (यदि यह नहीं था, तो ड्राइव अविश्वसनीय होगा बेदखल करना)। 'सिंक ’से परे कोई और कमांड नहीं है जिसे बेदखल किया जा सके।

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

परिक्षण:

दुर्भाग्य से, सच्चाई यह है कि जब तक आप यह नहीं जानते कि उपकरण में कोई आरक्षित स्थान नहीं है और स्थैतिक समतलन नहीं कर रहा है, किसी विशिष्ट पृष्ठ की चक्र सीमा का निश्चित रूप से परीक्षण करने का कोई तरीका नहीं है। हालाँकि, आप जो निकटतम प्राप्त कर सकते हैं, वह इस प्रकार है (मान लें कि कोई स्थैतिक पहनना नहीं है):

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

dd if=/dev/urandom bs=512k of=/dev/sdb conv=fsync oflag=sync

यदि आप प्रगति बार प्रकार हैं:

pv -pterb -s <device_size> /dev/urandom | dd bs=512k of=/dev/sdb conv=fsync oflag=sync

संपादित करें: 4MB इरेज़ ब्लॉक वाले कार्ड के लिए, तेज़ लिखने के लिए इसे आज़माएँ:

dd if=/dev/urandom bs=4M of=/dev/sdb conv=fsync oflag=direct,sync iflag=fullblock

इसके बाद, फिर, आप एक चक्र परीक्षण कार्यक्रम इस प्रकार लिख सकते हैं, का इस्तेमाल कर रही O_DIRECTहै और O_SYNC(और संभवतः पागल, अनावश्यक उपयोग fsync()) ज्यादा ओएस बफरिंग के रूप में कटौती करने के लिए और संभव के रूप में तस्वीर से बाहर कैशिंग और सैद्धांतिक रूप से, नियंत्रक करने के लिए सीधे लिखने और इंतजार करें जब तक यह रिपोर्ट न हो जाए कि ऑपरेशन समाप्त हो गया है:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

static const int BLOCK_SIZE = 512;
static const int ALIGNMENT = 512;
static const int OFFSET = 1024 * ALIGNMENT; // 1024 is arbitrary


int main (int argc, char **argv) {

    if (argc != 2) {
        fprintf(stderr, "usage: %s device\n", argv[0]);
        return 1;
    }

    int d = open(argv[1], O_RDWR | O_DIRECT | O_SYNC);
    if (d == -1) {
        perror(argv[1]);
        return 1;
    }

    char *block[2], *buffer;
    int index = 0, count = -1;

    // buffers must be aligned for O_DIRECT.
    posix_memalign((void **)&(block[0]), ALIGNMENT, BLOCK_SIZE);
    posix_memalign((void **)&(block[1]), ALIGNMENT, BLOCK_SIZE);
    posix_memalign((void **)&buffer, ALIGNMENT, BLOCK_SIZE);

    // different contents in each buffer
    memset(block[0], 0x55, BLOCK_SIZE);
    memset(block[1], 0xAA, BLOCK_SIZE);

    while (true) {

        // alternate buffers
        index = 1 - index;

        if (!((++ count) % 100)) {
            printf("%i\n", count);
            fflush(stdout);
        }

        // write -> sync -> read back -> compare
        if (lseek(d, OFFSET, SEEK_SET) == (off_t)-1)
            perror("lseek(w)");
        else if (write(d, block[index], BLOCK_SIZE) != BLOCK_SIZE)
            perror("write");
        else if (fsync(d))
            perror("fsync");
        else if (lseek(d, OFFSET, SEEK_SET) == (off_t)-1)
            perror("lseek(r)");
        else if (read(d, buffer, BLOCK_SIZE) != BLOCK_SIZE)
            perror("read");
        else if (memcmp(block[index], buffer, BLOCK_SIZE))
            fprintf(stderr, "memcmp: test failed\n");
        else
            continue;

        printf("failed after %i successful cycles.\n", count);
        break;

    }

}

ध्यान दें कि O_DIRECT, बफ़र्स को उपयुक्त रूप से संरेखित किया जाना चाहिए। 512-बाइट की सीमाएं आमतौर पर पर्याप्त होती हैं। आप इसके साथ संकलन कर सकते हैं:

g++ -O0 test.cpp -o test

-D_POSIX_C_SOURCE=200112Lयदि आवश्यक हो तो जोड़ें ।

फिर, डिवाइस को पूरी तरह से ऊपर के रूप में भरने के बाद, बस इसे रात भर चलाने के लिए छोड़ दें:

./test /dev/sdb

512 बाइट, संरेखित लेखन ठीक हैं, जो आपको एक पूरे पृष्ठ को मिटा देगा और फिर से लिख देगा। आप एक बड़े ब्लॉक आकार का उपयोग करके परीक्षण में काफी तेजी ला सकते हैं, लेकिन फिर यह ठोस परिणामों तक पहुंचने के लिए जटिल हो जाता है।

मैं वर्तमान में 4 जीबी पीएनवाई थंब ड्राइव पर देख रहा हूं, जो कि मैंने कल फुटपाथ पर पाया था । -पुरुष- P2990C418.aspx )।

उपरोक्त कार्यक्रम अनिवार्य रूप से एक सीमित संस्करण है badblocksऔर आप तब तक विफलताओं को नहीं देखेंगे जब तक कि सभी आरक्षित स्थान समाप्त नहीं हो जाते। इसलिए, अपेक्षा (1 पेज प्रति पुनरावृत्ति के साथ) यह है कि उपरोक्त प्रक्रिया, औसतन, आरक्षित_पृष्ठ_count * write_cycle_limit पुनरावृत्तियों (फिर से, पहनने के स्तर एक प्रमुख चर है) में विफल होना चाहिए । यह बहुत बुरा है अंगूठे ड्राइव और एसडी कार्ड आमतौर पर स्मार्ट का समर्थन नहीं करते हैं, जो आरक्षित स्थान के आकार को रिपोर्ट करने की क्षमता रखते हैं।

वैसे, इस परीक्षण के प्रयोजनों के लिए आपके द्वारा किए जा रहे ब्लॉक डिवाइस के लिए fsyncबनाम fdatasyncकोई फर्क नहीं पड़ता है। आपके open()तरीके महत्वपूर्ण हैं।

यदि आप तकनीकी विवरण के बारे में उत्सुक हैं; यहां वो सब कुछ है जो आप जानना चाहते हैं (प्लस अधिक) एसडी कार्ड के आंतरिक कामकाज के बारे में: https://www.sdcard.org/downloads/pls/simplified_specs/part1_410.pdf

संपादित करें: बाइट्स बनाम पेज: इन प्रकार के परीक्षणों के संदर्भ में, पृष्ठों के संदर्भ में चीजों के बारे में सोचना महत्वपूर्ण है, बाइट्स नहीं। इसके विपरीत करना बहुत भ्रामक हो सकता है। उदाहरण के लिए, सैनडिस्क 8 जीबी एसडी पर, नियंत्रक के अनुसार पृष्ठ का आकार (एक्सेस के माध्यम से /sys/classes/mmc_host/mmc?/mmc?:????/preferred_erase_size) एक पूर्ण 4 एमबी है। लेखन 16MB (4MB सीमाओं से जुड़ा हुआ), फिर, 4 पृष्ठ मिटा / लिखता है। हालाँकि, एक दूसरे से 4MB ऑफसेट पर चार सिंगल बाइट्स लिखना भी 4 पेज मिटा / लिखता है।

यह गलत है, फिर यह कहने के लिए कि "मैंने 16 एमबी लिखी गई चीजों के साथ परीक्षण किया है", क्योंकि यह "4 बाइट राइट्स के साथ परीक्षण किया गया" पहनने की समान मात्रा है। अधिक सटीक रूप से, "मैंने 4 पृष्ठ के साथ परीक्षण किया है"।


मैंने बाइट्स बनाम पृष्ठों के संबंध में एक टिप्पणी जोड़ी।
जेसन सी

PNY अविनाशी दिखाई देता है। हालाँकि, एक नए सैनडिस्क 8GB माइक्रोएसडी पर ~ 8.1mil पुनरावृत्तियों (लगभग 8 घंटे से अधिक) के बाद, एक शक्ति चक्र, इसके बाद अधिकतम लिखने की दर (मूल रूप से 4MB / सेकंड) स्थायी रूप से ~ 410kB / सेकंड पर गिरा दी ddजाती है , और 250MB लिखने के बाद विफल हो जाती है । नुकसान बिजली चक्र के बाद तक दिखाई नहीं दिया। PNY थंब ड्राइव ~ 30mil पुनरावृत्तियों के बाद अप्रभावित रहता है। मैंने प्रोग्राम को ऊपर (कोड में परिलक्षित नहीं किया गया है, हालांकि) को हर बार उसी के बजाय यादृच्छिक 16kB- संरेखित स्थानों पर लिखने के लिए संशोधित किया, लेकिन मैंने इसके बाद ~ 4mil iters on SD किया। नए कार्ड के साथ फिर से आएगा।
जेसन सी

ddउस कार्ड पर तीसरे प्रयास ने उसे 250MB अंक से आगे कर दिया, और लेखन प्रदर्शन फिर से उस बिंदु के बाद पूरे 4MB / सेकंड के क्षेत्रों तक बढ़ गया। मुझे उम्मीद है कि प्रदर्शन अप्रत्याशित होगा, हालांकि, ब्लॉकों में फेरबदल जारी है। मैं यह नहीं कहूंगा कि कार्ड नष्ट हो गया है, लेकिन यह निश्चित रूप से 100% नहीं है।
जेसन सी

5

स्लम के उत्तर में कुछ बिंदुओं को जोड़ते हुए - ध्यान दें कि ये SSDs के लिए "डंबल" एसडी कार्ड्स की तुलना में अधिक हैं, क्योंकि SSDs आपके डेटा (जैसे कि डी-डुप्लीकेशन) के साथ बहुत अधिक गंदे चालें खेलते हैं :

  • आप डिवाइस की शुरुआत में 64KB लिख रहे हैं - यह अपने आप में दो समस्याएं हैं:

    1. फ्लैश सेल में आमतौर पर 16KB अप (128-512KB रेंज में अधिक संभावना) से आकार के ब्लॉक मिटाए जाते हैं। जिसका मतलब है कि उसे कम से कम इस आकार के कैश की जरूरत है। इसलिए 64KB लिखना मेरे लिए पर्याप्त नहीं लगता है।

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

  • fdatasync() वास्तव में यह गारंटी नहीं है कि डेटा भौतिक माध्यम को लिखा जाता है (हालांकि यह संभवतः ओएस के नियंत्रण में सबसे अच्छा काम करता है) - मैन पेज देखें:

    जब तक डिवाइस रिपोर्ट नहीं करता कि हस्तांतरण पूरा हो गया है तब तक कॉल ब्लॉक हो जाती है

    मुझे बहुत आश्चर्य नहीं होगा अगर यह पता चला कि एक छोटा संधारित्र है, जो बाहरी शक्ति खोने के मामले में फ्लैश मेमोरी में कैश्ड डेटा लिखने के लिए ऊर्जा प्रदान करने में सक्षम है।

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

  • आप नए ब्लॉक को लिखने और उसकी तुलना करने से पहले डेटा को पढ़ना चाह सकते हैं, बस यह सुनिश्चित करने के लिए कि यह वास्तव में काम करता है (और यदि आप पर्याप्त पागल हैं, तो रीडिंग के लिए क्लीयर बफर का उपयोग करें)।


+1 कैशिंग की संभावना को उजागर करने के लिए और इसमें मिटा ब्लॉक का महत्व। लेकिन ...
गोल्डीलॉक्स

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

"fdatasync () वास्तव में गारंटी नहीं देता है कि डेटा भौतिक माध्यम को लिखा जाता है" IMO, हस्तांतरण की प्रक्रिया पूरी करने वाले उपकरण की रिपोर्ट से यह संकेत मिलता है कि यदि डिवाइस रीड-राइट टेस्ट पास करता है, तो उसे लिखना होगा। अभी तक एक असफल)। कैशिंग इसे जटिल कर सकता है, लेकिन अगर हम उस के आसपास जाने के लिए एक बहुत बड़े चंक का उपयोग करते हैं, तो यह संभव नहीं है कि जब डिवाइस ने सफलता की सूचना दी हो तो "झूठा लिखना" हो। यह बेकार होगा अगर वह ऐसा करता।
गोल्डीलॉक्स

1
@goldilocks नहीं, डेटा को डिवाइस से वापस पढ़ना कुछ भी गारंटी नहीं देता है। यह है उचित करने के लिए उम्मीद डेटा भौतिक माध्यम पर हो सकता है, और यह शायद ज्यादातर मामलों में हो जाएगा, लेकिन यह गारंटी नहीं है - कम से कम जब तक आप कैश आकार से परे जाना।
पेट्रॉफ

1
@goldilocks peterph एक और बात सामने लाती है जिसे मैं इंगित करना चाहता था; readअपने परीक्षण में अनावश्यक है, यह कोई जानकारी जोड़ता है और एक लिखने चक्र परीक्षण करने के लिए प्रासंगिक नहीं है। एक सच्चे परीक्षण के लिए आप अपने द्वारा लिखे गए ब्लॉक को वापस पढ़ना चाहेंगे और इसे मान्य करेंगे, जब तक कि आप कुछ के लिए नहीं जानते हैं कि नियंत्रक सभी विफलता मोड का पता लगा सकता है और रिपोर्ट कर सकता है।
जेसन सी

2

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

हालांकि, मुझे विश्वास नहीं है कि कैशिंग मिटा ब्लॉक से बड़ा डेटा शामिल करेगा। वास्तव में निश्चित होने के लिए, मैंने 64 केबी के बजाय 16 एमबी के चंक का उपयोग करके परीक्षण दोहराया। यह 4 जीबी कार्ड की कुल मात्रा का 1/250 वां हिस्सा है। 10,000 बार ऐसा करने में ~ 8 घंटे लग गए। यदि पहनने के लेवलिंग के आसपास भार फैलाने की पूरी कोशिश की जाती है, तो इसका मतलब है कि हर भौतिक ब्लॉक का 40 बार उपयोग किया जाएगा।

यह ज्यादा नहीं है, लेकिन परीक्षण का मूल बिंदु यह दिखाते हुए पहनने के स्तर की प्रभावकारिता को प्रदर्शित करना था कि मैं एक ही (स्पष्ट) स्थान पर डेटा की मामूली मात्रा के बार-बार लिखने के माध्यम से कार्ड को आसानी से नुकसान नहीं पहुंचा सकता। IMO का पिछला 64 kB टेस्ट शायद असली था - लेकिन 16 एमबी वाला होना चाहिए। सिस्टम ने डेटा को हार्डवेयर में प्रवाहित कर दिया है और हार्डवेयर ने बिना किसी त्रुटि के रिपोर्ट लिख दी है। यदि यह एक धोखा था, तो कार्ड किसी भी चीज के लिए अच्छा नहीं होगा, और यह 16 एमबी कहीं भी कैशिंग नहीं कर सकता है, लेकिन प्राथमिक भंडारण में, जो कि परीक्षण का उद्देश्य तनाव है।

उम्मीद है, प्रत्येक 16 एमबी के 10,000 लिखते हैं, यह प्रदर्शित करने के लिए पर्याप्त है कि नीचे के नाम के ब्रांड कार्ड पर भी (मूल्य: $ 5 सीडीएन), एक आरडब्ल्यू रूट फाइलसिस्टम 24/7 चल रहा है जो रोजाना मामूली मात्रा में डेटा लिखता है , कार्ड को बाहर नहीं पहनेंगे। समय की उचित अवधि। 10,000 दिन 27 साल हैं ... और कार्ड अभी भी ठीक है ...

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

कार्ड की पुष्टि के संबंध में अभी भी ठीक है, मुझे नहीं लगता कि badblocksइसमें डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग करना उचित है। इसके बजाय, मैंने इसे इस तरह किया:

badblocks -v -w -b 524288 -c 8

जिसका अर्थ है 8 बार (= 4 एमबी) दोहराए गए 512 kB ब्लॉक का उपयोग करके परीक्षण करना। चूँकि यह एक विनाशकारी आरडब्ल्यू परीक्षण है, यह संभवत: मेरे होमस्पून के रूप में अच्छा होगा यदि डिवाइस को निरंतर लूप में उपयोग करने पर जोर दिया जाए।

मैंने उस पर एक फाइलसिस्टम भी बनाया है, जिसे 2 जीबी फाइल में कॉपी किया गया है, diff'फाइल को ओरिजिनल के खिलाफ और फिर - फाइल के एनिस होने के बाद से - इसे एक इमेज के रूप में माउंट किया और फाइलसिस्टम को उसके अंदर ब्राउज किया।

कार्ड अभी भी ठीक है। जो शायद उम्मीद की जा रही है, आखिर ...

;);)


मुझे नहीं लगता कि आपका गणित सही है। कक्षा 2 के कार्ड में 2MB / s निरंतर होता है, इसका मतलब है कि आप लगभग 4 महीने में 20TB डाल देंगे। बेशक, आप आप एक गैर वर्गीकृत कार्ड है, लेकिन तुम सच में बंद परिमाण के आदेश होने लगते हैं (जैसा कि terdon में बताया उल्लेख unix.stackexchange.com/questions/84902/... )। अन्यथा मैं स्लम से पूरी तरह सहमत हूं।
पीटर ऑक्ट

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

इसके अलावा, btw, badblocksफ्लैश मेमोरी पर आपको विफल पृष्ठों को नहीं दिखाएगा। यह इस काम के लिए सही उपकरण नहीं है और आप इसका उपयोग फ्लैश पर विफल पृष्ठों को खोजने के लिए नहीं कर सकते हैं। जब नियंत्रक एक विफलता का पता लगाता है तो यह आंतरिक रूप से पृष्ठ को खराब के रूप में चिह्नित करेगा और इसे आरक्षित स्थान के एक पृष्ठ पर रीमैप करेगा। यह सब नियंत्रक के पीछे होता है और आपको दिखाई नहीं देता है, यहां तक ​​कि एक कच्चे उपकरण डंप में भी । यदि SMART समर्थित है तो आप कंट्रोलर से कुछ जानकारी प्राप्त कर सकते हैं। डिवाइस पर डेटा का भौतिक क्रम डिवाइस पर IO करते समय आपके द्वारा देखे जाने वाले बाइट्स के क्रम से मेल नहीं खाता है।
जेसन सी

एक और टिप्पणी, एक FYI करें: एक सैनडिस्क 8GB माइक्रोएसडी पर, उपभोक्ता ग्रेड, आवंटन इकाई (यानी पृष्ठ का आकार) 4MB है जैसा कि नियंत्रक द्वारा रिपोर्ट किया गया है; इसका अर्थ है कि उस कार्ड पर १६ एमबी ४ पृष्ठ हैं (५ यदि यह संरेखित नहीं है)। आप कार्ड को 16MB खिलाने के बजाय एक दूसरे से 4MB ऑफसेट पर 512 बाइट्स लिखकर उस परीक्षण को गति दे सकते हैं। आप बाइट्स और पेजों की संख्या के बीच अंतर नहीं कर रहे हैं, लेकिन आपको होना चाहिए - आपके उदाहरण में, यदि यह सैनडिस्क 8 जीबी कार्ड पर था, तो "16 एमबी" कार्ड पर "2KB" के समान ही पहनता है। पृष्ठों के बजाय बाइट्स को संदर्भित करना बहुत भ्रामक है।
जेसन सी

ऊपर लिखे गए परीक्षण कार्यक्रम में ~ 8.1mil पुनरावृत्तियों (8hrs से अधिक) के बाद, एक शक्ति चक्र के बाद, एक नए सैनडिस्क 8GB माइक्रोएसडी पर, लिखने की गति स्थायी रूप से 450kB / सेकंड तक सीमित है और dd250MB के बारे में अतीत लिखने में विफल रहा है निशान। तीसरे ddप्रयास में इसे 250 एमबी से आगे बढ़ाया और एक बार ऐसा करने के बाद, उन क्षेत्रों में फिर से प्रदर्शन बढ़ा। मैं यह नहीं कहूंगा कि कार्ड नष्ट हो गया है लेकिन यह निश्चित रूप से 100% नहीं है।
जेसन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.