Dlaczego moja karta SD jest wolna?

23

Wydaje się, że moja karta SD działa wolno. Mam kartę ADATA 16 GB SDHC klasy 10. Sprawdziłem listę kompatybilności, która zawiera kartę o podobnych specyfikacjach i stwierdza, że ​​„działa”. Nawet proste zadania, takie jak uzyskanie listy katalogów w małym katalogu, mogą zająć kilka sekund przy pierwszym żądaniu. Czy są jakieś narzędzia, za pomocą których mogę zweryfikować, jaką wydajność uzyskuję na karcie SD? Czy mogę wprowadzić zmiany w konfiguracji, aby karta SD reagowała szybciej?

Używam Raspberry Pi jako bezgłowego seedboxa BitTorrenta , więc wszystko, na co się natknę, działa po prostu w wierszu poleceń. Korzystam z podziału 240/16, aby zapewnić maksymalną dostępną ilość pamięci.

Aktualizacje

Po przeprowadzeniu kilku testów, jak zalecił @Krzysztof Adamski z „dd”, otrzymałem dobre wyniki, uzyskując prędkość odczytu 20 MB / s i prędkość zapisu około 10 MB / s. Jednak nadal występują problemy z szybkością we / wy. Podczas testowania uruchomiłem polecenia „dd” w tle i pobiegłem do góry, aby zobaczyć, co się dzieje. Zauważyłem, że proces „mmcqd” zajmował sporo procesora, od 5% do 10%. Rozejrzałem się w Internecie i znalazłem wiele przypadków ludzi zgłaszających, że „mmcqd” zużywa sporo procesora. Następnie uruchomiłem następujące polecenie, aby przetestować czytanie i pisanie w tym samym czasie

sudo dd if=/dev/mmcblk0 of=test.dat bs=1M count=1024

Po uruchomieniu tego polecenia uzyskałem przepustowość tylko 977 kB / s, a „mmcqd” zgłosił użycie procesora między 10% a 25% co 5 do 10 sekund, po czym spadłoby do zera. Zrobiłem więc więcej testów. W tle uruchomiłem następujące dwa polecenia, a potem obserwowałem, co się dzieje na górze.

sudo dd if=/dev/mmcblk0 of=/dev/null bs=1M count=1024 &
sudo dd if=/dev/zero of=test.dat bs=1M count=1024 &

W tym przypadku „mmcqd” osiągnęłoby szczytowe zużycie około 35% procesora, ale przepustowość była o wiele lepsza przy około 7,5 MB / s do odczytu i około 5,3 MB / s do zapisu.

Wygląda na to, że występuje tutaj pewien problem, w którym ciężkie zapisy powodują, że „mmcqd” blokuje system. Powoduje to, że demon transmisji zwalnia prawie do zera, gdy tylko prędkość staje się zbyt wysoka w oczekiwaniu na kartę SD. Podczas uruchamiania demona transmisji widzę też, że użycie „mmcqd” staje się dość wysokie.

Kibbee
źródło
Czy jesteś pewien, że przyczyną problemu jest karta SD? Czy możesz najpierw spróbować użyć innej karty, aby wykluczyć inne części systemu?
Dawid Ferenczy Rogožan
Czy sprawdziłeś dziennik syslog i jądro pod kątem komunikatów związanych z urządzeniem mmc? Niektóre karty po prostu nie działają w Raspberry Pi. Niektóre inne wymagają drobnych poprawek, aby działały niezawodnie.
Joppe,
Przeniesiono
ray023
1
@ Ray023 Dzięki. Zaktualizowałem link. W przyszłości możesz po prostu edytować pytanie. Myślę, że ponieważ jesteś nowy, edycja nie zostanie od razu pobrana, ale zostanie zapisana do zatwierdzenia przez oryginalny plakat lub innego użytkownika z wysokim przedstawicielem.
Kibbee

Odpowiedzi:

21

Testowanie prędkości odczytu karty:

