Tại sao hiệu suất ghi ngẫu nhiên của thẻ SD cho kích thước bản ghi 8-128 kB giảm xuống dưới hiệu suất của bản ghi kích thước 4 kB?


15

Khi tôi kiểm tra hiệu suất của thẻ SD để ghi ngẫu nhiên, tôi có thể thấy hiệu suất khá tệ đối với kích thước bản ghi 4 kB (điều này không đáng ngạc nhiên) nhưng sau đó đối với một số thẻ, nó thậm chí còn giảm cho kích thước bản ghi lớn hơn trước khi tăng. Tôi đã đo hiệu suất ghi ngẫu nhiên với iozone v3.430 và đã thử nghiệm một số thẻ flash của các nhà sản xuất khác nhau. Đây là lệnh iozone, tôi đã sử dụng để đo với kích thước tệp 50 MB:

iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile

Đây là kết quả với kích thước tệp 50 MB:

Hiệu suất giảm của thẻ SD khi ghi ngẫu nhiên khi được thử nghiệm với iozone và kích thước tệp 50 MB

Câu hỏi: Lý do nào khiến hiệu suất ghi ngẫu nhiên với kích thước bản ghi 8, 16, 32, 64 và 128 kB chậm hơn như với kích thước bản ghi 4 kB?

Peter Brittain đề nghị thử nghiệm với kích thước tệp lớn hơn, vì vậy tôi cũng đã thử nó với kích thước tệp 500 MB. Đây là kết quả:

Hiệu suất giảm của thẻ SD khi ghi ngẫu nhiên khi được thử nghiệm với iozone và kích thước tệp 500 MB

Hiệu suất tổng thể trở nên tồi tệ hơn nhưng hiện tượng vẫn xảy ra.

Các phân vùng được căn chỉnh theo ranh giới 4 MB. Hệ thống tệp là ext4 với kích thước khối 4 kB. Phân vùng được sử dụng cho các thử nghiệm bắt đầu là mmcblk0p2.

$ lsblk 
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0 953.7M  0 loop /mnt/sdb1
mmcblk0     179:0    0  14.9G  0 disk 
├─mmcblk0p1 179:1    0    56M  0 part /boot
├─mmcblk0p2 179:2    0   7.8G  0 part /
└─mmcblk0p3 179:3    0     7G  0 part /mnt/mmcblk0p3

$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

$ sudo fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    16506879     8192000   83  Linux
/dev/mmcblk0p3        16506880    31115263     7304192   83  Linux

$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)

# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count:              2048000
Block size:               4096
Blocks per group:         32768

Cập nhật 1: Rõ ràng là hiệu suất cho ghi ngẫu nhiên đặc biệt là đối với kích thước bản ghi nhỏ thấp hơn đáng kể so với ghi tuần tự. Các ô nhớ của bộ lưu trữ flash NAND được nhóm thành các trang và được gọi là các khối xóa. Kích thước trang thông thường là 4, 8 hoặc 16 kB. Mặc dù bộ điều khiển có thể ghi các trang đơn lẻ, dữ liệu không thể được ghi đè mà không bị xóa trước và khối xóa là đơn vị nhỏ nhất mà bộ lưu trữ flash NAND có thể xóa. Kích thước khối xóa thường nằm trong khoảng từ 128 kB đến 2 MB. Trong thẻ SD hiện đại, một số lượng nhỏ các khối xóa được kết hợp thành các đơn vị lớn hơn có kích thước bằng nhau được gọi là nhóm phân bổ hoặc đơn vị phân bổ hoặc phân khúc. Kích thước phân khúc thông thường là 4 MB.Mỗi thao tác ghi trên bộ lưu trữ dẫn đến hoạt động đọc-sửa-ghi cho toàn bộ phân đoạn. Ví dụ: trên thẻ SD có kích thước phân đoạn 4 MB, việc ghi 4 kB dữ liệu vào các vị trí ngẫu nhiên dẫn đến hệ số khuếch đại ghi là 1024. Bộ điều khiển của thẻ SD thực hiện lớp dịch. Đối với bất kỳ thao tác I / O nào, việc dịch từ địa chỉ ảo sang địa chỉ vật lý được thực hiện bởi bộ điều khiển. Nếu dữ liệu bên trong một phân đoạn sẽ bị ghi đè, lớp dịch sẽ ánh xạ lại địa chỉ ảo của phân đoạn đó sang một địa chỉ vật lý bị xóa khác. Phân khúc vật lý cũ được đánh dấu bẩn và xếp hàng để xóa. Sau đó, khi nó bị xóa, nó có thể được sử dụng lại. Bộ điều khiển của thẻ SD thường lưu trữ một hoặc nhiều phân đoạn để tăng hiệu suất của các hoạt động ghi ngẫu nhiên.Nếu thẻ SD lưu trữ hệ thống tệp gốc, sẽ có lợi nếu bộ điều khiển của thẻ có thể lưu trữ (các) phân đoạn nơi diễn ra hoạt động ghi, các phân đoạn lưu trữ siêu dữ liệu cho hệ thống tệp và (nếu có sẵn) tạp chí của hệ thống tập tin. Do đó, hiệu suất ghi ngẫu nhiên của thẻ SD phụ thuộc vào kích thước khối xóa, kích thước phân đoạn và số lượng phân đoạn, bộ điều khiển lưu trữ. Nhưng tất cả điều này không giải thích tại sao hiệu suất ghi ngẫu nhiên với kích thước bản ghi 8, 16, 32, 64 và 128 kB chậm hơn như với kích thước bản ghi 4 kB.

