Dlaczego wydajność losowego zapisu na karcie SD dla rekordu o wielkości 8-128 kB spada poniżej wydajności rekordu o wielkości 4 kB?

15

Kiedy sprawdzam wydajność kart SD do zapisu losowego, widzę, że wydajność jest dość zła dla rekordu o wielkości 4 kB (nie jest to zaskakujące), ale potem dla kilku kart spada nawet dla większych rozmiarów rekordów, zanim wzrośnie. Zmierzyłem wydajność losowego zapisu w iozone v3.430 i przetestowałem kilka kart flash różnych producentów. To jest polecenie iozone, którego mierzyłem przy rozmiarze pliku 50 MB:

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

Oto wyniki o rozmiarze pliku 50 MB:

Spadek wydajności kart SD do losowego zapisu podczas testowania z iozone i wielkości pliku 50 MB

Pytanie: Z jakiego powodu wydajność zapisu losowego przy rekordach o wielkości 8, 16, 32, 64 i 128 kB jest mniejsza niż w przypadku rekordów o wielkości 4 kB?

Peter Brittain zaproponował przetestowanie pliku o większym rozmiarze, więc wypróbowałem go również przy rozmiarze pliku 500 MB. Oto wyniki:

Spadek wydajności kart SD do losowego zapisu podczas testowania z iozone i wielkości pliku 500 MB

Ogólna wydajność pogorszyła się, ale zjawisko nadal występuje.

Partycje są wyrównane do granic 4 MB. System plików to ext4 o wielkości bloku 4 kB. Partycja używana do rozpoczęcia testów to 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

Aktualizacja 1: Oczywiste jest, że wydajność zapisu losowego, szczególnie w przypadku małych rozmiarów rekordów, jest znacznie niższa w porównaniu do zapisu sekwencyjnego. Komórki pamięci NAND flash są pogrupowane na strony i tak zwane bloki kasowania. Typowe rozmiary stron to 4, 8 lub 16 kB. Chociaż sterownik może zapisywać pojedyncze strony, danych nie można nadpisać bez uprzedniego usunięcia, a blok wymazywania jest najmniejszą jednostką, którą może wymazać pamięć flash NAND. Rozmiar bloku kasowania wynosi zwykle między 128 kB a 2 MB. We współczesnych kartach SD niewielka liczba bloków wymazywania jest łączona w większe jednostki o równej wielkości, które są nazywane grupami alokacji lub jednostkami alokacji lub segmentami. Zwykle rozmiar segmentu wynosi 4 MB.Każda operacja zapisu w pamięci powoduje operację odczytu-modyfikacji-zapisu dla całego segmentu. Na przykład na karcie SD o wielkości segmentu 4 MB zapisanie 4 kB danych w losowych lokalizacjach skutkuje współczynnikiem wzmocnienia zapisu wynoszącym 1024. Kontrolery kart SD implementują warstwę translacyjną. Dla każdej operacji we / wy kontroler dokonuje translacji z adresu wirtualnego na fizyczny. Jeśli dane w segmencie zostaną zastąpione, warstwa translacji ponownie mapuje adres wirtualny segmentu na inny skasowany adres fizyczny. Stary segment fizyczny jest oznaczony jako brudny i umieszczony w kolejce do usunięcia. Później, po skasowaniu, można go ponownie użyć. Kontrolery kart SD zwykle buforują jeden lub więcej segmentów w celu zwiększenia wydajności operacji zapisu losowego.Jeśli karty SD przechowują główny system plików, korzystne jest, jeśli kontroler karty może buforować segmenty, w których ma miejsce operacja zapisu, segmenty, które przechowują metadane dla systemu plików i (jeśli dostępne) dziennik systemu plików. W konsekwencji wydajność losowego zapisu na karcie SD zależy od wielkości bloku kasowania, wielkości segmentu i liczby segmentów, które buforuje kontroler. Ale to wszystko nie wyjaśnia, dlaczego wydajność zapisu losowego przy rekordach o wielkości 8, 16, 32, 64 i 128 kB jest wolniejsza niż w przypadku rekordów o wielkości 4 kB.

