ทดสอบความเครียดการ์ด SD โดยใช้ linux


19

ฉันได้พูดคุยกับใครบางคนเมื่อวานนี้เกี่ยวกับตรรกะและ / หรือความเป็นจริงของคำตอบของฉันที่นี่ , การเข้าสู่ระบบและการรักษาข้อมูล meta-fs บนการ์ด SD ขนาดที่เหมาะสม (GB +) อาจไม่มีนัยสำคัญพอที่จะสวมใส่การ์ด ในเวลาที่เหมาะสม (ปีและปี) เรื่องตลกของการโต้แย้งดูเหมือนว่าฉันจะต้องผิดเพราะมีเรื่องราวมากมายทางออนไลน์ของผู้คนที่ใส่การ์ด SD

เนื่องจากฉันมีอุปกรณ์ที่มีการ์ด SD ในนั้นซึ่งมีระบบไฟล์ rw root ที่เหลืออยู่ในทุกวันตลอด 24 ชั่วโมงฉันจึงทดสอบสถานที่ตั้งก่อนเพื่อความพึงพอใจของฉันเอง ฉันบิดการทดสอบนี้เล็กน้อยทำซ้ำ (โดยใช้บัตรใบเดียวกันจริง ๆ ) แล้วนำเสนอที่นี่ คำถามกลางสองข้อที่ฉันมีคือ:

  1. เป็นวิธีที่ผมใช้ในการพยายามที่จะทำลายการ์ดที่ทำงานได้เก็บรักษาในใจก็ตั้งใจที่จะทำผลของอย่างต่อเนื่องอีกครั้งเขียนขนาดเล็กปริมาณของข้อมูล?
  2. วิธีการที่ฉันใช้ในการตรวจสอบการ์ดยังใช้งานได้ดีอยู่หรือไม่?

ฉันวางคำถามไว้ที่นี่แทนที่จะเป็น SO หรือ SuperUser เพราะการคัดค้านในส่วนแรกอาจจะต้องยืนยันว่าการทดสอบของฉันไม่ได้เขียนลงในการ์ดอย่างที่ฉันแน่ใจและทำอย่างนั้น ความรู้พิเศษของ linux

[อาจเป็นเพราะการ์ด SD ใช้สมาร์ทบัฟเฟอร์หรือแคชบางอย่างเช่นการเขียนซ้ำไปยังที่เดิมซ้ำ ๆ จะถูกบัฟเฟอร์ / แคชไว้ในที่ที่ไม่ต้องสวมใส่ ฉันไม่พบสิ่งบ่งชี้ใด ๆ ที่นี่ แต่ฉันกำลังถามเกี่ยวกับสิ่งนั้นใน SU]

แนวคิดที่อยู่เบื้องหลังการทดสอบคือการเขียนบล็อกเล็ก ๆ ที่เหมือนกันบนการ์ดหลายล้านครั้ง นี่เป็นสิ่งที่ดีเกินกว่าจะอ้างได้ว่าอุปกรณ์ดังกล่าวสามารถรักษาวงจรได้เท่าไร แต่การสันนิษฐานว่าการสึกหรอระดับมีประสิทธิภาพหากการ์ดมีขนาดที่เหมาะสมจำนวนการเขียนเช่นนี้นับล้านยังคงไม่สำคัญเท่าที่ควร "บล็อกเดียวกัน" ไม่ได้เป็นบล็อกทางกายภาพเดียวกัน การทำเช่นนี้ผมจำเป็นต้องมีเพื่อให้แน่ใจว่าทุกคนเขียนได้รับการล้างอย่างแท้จริงกับฮาร์ดแวร์และเหมือนกันที่เห็นได้ชัดขึ้น

สำหรับการฟลัชกับฮาร์ดแวร์ฉันอาศัยการเรียกไลบรารี 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/sdb1พาร์ทิชัน 1 ฉันสามารถใช้งานได้ง่าย/dev/sdb(อุปกรณ์ดิบและไม่ใช่พาร์ติชัน) แต่ฉันไม่เห็นความแตกต่างที่จะเกิดขึ้น

/dev/sdb1จากนั้นผมก็ตรวจสอบบัตรโดยพยายามที่จะสร้างและติดตั้งระบบแฟ้มบน วิธีนี้ใช้งานได้การระบุบล็อกเฉพาะที่ฉันเขียนถึงทั้งคืนเป็นไปได้ อย่างไรก็ตามมันไม่ได้หมายความว่าบางส่วนของการ์ดไม่ได้ถูกชำรุดและถูกแทนที่โดยการปรับระดับการสึกหรอ แต่สามารถเข้าถึงได้

เพื่อทดสอบฉันใช้badblocks -v -wพาร์ติชั่น นี่คือการทดสอบการอ่าน - เขียนแบบทำลายล้างแต่ระดับการสึกหรอหรือไม่ควรเป็นตัวบ่งชี้ที่แข็งแกร่งของความเป็นไปได้ของการ์ดเนื่องจากมันจะต้องให้พื้นที่สำหรับการเขียนแต่ละม้วน กล่าวอีกนัยหนึ่งมันเท่ากับการเติมตัวอักษรอย่างสมบูรณ์จากนั้นตรวจสอบว่าทั้งหมดนั้นใช้ได้ หลายครั้งเนื่องจากฉันปล่อยให้แบดบล็อกทำงานหลายรูปแบบ

[ความคิดเห็นของ Contra Jason C ด้านล่างไม่มีอะไรผิดปกติหรือเป็นเท็จเกี่ยวกับการใช้ badblocks ด้วยวิธีนี้ แม้ว่ามันจะไม่เป็นประโยชน์สำหรับการระบุบล็อกที่ไม่ดีเนื่องจากลักษณะของการ์ด SD มันเป็นเรื่องปกติที่จะทำการทดสอบการอ่าน - เขียนแบบทำลายล้างขนาดโดยพลการโดยใช้-bและ-cสวิตช์ซึ่งเป็นที่การทดสอบที่แก้ไขไป (ดูคำตอบของฉันเอง ) ไม่มีเวทมนตร์หรือการแคชโดยคอนโทรลเลอร์ของการ์ดที่จะหลอกการทดสอบโดยที่ข้อมูลหลายเมกะไบต์สามารถเขียนลงในฮาร์ดแวร์และอ่านได้อย่างถูกต้องอีกครั้ง ความคิดเห็นอื่น ๆ ของเจสันดูเหมือนจะมาจากความเข้าใจผิด - IMO เป็นความตั้งใจซึ่งเป็นเหตุผลว่าทำไมฉันไม่ใส่ใจที่จะโต้แย้ง เมื่อถึงตอนนั้นฉันก็ปล่อยให้ผู้อ่านตัดสินใจว่าอะไรเหมาะสมและอะไรที่ไม่เหมาะสม]