Cập nhật 2 (trả lời cho myaut): Ảnh chụp màn hình của bảng là công việc của riêng tôi. Hiện tại, tôi viết một bài báo / bài báo về các cụm máy tính bảng đơn vì chúng là một lựa chọn thú vị để cung cấp tài nguyên cho các dự án và nhà nghiên cứu của sinh viên. Trong bối cảnh này, tôi cũng đã nghiên cứu hiệu suất của CPU, lưu trữ và giao diện mạng của một nút. Tôi đã mua tất cả các thẻ SD đã thử nghiệm. Trên một trong những thẻ tôi đã cài đặt (sao chép qua dd) Raspian Wheezy (phiên bản 2014-06-20). Sau khi tôi định cấu hình cài đặt mạng và cài đặt một số gói bổ sung (ví dụ: iozone), tôi đã sao chép toàn bộ thẻ SD sang tất cả các thẻ SD khác.

Cập nhật 3 (câu trả lời cho Gabriel Southern): Kết quả là từ các lần chạy duy nhất. Thủ tục là:

  1. Chèn thẻ vào Raspberry Pi Model B
  2. Khởi động hệ thống
  3. Đăng nhập qua SSH
  4. Bắt đầu chạy thử iozone
  5. Dừng hệ thống và thử với một thẻ SD khác

Một số thẻ tôi đã thử nhiều lần để kiểm tra lại. Chỉ có một chút thay đổi. Hiện tượng xảy ra mọi lúc trừ hai thẻ Samsung và một thẻ Verbatim.

Cập nhật 4: Hiện tại tôi cố gắng tìm một liên hệ với một công ty sản xuất bộ điều khiển flash NAND (Samsung, SanDisk, Toshiba ...) để hỏi câu trả lời chắc chắn. SanDisk có một diễn đàn. Tôi hỏi ở đó để giải thích. Tôi cũng đã gửi một yêu cầu đến bộ phận hỗ trợ kỹ thuật của Kingston.

Cập nhật 5: Kích thước khối xóa và kích thước đơn vị phân bổ (phân khúc) không chịu trách nhiệm cho hiện tượng này. Tôi đã kiểm tra kích thước khối xóa của tất cả các thẻ SD bằng nắm đấm công cụ pritcsd.py trong đầu đọc thẻ bên trong của máy tính xách tay ThinkPad X240 và cuối cùng với Raspberry Pi Model B. Đối với tất cả các thẻ, đầu ra là : Erase block size of mmcblk0 is 65536 bytes. Ngoài ra kích thước phân khúc là bằng nhau cho tất cả các thẻ SD được thử nghiệm. Nó là 4 MB. Thông tin này có thể được tìm thấy trong các tập tin /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size . Theo tôi, điều khá bất thường là tất cả các thẻ này đều có cùng kích thước khối xóa và kích thước phân khúc. Trong thời gian chờ đợi, tôi đã thu thập ID sản phẩm / số vật phẩm từ các gói của thẻ đã kiểm tra. Họ đây rồi.

ID sản phẩm / số vật phẩm từ bao bì của thẻ đã kiểm tra

Cập nhật 6: Hỗ trợ kỹ thuật của Kingston đã viết cho tôi rằng bộ điều khiển của các thẻ Kingston đã được thử nghiệm (và rất có thể là các thẻ khác) được tối ưu hóa cho các tệp có kích thước 4 kB. Việc thực hiện bộ điều khiển chính xác là bí mật. Câu trả lời từ Kingston là câu trả lời hay nhất mà tôi có. SanDisk không bao giờ trả lời yêu cầu hỗ trợ của tôi và tôi không thể tìm thấy liên hệ từ Sony, Samsung hoặc Verbatim


1
Đây là một câu hỏi thú vị. Là kết quả bạn báo cáo trung bình qua nhiều lần chạy, hoặc chỉ từ một lần chạy? Tôi tò mò muốn biết có bao nhiêu biến thể trong kết quả.

1
Kết quả của việc ánh xạ lại logic và cân bằng hao mòn, yêu cầu này trong câu hỏi "Ví dụ trên thẻ SD có kích thước phân đoạn 4 MB, ghi 4 kB dữ liệu vào các vị trí ngẫu nhiên dẫn đến hệ số khuếch đại ghi là 1024". là sai.
Ben Voigt