Aktualizacja 2 (odpowiedź na myaut): Zrzut ekranu tabeli to moja własna praca. Obecnie piszę artykuł / artykuł o klastrach komputerów jednopłytkowych, ponieważ są one interesującą opcją dostarczania zasobów do projektów studenckich i badaczy. W tym kontekście zbadałem również wydajność procesora, pamięci i interfejsu sieciowego pojedynczego węzła. Kupiłem wszystkie przetestowane karty SD. Na jednej z kart zainstalowałem (skopiowałem przez dd) Raspian Wheezy (wersja 2014-06-20). Po skonfigurowaniu ustawień sieciowych i zainstalowaniu dodatkowych pakietów (np. Iozone) skopiowałem całą kartę SD na wszystkie inne karty SD.

Aktualizacja 3 (odpowiedź Gabriel Southern): Wyniki pochodzą z pojedynczych serii. Procedura była:

  1. Włóż kartę do Raspberry Pi Model B
  2. Uruchom system
  3. Zaloguj się przez SSH
  4. Rozpocznij uruchomienie testowe iozone
  5. Zatrzymaj system i spróbuj użyć innej karty SD

Niektóre karty próbowałem kilka razy, aby sprawdzić dwukrotnie. Różnica była niewielka. Zjawisko to występuje cały czas, z wyjątkiem dwóch kart Samsung i jednej karty Verbatim.

Aktualizacja 4: W tej chwili próbuję znaleźć kontakt z firmą, która produkuje Clontrollery flash NAND (Samsung, SanDisk, Toshiba ...), aby poprosić tam o konkretną odpowiedź. SanDisk ma forum. I poprosił tam o wyjaśnienia. Wysłałem również zapytanie do działu pomocy technicznej Kingston.

Aktualizacja 5: Rozmiar bloku kasowania i rozmiar jednostki alokacji (segmentu) nie są odpowiedzialne za to zjawisko. Testowałem rozmiar bloku skasowaniem wszystkich kart SD z pritcsd.py narzędziowej pięścią w czytniku wewnętrznym notebooku ThinkPad X240 i wreszcie z Raspberry Pi modelu B. Do wszystkich kart wyjście jest: Erase block size of mmcblk0 is 65536 bytes. Również rozmiar segmentu jest taki sam dla wszystkich testowanych kart SD. Ma 4 MB. Informacje te można znaleźć w pliku /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size . Moim zdaniem jest dość niezwykłe, że wszystkie te karty mają taki sam rozmiar bloku kasowania i rozmiar segmentu. W międzyczasie zebrałem identyfikatory / numery artykułów z opakowań testowanych kart. Tutaj są.

Identyfikatory produktu / numery artykułów z opakowań testowanych kart

Aktualizacja 6: Wsparcie techniczne firmy Kingston napisało, że kontrolery testowanych kart Kingston (i najprawdopodobniej innych kart) są zoptymalizowane dla plików o rozmiarze 4 kB. Dokładna implementacja kontrolera jest poufna. Odpowiedź od Kingstona jest najlepsza, jaką mam. Firma SanDisk nigdy nie odpowiedziała na moją prośbę o wsparcie i nie mogłem znaleźć kontaktu od Sony, Samsung lub Verbatim