Istnieją dwa proste sposoby sprawdzenia prędkości odczytu (katalogowanie katalogu to tylko operacja odczytu):

  • za pomocą polecenia dd:

    sudo dd if=/dev/mmcblk0 of=/dev/null bs=8M count=100

    Spowoduje to odczytanie 800 MB danych z karty SD i odrzucenie tego do / dev / null. Jeśli zajmuje to dużo czasu, możesz zmienić count = 100, aby count = 10, aby odczytać tylko 80 MB. Po zakończeniu polecenia powinien wydrukować komunikat z prędkością odczytu. Powinieneś uzyskać co najmniej kilka MB / s.

  • za pomocą polecenia hdparm:

    sudo hdparm -t /dev/mmcblk0

    To powinno dać ci podobny wynik prędkości jak pierwsze polecenie i powinno również wynosić co najmniej kilka MB / s.

Testowanie prędkości zapisu na karcie:

Nie ma łatwego sposobu na przetestowanie prędkości zapisu, ponieważ aby to zrobić, trzeba zapisać dane na karcie. Jeśli chcesz to zrobić na niskim poziomie (z pominięciem systemu plików), musisz przesłonić niektóre dane na karcie i prawdopodobnie nie chcesz tego robić. Można to zrobić, jeśli masz partycję wymiany, ponieważ można ją łatwo dezaktywować (za pomocą swapoff -a), przetestować za pomocą dd (za dd if=/dev/zero of=/dev/{yourswappartitionnanehare} bs=8M count=25), a następnie odtworzyć (za pomocą mkswap /dev/{yourswappartitionnanehare}).

Jeśli nie masz partycji wymiany, możesz przetestować prędkość zapisu systemu plików również za pomocą polecenia dd:

dd if = / dev / zero of = / home / pi / testfile bs = 8M count = 25

Spowoduje to utworzenie 200 MB pliku /home/pi/testfile. Możesz użyć dowolnej innej nazwy pliku.

Uwagi:

  • Podczas testowania prędkości upewnij się, że żadne inne programy nie działają w twoim systemie (np. Aplikacja torrentowa itp.).
  • Po przetestowaniu możesz sprawdzić dane wyjściowe dmesgpolecenia, aby sprawdzić, czy są jakieś komunikaty dotyczące podsystemu mmc.
  • Upewnij się, że masz zainstalowane najnowsze oprogramowanie układowe. Od czasu do czasu pojawiają się łaty niezależnie od prędkości karty SD.
  • Możesz także sprawdzić niektóre starsze oprogramowanie sprzętowe, ponieważ mogą wystąpić pewne regresje. Najłatwiejszym (ale nie najlepszym) sposobem na to jest przetestowanie różnych obrazów systemu zbudowanych w różnych terminach. Trudniejszym sposobem jest użycie github i pobranie historycznych wersji plików oprogramowania układowego.
Krzysztof Adamski
źródło
Wyrazy uznania. Na MacBooku Air mam 1,4 MB / s podczas zapisywania pliku img na karcie SD klasy 6 4 GB. Test odczytu PI wykazał 20 MB / sekundę !?
ScrollerBlaster
Mam to samo. Moja prędkość odczytu wynosi około 500 MB / s. Coś nie tak?
Najciemniejszy N2O
12

Dla wydajności karty SD bardzo ważne jest, czy dostęp jest sekwencyjny (jak w przypadku dd) czy losowy w małych blokach. Wydaje się, że karty SD, szczególnie wysokiej klasy, są zoptymalizowane pod kątem sekwencyjnego dostępu, co jest dobre do przechowywania zdjęć lub filmów. Jednak do uruchomienia systemu operacyjnego karty SD losowy dostęp jest ważniejszy, ponieważ wiele małych plików jest odczytywanych i zapisywanych. Wydaje mi się, że bittorrent generuje również nieco losowy dostęp.

Te dwa wątki dyskusyjne zawierają wiele testów porównawczych i dyskusji na karcie SD. Ogólnie okazało się, że losowa prędkość zapisu ma decydujące znaczenie dla reakcji systemu operacyjnego na karcie. Szybkość ta jest często znacznie niższa niż prędkość zapisu sekwencyjnego, czyli prędkości, którą producenci lubią zgłaszać. Klasa kart SD oparta jest na sekwencyjnych prędkościach, a niższe klasy (4 lub 6) mogą w rzeczywistości być bardziej odpowiednie do malin.

IOzone narzędzie mierzy prędkość wielu różnych wzorów dostępu. I napisali krótkie instrukcje dla kompilacji IOzone na maliny tutaj .