1การ์ดนี้เป็นการ์ด Sandisk ขนาด 4 GB (ไม่มีหมายเลข "คลาส" อยู่) ซึ่งฉันใช้แทบจะไม่ โปรดจำไว้ว่านี่ไม่ใช่การเขียน 2 ล้านฉบับในสถานที่จริง เนื่องจากการสึกหรอระดับ "บล็อกแรก" จะถูกย้ายอย่างต่อเนื่องโดยผู้ควบคุมในระหว่างการทดสอบเพื่อเป็นคำรัฐระดับการสึกหรอ


นี่คือการทดสอบที่ไม่น่าเชื่อถือสำหรับเหตุผลที่ระบุไว้ด้านล่าง นอกจากนี้คุณไม่สามารถใช้badblocksเพื่อแสดงความล้มเหลวของหน้าบนแฟลชไดรฟ์ (และอ้างว่าเป็นสิ่งที่ทำให้เข้าใจผิดมาก) สิ่งเหล่านี้ได้รับการจัดการโดยคอนโทรลเลอร์และแมปเพื่อสำรองพื้นที่เมื่อตรวจพบ เลย์เอาต์แบบฟิสิคัลของข้อมูลในไดรฟ์นั้นไม่เหมือนกับเลย์เอาต์แบบฟิสิคัลที่คุณเห็นเมื่อทำ I / O นั่นคือการปรับระดับการสึกหรอช่วยรักษาความโปร่งใส ไม่มีของที่นี่คือปรากฏให้คุณเห็นในช่วง I / O อย่างน้อยที่สุดถ้าไดรฟ์รองรับสมาร์ทคุณสามารถรับข้อมูลเล็กน้อยเกี่ยวกับความล้มเหลวและพื้นที่สงวนที่เหลืออยู่จากคอนโทรลเลอร์
Jason C

สำหรับ/dev/sdb1VS /dev/sdbมันทำให้ไม่แตกต่างกันสำหรับโปรแกรมของคุณ แต่สิ่งที่ไม่สร้างความแตกต่าง (ตามที่อธิบายไว้ด้านล่าง) คือการที่รัฐของบล็อกที่ไม่ได้ใช้ในอุปกรณ์ของคุณเป็นที่รู้จักและแปลกสำหรับในการทดสอบของคุณและถ้าคุณกรอกข้อมูลอุปกรณ์ทั้งหมด (เช่น/dev/sdb) กับข้อมูลก่อนจำนวนของการปรับระดับการสึกหรอของพื้นที่ต้องทำงานเป็นตัวแปรหลัก ดังนั้นในขณะที่อุปกรณ์กับพาร์ติชันไม่เกี่ยวข้องกับการทดสอบของคุณซึ่งส่วนใหญ่เป็นผลมาจากการทดสอบที่มีข้อบกพร่องเนื่องจากหลังจากกรอกข้อมูลด้วยอุปกรณ์อย่างถูกต้องแล้วพาร์ทิชันต่อจะไม่เป็นตัวเลือกที่ใช้ได้
Jason C

อีกจุดหนึ่งที่ทำให้การทดสอบของคุณไม่สมจริงคือหน้าหนึ่งสามารถ (และโดยทั่วไปแล้ว) ล้มเหลว แต่ยังคงทิ้งการ์ด SD ไว้ 100% ใช้งานได้หลังจากนั้น ในกรณีที่คอนโทรลเลอร์ตรวจจับและขัดข้อง แต่ไม่สามารถอ่านข้อมูลได้ข้อมูลระบบไฟล์อาจเสียหายเมื่อคอนโทรลเลอร์พยายามคัดลอกบล็อก
Jason C

ฉันจะบอกคุณว่า - อธิบายให้ฉันในแง่ที่เฉพาะเจาะจงสำหรับการทดสอบที่ทำซ้ำได้ซึ่งจะใส่การ์ด SD ออกจากนั้นฉันจะพาคุณไปอย่างจริงจัง "การเรียกร้องจากผู้มีอำนาจ" ที่ไม่สามารถพิสูจน์ได้และเกร็ดเล็กเกร็ดน้อยส่วนตัวเป็นเพียงแค่นั้น Argumentum ab auctoritate
goldilocks

1
ฉันไม่รู้เกี่ยวกับการ์ดใบนั้น แต่ส่วนใหญ่อย่างน้อยก็ตายไปแล้ว พวกเหล่านี้แฮ็คไมโครคอนโทรลเลอร์บนการ์ด SD อย่างน้อยหนึ่งแบรนด์: bunniestudios.com/blog/?p=3554การพูดคุยชั่วโมงต่อชั่วโมงที่พวกเขาทำในหัวข้อนี้ค่อนข้างดี
mikeserv

คำตอบ:


11

ฉันคิดว่าการทดสอบความเครียดการ์ด SD โดยทั่วไปเป็นปัญหาเนื่องจาก 2 สิ่ง:

  1. การปรับระดับการสึกหรอไม่มีการรับประกันว่าสิ่งที่เขียนไปยังสิ่งถัดไปคือการใช้ตำแหน่งทางกายภาพเดียวกันใน SD โปรดจำไว้ว่าระบบ SD ส่วนใหญ่ในสถานที่กำลังทำการบล็อกอย่างแข็งขันในขณะที่เรารู้และเคลื่อนย้ายตำแหน่งทางกายภาพที่อยู่ด้านหลังโดยยึดตาม "การสวมใส่" ที่รับรู้ซึ่งแต่ละตำแหน่งมีอยู่

  2. เทคโนโลยีที่แตกต่าง (MLC กับ SLC) ปัญหาอื่น ๆ ที่ฉันเห็นด้วยคือความแตกต่างของเทคโนโลยี SSD ชนิด SLC ฉันคาดหวังว่าจะมีอายุการใช้งานยาวนานขึ้นเมื่อเทียบกับ MLC หลากหลาย นอกจากนี้ยังมีความคลาดเคลื่อนที่เข้มงวดมากขึ้นสำหรับ MLC ที่คุณไม่ต้องจัดการกับ SLC หรืออย่างน้อยพวกเขาก็ทนต่อความล้มเหลวได้มากกว่านี้

    • MLC - เซลล์หลายระดับ
    • SLC - เซลล์ระดับเดียว