Nibylandia
źródło
1
To interesujące pytanie. Czy zgłoszone wyniki są średnie dla wielu przebiegów, czy tylko z jednego przebiegu? Byłbym ciekawy, jak duża jest różnica w wynikach.
1
W wyniku logicznego ponownego mapowania i wyrównywania zużycia, twierdzenie to w pytaniu „Na przykład na karcie SD o wielkości segmentu 4 MB zapisanie 4 kB danych w losowych lokalizacjach skutkuje współczynnikiem wzmocnienia zapisu 1024”. to fałsz.
Ben Voigt,
1
Z mojego doświadczenia wynika, że ​​testowanie wydajności polega na uzyskiwaniu różnego rodzaju optymalizacji i pamięci podręcznych w testach na mniejszą skalę. W szczególności mogłem uwierzyć, że producenci z wolniejszym flashowaniem potrzebowaliby tych optymalizacji, aby skutecznie obsługiwać aktualizacje systemu plików, ale nie mogą tego udowodnić z powodu braku publicznej dokumentacji dla wszystkich kontrolerów. To powiedziawszy, zauważam, że używasz tylko pliku 50 MB. Czy próbowałeś o wiele większych plików (zgodnie z „regułami uruchamiania” w iozone.org/docs/IOzone_msword_98.pdf ), aby spróbować temu zaradzić ?
1
Zakładając, że nie znajdziesz żadnej różnicy, szukałem innych danych na ten temat. Wygląda na to, że orgie Linaro przeprowadziły podobne badania . W szczególności bardzo duża pamięć podręczna SLC może wyjaśniać bardzo szybkie wyniki. A optymalizacje FAT32 byłyby skierowane w szczególności do małych zapisów.
1
Tak - zauważyłem już ten problem na stronie ... Myślę jednak, że możesz coś przegapić w FAT32: karty są zoptymalizowane „pod kątem wzorców dostępu, które są obserwowane w FAT32”, a nie tylko w FAT32. Typowym wzorcem dostępu w FAT będzie zapisanie nowego pliku - który wymaga przesłania danych pliku oraz aktualizacji FAT. Aktualizacja FAT zwykle obejmuje niewielką liczbę bloków. Gdybym pisał FTL, planowałbym więc zoptymalizować zapisy mniejsze niż rozmiar mojej strony, aby zwiększyć wydajność FAT.

Odpowiedzi:

4

Struktura komórek kart SD:

W elektronice półprzewodnikowej komórka jest elementem pamięci zdolnym do przechowywania jednego lub wielu bitów informacji, liczba bitów na komórkę zależy od zastosowanej technologii. (SLC / MLC / TLC)

Producenci używają różnych technologii w pamięci flash do zarządzania jej strukturą, najczęściej używaną strukturą są TLC i MLC ze względu na niższy koszt związany z tymi technologiami, zwłaszcza TLC.

Producenci nie zdecydowali się na takie informacje techniczne na temat kart SD i pamięci USB w odniesieniu do innych technologii typu flash, takich jak dyski SSD, w których informacje te są prawie zawsze podawane.

Ma to bezpośredni wpływ na żywotność sprzętu, ale także na szybkość.

SLC, komórka jednopoziomowa (1 bit)

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

MLC, komórka wielopoziomowa (2 lub więcej bitów)

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

TLC, Triple Level Cell (3 bity)

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

Uwaga :

Ponieważ komórki mogą zawierać 1, 2 lub 3 bity, w niektórych przypadkach układ kontrolera karty SD będzie musiał wykonać więcej cykli dostępu w zależności od wielkości rekordu i pojemności komórki.

Twoje karty Samsung prawdopodobnie korzystają z technologii SLC lub mają potężny układ kontrolera.

Uwaga 2:

Próbowałem kilka testów, takich jak ty, z partycjami ext4 blok wielkości 4 kb i 1 kb, ale bez dużej różnicy

intika
źródło
Karty Samsung i Verbatim są produktami konsumenckimi, aw ostatnich latach pamięć SLC nie była powszechna w takich urządzeniach. Karty Samsung to MB-MP16D i MB-MS16D, a karta „verbatim” to numer artykułu 44007 .
Neverland
Być może specyfikacje niektórych kontrolerów są dostępne. Mogę otworzyć karty SD i sprawdzić, które kontrolery zawierają te karty, ale nie mogę otworzyć kart microSD. Czy jest szansa na odczytanie identyfikatora / numeru produktu kontrolerów kart SD za pomocą oprogramowania?
Neverland,