1
Trong thử nghiệm hiệu suất trải nghiệm của tôi, bạn đạt được tất cả các loại tối ưu hóa và bộ nhớ cache ở các thử nghiệm quy mô nhỏ hơn. Đặc biệt, tôi có thể tin rằng các nhà sản xuất có đèn flash chậm hơn sẽ cần những tối ưu hóa này để xử lý cập nhật hệ thống tệp một cách hiệu quả, nhưng không thể chứng minh điều đó do thiếu tài liệu công khai cho tất cả các bộ điều khiển. Điều đó nói rằng, tôi nhận thấy bạn chỉ sử dụng một tệp 50 MB. Bạn đã thử các tệp lớn hơn nhiều (theo "quy tắc chạy" trong iozone.org/docs/IOzone_msword_98.pdf ) để thử chống lại điều này?

1
Giả định rằng bạn không tìm thấy sự khác biệt, tôi đã xem xét bất kỳ dữ liệu nào khác về vấn đề này. Có vẻ như Linaro org đã thực hiện một số nghiên cứu tương tự . Đặc biệt, bộ đệm SLC cực lớn có thể giải thích kết quả rất nhanh của bạn. Và tối ưu hóa FAT32 sẽ được nhắm mục tiêu cụ thể vào các bài viết nhỏ.

1
Vâng - đã phát hiện ra vấn đề đó trong trang ... Tôi nghĩ rằng bạn có thể đang thiếu một cái gì đó với FAT32, mặc dù: các thẻ được tối ưu hóa "cho các mẫu truy cập được quan sát trên FAT32" chứ không chỉ cho FAT32. Một mẫu truy cập thông thường trên FAT sẽ là ghi một tệp mới - yêu cầu dữ liệu tệp được truyền phát cộng với bản cập nhật FAT. Bản cập nhật FAT thường sẽ bao gồm một số lượng nhỏ các khối. Nếu tôi đang viết FTL, do đó tôi sẽ lên kế hoạch tối ưu hóa bất kỳ ghi nào nhỏ hơn kích thước trang của tôi để giúp hiệu suất của FAT.

Câu trả lời:


4

Cấu trúc tế bào thẻ SD:

Trong điện tử trạng thái rắn, một ô là thành phần bộ nhớ có khả năng lưu trữ một hoặc nhiều bit thông tin, số bit trên mỗi ô phụ thuộc vào công nghệ được sử dụng. (SLC / MLC / TLC)

Các nhà sản xuất sử dụng công nghệ khác nhau trong bộ nhớ flash để quản lý cấu trúc của nó, cấu trúc được sử dụng nhiều nhất là TLC và MLC do chi phí rẻ hơn liên quan đến các công nghệ đó đặc biệt là TLC.

Thông tin kỹ thuật này khó có được đối với Thẻ SD và thẻ nhớ USB, các nhà sản xuất đã quyết định như vậy, liên quan đến công nghệ flash khác, vì SSD nơi thông tin này hầu như luôn được cung cấp.

Điều này có tác động trực tiếp đến tuổi thọ phần cứng mà còn cả tốc độ.

SLC, Ô đơn cấp (1 bit)

Generally 100000 write erase cycles
Erase time: 1-2.5ms

MLC, Ô đa cấp (2 bit trở lên)

Anywhere from 3000 to 15000 write erase cycles
Erase time: 2.5-3.5ms

TLC, Ô cấp ba (3 bit)

Anywhere from 1000 to 5000 write/erase cycles
Erase time: 4-5ms

Ghi chú :

Vì các ô có thể chứa 1, 2 hoặc 3 bit trong một số trường hợp, chip điều khiển thẻ sd của bạn sẽ cần thực hiện nhiều chu kỳ truy cập hơn tùy thuộc vào kích thước bản ghi và dung lượng của ô.

Thẻ Samsung của bạn có thể đang sử dụng công nghệ SLC hoặc chúng có chip điều khiển mạnh mẽ.

Lưu ý 2 :

Tôi đã thử một số thử nghiệm như bạn làm với các phân vùng ext4 kích thước khối 4 kb1 kb nhưng không có sự khác biệt lớn


Thẻ Samsung và thẻ Verbatim là sản phẩm tiêu dùng và trong những năm qua, bộ nhớ SLC không phổ biến trong các thiết bị như vậy. Các thẻ Samsung là MB-MP16DMB-MS16D và thẻ nguyên văn ist bài viết số 44007 .
Neverland

Có thể các thông số kỹ thuật của một số bộ điều khiển có sẵn. Tôi có thể mở thẻ SD và kiểm tra xem những thẻ này chứa bộ điều khiển nào, nhưng tôi không thể mở thẻ microSD. Có bất kỳ cơ hội nào để đọc id / số sản phẩm của bộ điều khiển thẻ SD thông qua phần mềm không?
Neverland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.