ปัญหาที่เกิดขึ้นกับ MLC คือเซลล์ที่กำหนดสามารถเก็บค่าได้หลายค่าบิตจะถูกสแต็กโดยใช้แรงดันไฟฟ้าแทนที่จะเป็นแค่กายภาพ + 5V หรือ 0V เป็นต้นดังนั้นจึงสามารถนำไปสู่อัตราความล้มเหลวที่สูงกว่า SLC เท่ากัน

อายุขัย

ฉันพบลิงค์นี้ที่กล่าวถึงเล็กน้อยเกี่ยวกับระยะเวลาที่ฮาร์ดแวร์สามารถใช้งานได้นาน มันชื่อ: รู้ SSDs ของคุณ - SLC เทียบกับแอลซี

SLC

SLC ssds สามารถคำนวณได้โดยส่วนใหญ่อาศัยอยู่ที่ใดก็ได้ระหว่าง 49 ปีถึง 149 ปีโดยเฉลี่ยโดยการประมาณการที่ดีที่สุด การทดสอบ Memoright สามารถตรวจสอบ 128Gb SSD ที่มีอายุการใช้งานการเขียนยาวนานกว่า 200 ปีด้วยการเขียนเฉลี่ย 100Gb ต่อวัน

แอลซี

นี่คือที่การออกแบบ mlc สั้น ยังไม่มีการเผยแพร่ในขณะนี้ ไม่มีใครตรวจสอบว่าอายุขัยที่แน่นอนคืออะไรกับ mlc ยกเว้นว่ามันจะลดลงอย่างมาก ฉันได้รับความเชื่อที่แตกต่างกันซึ่งเฉลี่ย 10 ถึง 1 อายุการใช้งานในความโปรดปรานของการออกแบบ slc การคาดเดาแบบอนุรักษ์นิยมคือการประมาณอายุการใช้งานส่วนใหญ่จะอยู่ระหว่าง 7 ถึง 10 ปีขึ้นอยู่กับความก้าวหน้าของ 'algorythms การปรับระดับการสึกหรอ' ภายในตัวควบคุมของผู้ผลิตแต่ละราย

เปรียบเทียบ

ในการวาดการเปรียบเทียบโดยใช้วงจรการเขียน slc จะมีอายุการใช้งาน 100,000 รอบการเขียนที่สมบูรณ์เมื่อเปรียบเทียบกับ mlc ซึ่งมีอายุการใช้งาน 10,000 รอบการเขียน สิ่งนี้สามารถเพิ่มขึ้นอย่างมีนัยสำคัญขึ้นอยู่กับการออกแบบของ 'ระดับการสึกหรอ' ที่ใช้


1
การปรับระดับการสวมใส่ของ WRT "ไม่มีการรับประกันว่าสิ่งที่เขียนไปยังหน้าถัดไปคือการใช้ตำแหน่งทางกายภาพที่เหมือนกันใน SD" - ที่อยู่ในคำถาม slm! อย่างชัดเจนมากฉันคิดว่า ... หากไม่มีการปรับระดับการสึกหรอฉันจะไม่คาดหวังว่าการทดสอบนี้จะผ่านเนื่องจากฉันไปไกลเกินกว่าอายุการใช้งานของวงจรการเขียนที่ระบุไว้ การทดสอบมีวัตถุประสงค์เพื่อพิสูจน์ประสิทธิภาพของการสวมใส่ปรับระดับไม่สนใจมัน ความจริงที่ว่าฉันสามารถเขียน 2 ล้านครั้งไปยังที่ที่เห็นได้ชัดเดียวกันบ่งชี้ว่าการปรับระดับการสึกหรอมีผล
goldilocks

แน่นอนว่า WRT # 2 คุณภาพและเทคโนโลยีจะแยกความแตกต่างจากการ์ดใบหนึ่ง ประเด็นของฉันก็คือการ์ด Sandisk ที่ทำงานอยู่ในโรงงานจะยังคงอยู่ได้นานกว่าใคร ๆ ก็ต้องการเช่นกันหากปริมาณข้อมูลที่เขียนต่อวันค่อนข้างน้อย
goldilocks

@goldilocks - ตกลงตกลงไม่ตีฉันเกี่ยวกับเรื่องนี้ 8-) ดังนั้นสิ่งที่คุณกำลังพูดคือถ้าฉันเขียนข้อมูลจำนวนมากพอที่จะกำจัดระดับการสึกหรอออกจากสมการได้อย่างมีประสิทธิภาพและรัน badblock บนมันก็เพียงพอที่จะแสดงประสิทธิภาพของการปรับระดับการสึกหรอหรือไม่
slm

1
@goldilocks - ฉันเพิ่งเปิดกล่องแพนโดร่าหรือไม่?
slm

1
(ตัวอย่างเช่น: หากคุณโคลนการ์ด SD โดยเขียนภาพลงไปและไม่สามารถ / ไม่สามารถทำได้fstrimหลังจากนั้นคุณได้ปิดระดับการสึกหรอแบบไดนามิกทั้งหมด [คุณจะกดยากเพื่อหาการ์ด SD ระดับผู้บริโภคที่มีระดับการสึกหรอแบบคงที่] โดย ทำเครื่องหมายทุกหน้าตามที่ใช้)
Jason C

6