Frepa
źródło
2
Ciekawa odpowiedź. Niezłe.
Jivings
bardzo interesujące, ponieważ właśnie kupiłem 4x klasy 10 ... cholera! :-(
BerggreenDK
@ BerggreenDK : Może w przyszłości dobrze wykorzystasz karty do innych celów, a może będziesz zadowolony, że kupiłeś karty klasy 10.
Neverland
1
Losowa prędkość zapisu nie powinna mieć większego wpływu na typowe zadania, takie jak sekwencja rozruchowa lub wyświetlanie katalogu. Nawet w przypadku torrentów wyniki testów z zapisem 4KB są nieistotne: typowe rozmiary porcji wynoszą około 1 MB i jeśli nie masz wolnej pamięci RAM, pamięć podręczna dysku zgrupuje je w jeszcze większe sekwencyjne zapisy.
Dmitrij Grigoryev,
0

Piszesz „bittorrent”, co powoduje moje zgadywanie / odpowiedź.

Protokół torrenta odbiera pakiety w losowej kolejności od losowych seederów.

Kiedy zaczniesz używać torrenta na dowolnym systemie plików, staje się on raczej fragmentaryczny. Spowoduje to pogorszenie wydajności na dużą skalę.

Z tego, co wiem o SDCARD, jej systemie FAT / FAT32 i jeszcze gorzej w przypadku obsługi fragmentacji.

Więc znajdź sposób na defragmentację karty SDCARD lub skopiuj wszystkie pliki, a następnie ponownie zainstaluj system operacyjny.

Wreszcie, napisanie LOT-a (jak będzie w przypadku silnika bittorrent) spowoduje oderwanie karty SDCARD szybciej niż normalne użycie. Nie twierdzę, że jest to niewłaściwe, w rzeczywistości sam uważałem się za podobnego. Ale to może być powód twojego problemu.

Chciałbym, aby istniał klient torrent, który automatycznie przesyła / przenosi pobrane pliki do zupełnie innego miejsca docelowego po zakończeniu pobierania + „zarezerwowany czas przesyłania”.

Wtedy defragmentacja przebiegałaby znacznie szybciej.

BerggreenDK
źródło
Jak fragmentacja dotyczy kart SD? Myślałem, że fragmentacja stanowi problem tylko w przypadku wirujących dysków, ponieważ plik będzie umieszczony w niesekwencyjnych sektorach, co spowoduje, że głowica odczytu / zapisu będzie musiała przesuwać się po całym miejscu, aby uzyskać dostęp do pliku. W przypadku pamięci półprzewodnikowej, takiej jak karty SD, nie stanowi to problemu. Zgadzam się jednak z tobą co do liczby operacji zapisu spowodowanych przez bittorrent. Myślę, że ma to wiele wspólnego z problemem. Połącz to z niewielką ilością pamięci na RPi (moja ma 256 MB) i wydaje się, że jest to przepis na wolny dostęp do dysku. Również karty SD są ogólnie wolne.
Kibbee
Cóż, struktura FAT / FAT32 jest zła i powolna, gdy zaczniesz mieć wiele fragmentów plików. A mała Malina nie ma zbyt dużej mocy, aby się z nią poruszać. Więc wszystko, co stanie mu na drodze, spowalnia. Ale znowu, to tylko moje przypuszczenie. Nie mam na ten temat żadnych faktów.
BerggreenDK
1
RPi nawet nie używa FAT / FAT32. System plików to EXT4.
Kibbee
3
Odpowiedź ma tę zaletę, że bittorrent prawdopodobnie zapisuje dane do plików w małych kawałkach w losowej kolejności. Ten rodzaj losowego zapisu jest bardzo nieefektywny na kartach SD. Ale nie sądzę, by defragmentacja pomogła. W rzeczywistości FAT jest używany na Pi, ale tylko na partycji rozruchowej.
Frepa
1
@Kibbee: Zobacz moją odpowiedź na stronie raspberrypi.stackexchange.com/questions/8850/..., aby zrozumieć, dlaczego karty SD mają własne problemy z fragmentacją. Wiele technik oprogramowania, które pozwoliłyby uniknąć fragmentacji dysku fizycznego (takich jak wstępne przydzielanie plików) są bezużyteczne w przypadku kart SD, ponieważ sektory są umieszczane (lub przenoszone) podczas zapisywania danych, a nie podczas przydzielania.
supercat