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