มีปัญหาหลายอย่างเกี่ยวกับการทดสอบของคุณปัญหาบางอย่างไม่ชัดเจน มันขึ้นอยู่กับเป้าหมายของคุณด้วย ปัญหาฟัซซี่ที่ลึกซึ้งสองอย่างคือ:

  • คุณไม่ได้อ่านจากพื้นที่เดียวกับที่คุณเขียนถึงการทดสอบการอ่านของคุณอย่างมีประสิทธิภาพแล้วไม่ทำอะไรเลย (เว้นแต่ว่าผู้ควบคุมได้อ่านการแก้ไขการรบกวนซึ่งในบางครั้งมันอาจย้ายหน้าที่อ่านไปยังที่อื่นเป็นครั้งคราว ไม่ส่งผลกระทบต่อการทดสอบของคุณ)
  • คุณถือว่า (และเป็นไปได้ แต่ไม่รับประกัน) ว่าตัวควบคุมการอ่าน / เขียนไปยังบล็อกที่ไม่ดีและรายงานโดยตัวควบคุม - คุณต้องการเขียนข้อมูลอ่านกลับมาและเปรียบเทียบเพื่อการตรวจสอบที่รับประกัน

อย่างไรก็ตามสิ่งเหล่านี้มีความอวดดีในเนื้อหา ร้ายแรงยิ่งขึ้นคือ:

  • คุณไม่สามารถใช้badblocksแสดงหน้าเว็บที่ล้มเหลวในหน่วยความจำแฟลช การตรวจจับความล้มเหลวทั้งหมดและการแมปเพจที่ตามมาทำโดยคอนโทรลเลอร์และโปร่งใสต่อระบบปฏิบัติการ คุณสามารถรับข้อมูลบางอย่างจากสมาร์ทได้หากไดรฟ์รองรับ (ฉันรู้ว่าไม่มีการ์ด SD ที่สนับสนุน
  • การปรับระดับการสวมใส่มีความซับซ้อนโดยการทดสอบของคุณโดยไม่คำนึงถึงคำสั่ง TRIM ก่อนหน้านี้สถานะของไดรฟ์ที่ว่าง / ใช้แล้วในระหว่างการทดสอบและพื้นที่สงวน

Wear Leveling:ปัญหาหลักคือการปรับระดับการสึกหรอเป็นตัวแปรสำคัญในการทดสอบของคุณ มันเกิดขึ้นบนคอนโทรลเลอร์ (โดยปกติ) และในกรณีใด ๆ อุปกรณ์จะโปร่งใสแม้จะค้นหา + อ่าน / เขียน ในตัวอย่างของคุณคุณไม่ทราบสภาพการสวมใส่ (โดยเฉพาะอย่างยิ่งมีการออกคำสั่ง TRIM ให้กับบล็อกฟรีเร็ว ๆ นี้หรือไม่?) ...

สำหรับการปรับระดับการสึกหรอแบบไดนามิก (มีอยู่ในอุปกรณ์จัดเก็บข้อมูลสำหรับผู้บริโภคระดับเกือบทั้งหมด) บนอุปกรณ์ของคุณจากนั้นอาจอยู่ในสถานะใด ๆ : เพียงหนึ่งครั้งที่รุนแรงไม่มีหน้าใดที่ถูกทำเครื่องหมายว่าว่าง ด้วยเป็นคนที่อยู่ในพื้นที่สงวน (ถ้ามี) โปรดทราบว่าถ้ามีเป็นพื้นที่ที่สงวนไว้บนอุปกรณ์ก็จะต้องล้มเหลวอย่างสิ้นเชิงก่อนที่จะเริ่มได้รับการรับประกันล้มเหลวในการเขียนหน้า (ทะนงไม่มีหน้าอื่น ๆ ทำเครื่องหมายว่าเป็นฟรีที่เหลือ) อีกด้านหนึ่งทุกหน้าถูกทำเครื่องหมายว่าว่างซึ่งในทางทฤษฎีคุณต้องมีทุกหน้าบนอุปกรณ์ล้มเหลวก่อนที่คุณจะเริ่มเห็นความล้มเหลวในการเขียน

สำหรับการปรับระดับการสึกหรอแบบคงที่ (SSD มีแนวโน้มที่จะมีการ์ด SD มักจะไม่มีและไดรฟ์หัวแม่มือแตกต่างกันไป): ไม่มีทางอยู่รอบตัวนอกเหนือไปจากการเขียนซ้ำไปยังทุกหน้าบนอุปกรณ์

... อีกนัยหนึ่งมีรายละเอียดการสวมระดับการสวมใส่ที่คุณไม่มีทางรู้และแน่นอนว่าไม่มีวิธีการควบคุม - โดยเฉพาะอย่างยิ่งการใช้การปรับระดับการสึกหรอแบบไดนามิกหรือไม่การใช้งานการปรับระดับการสึกหรอแบบคงที่หรือไม่ จำนวนพื้นที่ที่สงวนไว้ในอุปกรณ์สำหรับปรับระดับการสึกหรอ (ซึ่งไม่สามารถมองเห็นได้ผ่านตัวควบคุม [หรือไดรเวอร์ในบางกรณีเช่น M- ระบบเก่า DiskOnChip])

SLC / MLC:สำหรับ SLC กับ MLC สิ่งนี้มีผลกระทบโดยตรงกับขีด จำกัด ที่คุณคาดหวัง แต่ขั้นตอนการปรับระดับการสึกหรอทั่วไปและขั้นตอนการทดสอบจะเหมือนกันสำหรับทั้งสอง ผู้ค้าหลายรายไม่เผยแพร่ว่าอุปกรณ์ของพวกเขาคือ SLC หรือ MLC สำหรับสินค้าอุปโภคบริโภคที่ราคาถูกกว่าถึงแม้ว่าแฟลชไดรฟ์ใด ๆ ที่อ้างว่ามีขีด จำกัด รอบ 100k + ต่อหน้าก็น่าจะเป็น SLC (การแลกเปลี่ยนที่ง่าย

การแคช:สำหรับแคชมันเป็นเรื่องไม่แน่นอน ในระดับระบบปฏิบัติการในกรณีทั่วไปแน่นอน fsync / fdatasync ไม่รับประกันว่าข้อมูลจะถูกเขียนจริง อย่างไรก็ตามฉันคิดว่ามันปลอดภัยที่จะเข้าใจว่ามันเป็น (หรืออย่างน้อยผู้ควบคุมได้มุ่งมั่นที่จะทำเช่นการเขียนจะไม่ถูกกลืนในแคช) ในกรณีนี้เนื่องจากไดรฟ์แบบถอดได้ได้รับการออกแบบโดยทั่วไปสำหรับรูปแบบการใช้งานทั่วไปของ "eject" (unmount> sync) จากนั้นลบ (power cut) แม้ว่าเราจะไม่ทราบแน่ชัดการเดาที่มีการศึกษาบอกว่าปลอดภัยที่จะถือว่าการซิงค์นั้นรับประกันได้ว่าการเขียนจะเกิดขึ้นอย่างแน่นอนโดยเฉพาะอย่างยิ่งในการเขียน -> ซิงค์ -> อ่านกลับมา (ถ้าไม่ใช่ก็ไม่น่าเชื่อถือ) หลังจากดีดออก) ไม่มีคำสั่งอื่นนอกเหนือจาก 'ซิงค์' ที่สามารถออกได้เมื่อนำออก

ที่ตัวควบคุมทุกอย่างก็เป็นไปได้ แต่ข้อสันนิษฐานข้างต้นยังรวมถึงข้อสันนิษฐานที่ว่าตัวควบคุมอย่างน้อยก็ไม่ได้ทำอะไร "ซับซ้อน" มากพอที่จะเสี่ยงต่อการสูญเสียข้อมูลหลังจากการซิงค์ เป็นไปได้ว่าตัวควบคุมอาจพูดบัฟเฟอร์และกลุ่มเขียนหรือไม่เขียนข้อมูลหากข้อมูลเดียวกันจะถูกเขียนใหม่ (ในขอบเขตที่ จำกัด ) ในโปรแกรมด้านล่างเราสลับระหว่างบล็อกข้อมูลที่แตกต่างกันสองชุดและทำการซิงค์ก่อนการอ่านกลับโดยเฉพาะเพื่อกำจัดกลไกการแคชตัวควบคุมที่เหมาะสม แน่นอนว่ายังไม่มีการรับประกันและไม่มีทางรู้ แต่เราสามารถตั้งสมมติฐานได้อย่างสมเหตุสมผลจากการใช้งานปกติของอุปกรณ์เหล่านี้และกลไกการแคชที่มีสติ / ร่วมกัน

การทดสอบ:

น่าเสียดายที่ความจริงคือถ้าคุณไม่ทราบว่าอุปกรณ์ไม่มีพื้นที่สงวนและไม่ได้ปรับระดับคงที่ไม่มีวิธีทดสอบขอบเขตของหน้าเว็บที่แน่นอน อย่างไรก็ตามสิ่งที่ใกล้เคียงที่สุดที่คุณจะได้รับมีดังนี้ (สมมุติว่าไม่มีการปรับระดับการสึกหรอแบบคงที่):

แรกสิ่งที่คุณต้องทำคือการกรอกข้อมูลบัตรทั้งหมดที่มีข้อมูล สิ่งนี้สำคัญและเป็นตัวแปรหลักที่เหลืออยู่ในการทดสอบดั้งเดิมของคุณ บล็อกนี้ทำเครื่องหมายได้มากเท่าที่เป็นไปได้ที่ใช้นอกเหนือจากพื้นที่สงวนใด ๆ (ซึ่งคุณไม่มีทางเข้าถึง) โปรดทราบว่าเรากำลังทำงานกับอุปกรณ์ทั้งหมด (ซึ่งจะเป็นการทำลายข้อมูลทั้งหมด) เนื่องจากการทำงานกับพาร์ติชันเดียวจะมีผลกับพื้นที่เฉพาะบนอุปกรณ์เท่านั้น:

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 ไบต์การเขียนที่จัดชิดนั้นใช้ได้ดีซึ่งจะทำให้คุณลบและเขียนใหม่ทั้งหมด คุณสามารถเร่งความเร็วการทดสอบได้อย่างมีนัยสำคัญโดยการใช้ขนาดบล็อกที่ใหญ่ขึ้น แต่ก็มีความซับซ้อนที่จะได้ผลลัพธ์ที่เป็นรูปธรรม

ขณะนี้ฉันกำลังทดสอบไดรฟ์หัวแม่มือ 4GB PNY ที่ดูดีกว่าที่ฉันพบบนทางเท้าเมื่อวานนี้ (ดูเหมือนจะเป็นสิ่งที่เหลืออยู่ของhttp://www3.pny.com/4GB-Micro-Sleek-Attach-- -Purple-P2990C418.aspx )

โปรแกรมข้างต้นเป็นเวอร์ชั่น จำกัดbadblocksและคุณจะไม่เห็นความล้มเหลวจนกว่าพื้นที่สงวนทั้งหมดจะหมด ดังนั้นความคาดหวัง (โดยมี 1 หน้าเขียนต่อการทำซ้ำ) คือขั้นตอนข้างต้นโดยเฉลี่ยควรล้มเหลวในการจองซ้ำReserv_page_count * write_cycle_limit มันเป็นไดรฟ์หัวแม่มือที่แย่เกินไปและการ์ด SD มักไม่รองรับ SMART ซึ่งมีความสามารถในการรายงานขนาดพื้นที่สงวน

โดยวิธีการที่fsyncvs fdatasyncทำให้ไม่มีความแตกต่างสำหรับอุปกรณ์บล็อกที่คุณเขียนเพื่อการทดสอบนี้ open()โหมดของคุณมีความสำคัญ

หากคุณสงสัยเกี่ยวกับรายละเอียดทางเทคนิค นี่คือทุกสิ่งที่คุณอาจต้องการทราบ (เพิ่มเติม) เกี่ยวกับผลงานด้านในของการ์ด SD: https://www.sdcard.org/downloads/pls/simplified_specs/part1_410.pdf

แก้ไข: ไบต์เทียบกับหน้า:ในบริบทของการทดสอบประเภทนี้สิ่งสำคัญคือการคิดถึงสิ่งต่าง ๆ ในรูปแบบของหน้าไม่ใช่ไบต์ มันอาจทำให้เข้าใจผิดมากที่จะทำตรงข้าม ตัวอย่างเช่นบน SanDisk 8GB SD ขนาดหน้าตามตัวควบคุม (เข้าถึงได้ทาง/sys/classes/mmc_host/mmc?/mmc?:????/preferred_erase_size) คือเต็ม 4MB กำลังเขียน 16MB (จัดแนวกับขอบเขต 4MB) จากนั้นลบ / เขียน 4 หน้า อย่างไรก็ตามการเขียนสี่ไบต์เดียวละที่ 4MB offsets จากกันและกันก็ลบ / เขียน 4 หน้า

มันไม่ถูกต้องจากนั้นจะพูดว่า "ฉันทดสอบด้วยการเขียน 16MB" เนื่องจากมีจำนวนการสึกหรอเท่ากับ "ฉันทดสอบด้วยการเขียน 4 ไบต์" แม่นยำยิ่งขึ้น "ฉันทดสอบด้วยการเขียน 4 หน้า"


ฉันได้เพิ่มความคิดเห็นเกี่ยวกับไบต์เทียบกับหน้า
Jason C

PNY ไม่สามารถทำลายได้ อย่างไรก็ตามหลังจากทำซ้ำ 8.1mil (มากกว่า 8 ชั่วโมง) ใน SanDisk 8GB MicroSD ใหม่ล่าสุดตามด้วยรอบการใช้พลังงานอัตราการเขียนสูงสุด (แต่เดิม 4MB / วินาที) ลดลงอย่างถาวรถึง 410kB / วินาทีและddล้มเหลวหลังจากเขียน 250MB . ความเสียหายจะไม่ปรากฏขึ้นจนกว่าจะผ่านรอบพลังงาน thumb drive PNY ยังคงไม่ได้รับผลกระทบหลังจากทำซ้ำ ~ 30mil ฉันปรับเปลี่ยนโปรแกรมข้างต้น (ไม่สะท้อนในโค้ดด้านบน) เพื่อเขียนไปยังตำแหน่งที่จัดแนวแบบสุ่มขนาด 16kB ในแต่ละครั้งแทนที่จะเป็นแบบเดียวกัน แต่ฉันทำหลังจาก ~ 4mil iters บน SD จะสอบใหม่ด้วยบัตรใหม่
Jason C

ความพยายามครั้งที่สามddในการ์ดใบนั้นทำให้ผ่านเครื่องหมาย 250MB และประสิทธิภาพการเขียนเพิ่มขึ้นอีกครั้งเป็น 4MB / วินาทีเต็มไปยังพื้นที่หลังจากจุดนั้น ฉันคาดหวังว่าประสิทธิภาพจะไม่สามารถคาดเดาได้ แต่เนื่องจากบล็อกยังคงถูกสับเปลี่ยนอยู่ ฉันจะไม่บอกว่าการ์ดถูกทำลาย แต่ก็ไม่ได้อยู่ที่ 100% อย่างแน่นอน
Jason C

5

เพียงแค่เพิ่มบางจุดที่จะตอบ SLM ของ - ทราบเหล่านี้มีมากขึ้นในสถานที่สำหรับ SSDs กว่าสำหรับ "โง่" SD การ์ดตั้งแต่ SSDs เล่นมากเทคนิคสกปรกกับข้อมูลของคุณ (เช่น de ซ้ำ):

  • คุณกำลังเขียน 64KB ไปยังจุดเริ่มต้นของอุปกรณ์ - ตัวมันเองมีสองปัญหา:

    1. เซลล์แฟลชมักจะมีการลบบล็อกขนาดตั้งแต่ 16KB ขึ้นไป (มีแนวโน้มมากขึ้นในช่วง 128-512KB) ซึ่งหมายความว่ามันต้องการแคชอย่างน้อยขนาดนี้ ดังนั้นการเขียน 64KB ดูเหมือนจะไม่เพียงพอสำหรับฉัน

    2. สำหรับโซลูชันระดับล่าง (อ่าน "ไม่ใช่องค์กร") (และฉันคาดหวังว่าสิ่งนี้จะยิ่งมากขึ้นสำหรับการ์ด SD / CF มากกว่าผู้ผลิต SSD) อาจเลือกที่จะทำให้การเริ่มต้นของอุปกรณ์มีความยืดหยุ่นในการสวมใส่มากกว่าส่วนที่เหลือตั้งแต่ โครงสร้างที่สำคัญ - ตารางพาร์ติชันและ FAT บนพาร์ติชันเดียวบนอุปกรณ์ (การ์ดหน่วยความจำส่วนใหญ่ใช้การตั้งค่านี้) - อยู่ที่นั่น ดังนั้นการทดสอบจุดเริ่มต้นของการ์ดอาจมีอคติ

  • fdatasync() ไม่ได้รับประกันว่าข้อมูลจะถูกเขียนลงในสื่อที่มีอยู่จริง (แม้ว่าอาจเป็นสิ่งที่ดีที่สุดที่อยู่ภายใต้การควบคุมของระบบปฏิบัติการ) - ดู man page

    การโทรจะบล็อกจนกว่าอุปกรณ์จะรายงานว่าการถ่ายโอนเสร็จสิ้น

    ฉันจะไม่แปลกใจมากไปถ้าปรากฏว่ามีตัวเก็บประจุขนาดเล็กที่สามารถให้พลังงานสำหรับการเขียนข้อมูลที่เก็บไว้ในหน่วยความจำแฟลชในกรณีที่สูญเสียพลังงานภายนอก

    ไม่ว่าในกรณีใดก็ตามภายใต้การสันนิษฐานว่ามีแคชอยู่บนการ์ด (ดูคำตอบของฉันสำหรับคำถามเกี่ยวกับ SU ) การเขียน 64KB และการซิงค์ (กับfdatasync()) ดูเหมือนจะไม่น่าเชื่อถือเพียงพอสำหรับจุดประสงค์นี้ แม้ว่าจะไม่มี "การสำรองพลังงาน" ก็ตาม แต่เฟิร์มแวร์อาจยังเล่นไม่ปลอดภัยและเก็บข้อมูลที่ไม่ได้เขียนไว้นานกว่าที่คาดไว้เล็กน้อย (เนื่องจากในกรณีการใช้งานทั่วไปมันไม่ควรสร้างปัญหาใด ๆ )

  • คุณอาจต้องการอ่านข้อมูลก่อนที่จะเขียนบล็อกใหม่และเปรียบเทียบมันเพื่อให้แน่ใจว่ามันใช้งานได้จริง (และใช้บัฟเฟอร์ที่เคลียร์แล้วสำหรับการอ่านหากคุณหวาดระแวงมากพอ)


+1 สำหรับการเน้นความเป็นไปได้ของการแคชและความสำคัญของบล็อกการลบในสิ่งนี้ แต่ ...
goldilocks

"จุดเริ่มต้นของการทดสอบการ์ดอาจจะลำเอียง"โปรดจำไว้ว่า leveling สวม (ซึ่งจะต้องอยู่ในการเล่น - ฉันได้เกินจำนวนที่เหมาะสมใด ๆ ของการเขียนวงจรที่จุดนี้) - นี้เป็นเพียงเห็นได้ชัดบล็อกแรก นั่นคือบล็อกเสมือนแรกไม่ใช่บล็อกฟิสิคัลแรก
goldilocks

"fdatasync () ไม่ได้รับประกันว่าข้อมูลที่ถูกเขียนลงในสื่อทางกายภาพ" IMO อุปกรณ์รายงานว่าการถ่ายโอนเสร็จสมบูรณ์บ่งบอกว่าการเขียนจะต้องเกิดขึ้นหากอุปกรณ์ผ่านการทดสอบการอ่าน - เขียน (ยังไม่ได้ ยังไม่ได้หนึ่ง) การแคชอาจซับซ้อนกว่านี้ แต่ถ้าเราใช้กลุ่มก้อนขนาดใหญ่พอสมควรเพื่อหลีกเลี่ยงปัญหานั้นมันเป็นไปไม่ได้ที่จะมี "การเขียนผิด" เมื่ออุปกรณ์รายงานความสำเร็จ มันจะไร้ประโยชน์หากทำเช่นนั้น
goldilocks

1
@ goldilocks ไม่อ่านข้อมูลกลับจากอุปกรณ์ไม่รับประกันอะไรเลย มีความเหมาะสมที่จะคาดหวังว่าข้อมูลจะอยู่ในสื่อที่มีอยู่จริงและอาจเป็นได้ในกรณีส่วนใหญ่ แต่ไม่ได้รับประกันว่าอย่างน้อยที่สุดเว้นแต่คุณจะมีขนาดแคชเกินกว่าที่กำหนด
เตอร์

1
@ goldilocks peterph แสดงถึงสิ่งอื่นที่ฉันต้องการชี้ให้เห็น; readในการทดสอบของคุณไม่จำเป็นจะเพิ่มไม่มีข้อมูลและไม่เกี่ยวข้องกับการทดสอบเขียนวงจร สำหรับการทดสอบที่แท้จริงคุณจะต้องการอ่านบล็อกที่คุณเพิ่งเขียนและตรวจสอบความถูกต้องเว้นแต่คุณจะทราบอย่างแน่นอนว่าคอนโทรลเลอร์สามารถตรวจจับและรายงานโหมดความล้มเหลวทั้งหมดกลับคืน
Jason C

2

คำตอบของ Peterph ทำให้ฉันพิจารณาประเด็นของการแคชที่เป็นไปได้ต่อไป หลังจากขุดไปรอบ ๆ ฉันก็ยังไม่สามารถบอกได้อย่างแน่นอนว่าการ์ด SD บางอันหรือทั้งหมดทำเช่นนี้ แต่ฉันคิดว่ามันเป็นไปได้

อย่างไรก็ตามฉันไม่เชื่อว่าการแคชจะเกี่ยวข้องกับข้อมูลที่มีขนาดใหญ่กว่าบล็อกการลบ เพื่อให้แน่ใจว่าจริงฉันทดสอบซ้ำโดยใช้ 16 MB อันแทน 64 kB นี่คือ 1 / 250th ปริมาณรวมของการ์ด 4 GB ใช้เวลาประมาณ 8 ชั่วโมงในการทำ 10,000 ครั้ง หากการปรับระดับการสวมใส่ทำได้ดีที่สุดในการกระจายโหลดไปรอบ ๆ นั่นหมายความว่าบล็อกทางกายภาพทุกอันจะถูกใช้งาน 40 ครั้ง

นั่นไม่มากนัก แต่จุดเริ่มต้นของการทดสอบคือการแสดงให้เห็นถึงประสิทธิภาพของการปรับระดับการสึกหรอโดยแสดงให้เห็นว่าฉันไม่สามารถทำลายการ์ดได้อย่างง่ายดายผ่านการเขียนซ้ำ ๆ ของข้อมูลจำนวนเล็กน้อยไปยังตำแหน่งเดียวกัน (ชัดเจน) IMO การทดสอบ 64 kB ก่อนหน้าอาจเป็นจริง - แต่ต้องมีขนาด 16 MB ระบบล้างข้อมูลไปยังฮาร์ดแวร์และฮาร์ดแวร์ได้รายงานการเขียนโดยไม่มีข้อผิดพลาด ถ้านี่เป็นการหลอกลวงการ์ดจะไม่ดีสำหรับอะไรและมันไม่สามารถแคชได้ 16 MB ที่ใดก็ได้ แต่ในที่เก็บข้อมูลหลักซึ่งเป็นสิ่งที่การทดสอบนั้นตั้งใจจะเน้น

หวังว่า 10,000 เขียนจาก 16 MB แต่ละก็เพียงพอที่จะแสดงให้เห็นว่าแม้ในบัตรชื่อแบรนด์ล่างสุด (มูลค่า: $ 5 CDN), เรียกใช้ระบบไฟล์รูต rw 24/7 ที่เขียนข้อมูลจำนวนเล็กน้อยทุกวันจะไม่ใส่การ์ดใน ระยะเวลาที่เหมาะสม 10,000 วันคือ 27 ปี ... และการ์ดยังคงดีอยู่ ...

ถ้าฉันได้รับเงินเพื่อพัฒนาระบบที่ทำงานหนักกว่านั้นฉันก็อยากจะทำการทดสอบอย่างน้อยสองสามครั้งเพื่อกำหนดว่าการ์ดจะมีอายุการใช้งานนานเท่าใด ลางสังหรณ์ของฉันคือเมื่อมีสิ่งนี้สิ่งนี้ซึ่งมีความเร็วในการเขียนต่ำอาจใช้เวลาหลายสัปดาห์หลายเดือนหรือหลายปีในการเขียนต่อเนื่องด้วยความเร็วสูงสุด (ความจริงแล้วไม่มีการทดสอบเปรียบเทียบแบบออนไลน์ประเภทนี้พูดถึง ความจริงที่ว่ามันจะเป็นเรื่องยาวมาก)

เกี่ยวกับการยืนยันว่าการ์ดยังคงโอเคฉันไม่คิดว่าการใช้badblocksในการกำหนดค่าเริ่มต้นจะเหมาะสม ฉันทำอย่างนี้แทน:

badblocks -v -w -b 524288 -c 8

ซึ่งหมายถึงการทดสอบโดยใช้บล็อก 512 kB ซ้ำ ๆ 8 ครั้ง (= 4 MB) เนื่องจากนี่คือการทดสอบ rw แบบทำลายล้างมันอาจจะเป็นสิ่งที่ดีอย่างหนึ่งในโปรแกรมที่ใช้ในการเน้นอุปกรณ์หากใช้ในลูปต่อเนื่อง

ฉันยังได้สร้างระบบไฟล์บนมันคัดลอกในไฟล์ 2 GB diffเป็นไฟล์กับต้นฉบับแล้ว - เนื่องจากไฟล์เป็น. iso - ติดตั้งมันเป็นภาพและเรียกดูระบบไฟล์ภายในนั้น

การ์ดยังคงดีอยู่ ซึ่งน่าจะเป็นที่คาดหวังหลังจากทั้งหมด ...

;);)


