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:
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:
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:
- Włóż kartę do Raspberry Pi Model B
- Uruchom system
- Zaloguj się przez SSH
- Rozpocznij uruchomienie testowe iozone
- 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ą.
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
źródło
Odpowiedzi:
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)
MLC, komórka wielopoziomowa (2 lub więcej bitów)
TLC, Triple Level Cell (3 bity)
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
źródło