ฉันไม่คิดว่าคณิตศาสตร์ของคุณถูกต้อง การ์ด Class 2 รองรับปริมาณงาน 2MB / s ซึ่งหมายความว่าคุณจะใส่ 20TB ในเวลาประมาณ 4 เดือน แน่นอนว่าคุณพูดถึงว่าคุณมีการ์ดที่ไม่ได้จัดประเภท แต่คุณดูเหมือนจะเป็นคำสั่งที่สำคัญ (เหมือน terdon ชี้ให้เห็นในunix.stackexchange.com/questions/84902/ ) มิฉะนั้นฉันเห็นด้วยอย่างเต็มที่กับ SLM
เตอร์

ฉันเชื่อว่าเราสามารถมั่นใจได้อย่างสมเหตุสมผลว่าการแคชมีน้อยที่สุดหากมีผลกระทบหลังจากการซิงค์สำหรับสื่อที่ออกแบบมาเพื่อลบบ่อยและยังใช้งานบัส พิจารณาว่าอุปกรณ์เหล่านี้ได้รับการออกแบบให้ "ปลด" และนำออกได้อย่างน่าเชื่อถือและการซิงค์เป็นสิ่งสุดท้ายที่แน่นอนที่ระบบปฏิบัติการสามารถทำได้กับอุปกรณ์อื่น ๆ นอกเหนือจากการตัดพลังงาน (ถ้าเป็นไปได้) มีเหตุผลที่จะสมมติว่าเช่นไดรฟ์ USB หรือการ์ด SD เป็นข้อมูลที่เขียนทางร่างกายหลังจากการซิงค์หรืออย่างน้อยก็มีความมุ่งมั่นที่จะทำให้การเขียนในระยะเวลาสั้น ๆ หลังจากปิดเครื่อง
Jason C

นอกจากนี้ btw badblocksจะไม่แสดงหน้าที่คุณล้มเหลวในหน่วยความจำแฟลช มันไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานนี้และคุณไม่สามารถใช้มันเพื่อค้นหาหน้าที่ล้มเหลวในแฟลช เมื่อคอนโทรลเลอร์ตรวจพบความล้มเหลวมันจะทำเครื่องหมายหน้าภายในว่าไม่ดีและทำการแมปไปยังหน้าในพื้นที่ที่สงวนไว้ ทั้งหมดนี้เกิดขึ้นหลังคอนโทรลเลอร์และไม่ปรากฏให้คุณเห็นแม้กระทั่งในการถ่ายโอนข้อมูลอุปกรณ์ดิบก็ตาม คุณสามารถรับข้อมูลบางอย่างจากคอนโทรลเลอร์หากรองรับ SMART ลำดับฟิสิคัลของข้อมูลบนอุปกรณ์ไม่ตรงกับลำดับของไบต์ที่คุณเห็นเมื่อทำการ IO บนอุปกรณ์
Jason C

อีกหนึ่งความเห็นเพิ่มเติมเกี่ยวกับ FYI: ใน SanDisk 8GB MicroSD เกรดผู้บริโภคหน่วยการจัดสรร (เช่นขนาดหน้า) เป็น 4MB ตามที่ผู้ควบคุมรายงาน หมายความว่า 16MB ในการ์ดนั้นคือ 4 หน้า (5 หากไม่ได้จัดแนว) คุณสามารถเพิ่มความเร็วในการทดสอบโดยการเขียน 512 ไบต์ที่ออฟเซ็ต 4MB จากกันแทนที่จะป้อน 16MB ไปยังการ์ด คุณไม่ได้แยกความแตกต่างระหว่างไบต์และจำนวนหน้า แต่ควรเป็น - ในตัวอย่างของคุณหากอยู่บนการ์ด SanDisk 8GB "16MB" จะสวมแบบเดียวกันกับการ์ดเป็น "2KB" มันมีความเข้าใจผิดสูงในการอ้างถึงไบต์แทนหน้า
Jason C

หลังจาก ~ 8.1mil iterations (มากกว่า 8 ชั่วโมง) ในโปรแกรมทดสอบที่ฉันเขียนไว้ด้านบนตามด้วยรอบการใช้พลังงานสำหรับ SanDisk 8GB MicroSD ใหม่ล่าสุดความเร็วในการเขียนจะถูก จำกัด อย่างถาวรประมาณ 450kB / วินาทีและddไม่สามารถเขียนที่ผ่านมาประมาณ 250MB เครื่องหมาย. ในddความพยายามครั้งที่สามมันทำให้มันผ่านมา 250MB และเมื่อมันได้แล้วเขียนประสิทธิภาพเพิ่มขึ้นในพื้นที่เหล่านั้น ฉันจะไม่บอกว่าการ์ดถูกทำลาย แต่ก็ไม่ได้อยู่ที่ 100% อย่างแน่นอน
Jason C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.