Mengapa kartu SD saya lambat?

23

Kartu SD saya tampaknya berjalan lambat. Saya memiliki kartu ADATA 16 GB SDHC Class 10. Aku memeriksa daftar kompatibilitas yang berisi daftar kartu dengan spesifikasi yang mirip, dan menyatakan bahwa itu "bekerja". Bahkan tugas-tugas sederhana seperti mendapatkan daftar direktori pada direktori kecil dapat mengambil beberapa detik pertama kalinya saya memintanya. Apakah ada alat bisa saya gunakan untuk memverifikasi apa kinerja saya keluar dari kartu SD saya? Juga, apakah ada perubahan konfigurasi saya dapat membuat untuk mendapatkan kartu SD untuk merespon lebih cepat?

Saya menggunakan Raspberry Pi sebagai seedbox BitTorrent tanpa kepala , jadi semua hal yang saya jalankan hanya berjalan di baris perintah. Saya menggunakan 240/16 split untuk memastikan bahwa saya memiliki jumlah maksimum memori yang tersedia.

Pembaruan

Setelah menjalankan beberapa tes seperti yang disarankan @Krzysztof Adamski dengan "dd", saya menerima beberapa hasil yang baik mendapatkan kecepatan baca 20 MB / s dan kecepatan tulis sekitar 10 MB / s. Namun, tampaknya masih memiliki beberapa masalah kecepatan I / O. Saat pengujian, aku berlari "dd" perintah di latar belakang, dan berlari atas, untuk melihat apa yang sedang terjadi. Saya melihat bahwa "mmcqd" Proses itu mengambil sedikit penggunaan prosesor, antara 5% dan 10%. Saya melihat-lihat di Internet dan menemukan banyak contoh orang yang melaporkan bahwa "mmcqd" menggunakan cukup banyak CPU. Saya kemudian menjalankan perintah berikut untuk menguji membaca dan menulis pada saat yang sama

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

Saat menjalankan perintah ini, saya mendapatkan throughput hanya 977 kB / s, dan "mmcqd" melaporkan penggunaan prosesor antara 10% dan 25% setiap 5 hingga 10 detik, setelah itu akan kembali ke nol. Jadi, saya melakukan beberapa pengujian lagi. Aku berlari dua perintah berikut di latar belakang, dan kemudian menonton apa yang terjadi di atas.

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

Dalam hal ini "mmcqd" akan memuncak sekitar penggunaan prosesor 35%, tetapi throughput jauh lebih baik sekitar 7,5 MB / s untuk membaca dan sekitar 5,3 MB / s untuk menulis.

Tampaknya ada beberapa jenis masalah yang terjadi di sini di mana menulis berat menyebabkan "mmcqd" untuk mengunci sistem. Ini menyebabkan transmisi-daemon melambat ke hampir nol begitu kecepatannya menjadi terlalu tinggi ketika menunggu kartu SD. Saat menjalankan transmisi-daemon Saya juga melihat "mmcqd" penggunaan mendapatkan cukup tinggi.

Kibbee
sumber
Apakah Anda yakin kartu SD menyebabkan masalah ini? Bisakah Anda pertama kali mencoba menggunakan kartu lain untuk mengecualikan bagian lain dari sistem?
Dawid Ferenczy Rogožan
Sudahkah Anda memeriksa syslog dan log kernel untuk pesan yang terkait dengan perangkat mmc? Beberapa kartu tidak berfungsi di Raspberry Pi. Beberapa lainnya membutuhkan sedikit penyesuaian agar dapat bekerja dengan andal.
Joppe
Tautan kartu SD telah pindah
ray023
1
@ Ray023 Terima kasih. Saya memperbarui tautan. Di masa depan, Anda bisa mengedit pertanyaan. Saya pikir karena Anda baru, pengeditan tidak akan segera diambil, tetapi akan disimpan untuk poster asli atau pengguna tingkat tinggi lainnya untuk menyetujuinya.
Kibbee

Jawaban:

21

Kecepatan baca kartu uji:

Ada dua cara mudah untuk menguji kecepatan baca (direktori listing hanya operasi baca):

  • menggunakan perintah dd:

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

    Ini akan membaca 800MB data dari kartu SD Anda dan membuangnya ke / dev / null. Jika terlalu lama, Anda dapat mengubah jumlah = 100 menjadi menghitung = 10 menjadi hanya membaca 80MB. Setelah perintah selesai harus mencetak pesan dengan kecepatan baca. Anda harus mendapatkan setidaknya beberapa MB / s.

  • menggunakan perintah hdparm:

    sudo hdparm -t /dev/mmcblk0

    Ini akan memberi Anda hasil kecepatan yang sama seperti perintah pertama dan juga harus setidaknya beberapa MB / s.

Kecepatan menulis kartu pengujian:

Tidak ada cara mudah untuk menguji kecepatan menulis karena untuk melakukan ini Anda harus benar-benar menulis beberapa data ke kartu. Jika Anda ingin melakukan hal ini pada tingkat rendah (omiting filesystem) Anda akan harus mengganti beberapa data pada kartu dan Anda mungkin tidak ingin melakukan ini. Hal ini dapat dilakukan jika Anda memiliki partisi swap karena dapat dengan mudah dinonaktifkan (dengan swapoff -a), diuji dengan dd (dengan dd if=/dev/zero of=/dev/{yourswappartitionnanehare} bs=8M count=25) dan kemudian diciptakan kembali (dengan mkswap /dev/{yourswappartitionnanehare}).

Jika Anda tidak memiliki partisi swap, Anda dapat menguji kecepatan penulisan filesystem juga menggunakan perintah dd:

dd jika = / dev / nol = / home / pi / testfile bs = 8M hitung = 25

Ini akan membuat file 200MB di /home/pi/testfile. Anda dapat menggunakan nama file lain yang Anda inginkan.

Catatan:

  • Saat menguji kecepatan, pastikan tidak ada program lain yang berjalan di sistem Anda (seperti aplikasi torrent dll).
  • Setelah pengujian, Anda dapat memeriksa output dari dmesgperintah untuk melihat apakah ada pesan tentang mmc subsistem.
  • Pastikan Anda menginstal firmware terbaru. Ada tambalan terlepas dari kecepatan kartu SD dari waktu ke waktu.
  • Anda mungkin juga ingin memeriksa beberapa firmware yang lebih lama karena mungkin ada beberapa regresi. Cara termudah untuk melakukan ini (tetapi bukan yang terbaik) adalah dengan menguji gambar sistem yang berbeda yang mana dibuat berdasarkan tanggal yang berbeda. Cara yang lebih sulit adalah dengan menggunakan github dan checkout versi historis dari file firmware.
Krzysztof Adamski
sumber
Pujian saya. Di MacBook Air, saya mendapat 1,4 MB / detik saat menulis file img ke Kartu SD kelas 6 4GB. Tes baca pada PI melaporkan 20 MB / detik !?
ScrollerBlaster
Saya memiliki hal yang sama. Kecepatan baca saya sekitar 500MB / detik. Saya saya mendapatkan sesuatu yang salah?
Darkest N2O
12

Untuk kinerja kartu SD, sangat penting apakah aksesnya berurutan (seperti dengan dd) atau akses acak dalam blok kecil. Kartu SD, terutama yang berkelas tinggi tampaknya dioptimalkan untuk akses sekuensial, yang bagus untuk menyimpan foto atau video. Namun, untuk menjalankan OS dari akses acak kartu SD lebih penting, karena banyak file kecil dibaca dan ditulis. Saya kira bittorrent juga menghasilkan akses acak.

Ini dua thread diskusi mengandung banyak benchmark kartu SD dan diskusi. Secara umum, kecepatan tulis acak ditemukan menjadi penentu untuk responsif menjalankan OS kartu. Kecepatan ini seringkali jauh lebih rendah daripada kecepatan penulisan sekuensial, yang merupakan kecepatan yang ingin dilaporkan oleh pabrikan. Kelas kartu SD didasarkan pada kecepatan berurutan, dan kelas yang lebih rendah (4 atau 6) mungkin sebenarnya lebih cocok untuk penggunaan raspberry.

Alat iozone mengukur kecepatan berbagai pola akses. Saya telah memposting instruksi singkat untuk mengkompilasi iozone di raspberry di sini .

Frepa
sumber
2
Jawaban yang menarik. Bagus
Jivings
sangat menarik karena saya baru saja membeli 4x kelas 10 ... sial! :-(
BerggreenDK
@ BerggreenDK : Mungkin di masa depan Anda juga menggunakan kartu untuk tujuan yang berbeda dan mungkin Anda akan senang bahwa Anda membeli kartu kelas 10.
Neverland
1
Kecepatan tulis acak seharusnya tidak banyak berpengaruh pada tugas-tugas biasa seperti urutan booting atau daftar direktori. Bahkan untuk torrent, hasil pengujian dengan penulisan 4KB tidak relevan: ukuran chunk yang umum adalah sekitar 1MB, dan kecuali Anda tidak memiliki RAM gratis, cache disk akan mengelompokkannya menjadi penulisan berurutan yang lebih besar.
Dmitry Grigoryev
0

Anda menulis "bittorrent" dan itu memicu tebak / jawaban saya.

Protokol torrent menerima paket secara acak dari seeder acak.

Setelah Anda mulai menggunakan torrent pada sistem file apa pun, itu menjadi agak terfragmentasi. Ini akan melukai kinerja besar.

Dari apa yang saya ketahui tentang SDcard, menjalankan FAT / FAT32 dan bahkan lebih buruk untuk menangani fragmentasi.

Jadi temukan cara untuk mendefrag kartu SD Anda, atau salin semua file darinya dan kemudian instal ulang OS.

Terakhir, menulis BANYAK (seperti yang akan dilakukan mesin bittorrent) akan merobek SDCARD Anda lebih cepat dari penggunaan normal. Saya tidak mengatakan itu salah untuk melakukannya, sebenarnya saya telah mempertimbangkan untuk serupa juga. Tapi - itu mungkin menjadi alasan untuk masalah Anda.

Saya berharap ada klien torrent yang secara otomatis akan mentransfer / memindahkan file yang diunduh ke tujuan lain setelah unduhan + "waktu unggah yang dipesan" selesai.

Maka defragmenting akan berjalan jauh lebih cepat.

BerggreenDK
sumber
Bagaimana fragmentasi berlaku untuk Kartu SD? Saya pikir fragmentasi hanya masalah pada disk pemintalan, karena file tersebut akan ditempatkan pada sektor non-sekuensial, menyebabkan kepala baca / tulis harus pindah ke semua tempat untuk mengakses file. Pada penyimpanan solid state seperti kartu SD, ini bukan masalah. Namun, saya akan setuju dengan Anda tentang jumlah tindakan tulis yang disebabkan oleh bittorrent. Saya pikir itu banyak hubungannya dengan masalah. Kombinasikan itu dengan sedikit memori pada RPi (milik saya memiliki 256 MB) dan tampaknya menjadi resep untuk akses disk yang lambat. Kartu SD juga lambat secara umum.
Kibbee
Nah, struktur FAT / FAT32 buruk dan lambat begitu Anda mulai memiliki banyak fragmen file. Dan Raspberry kecil tidak memiliki terlalu banyak kekuatan untuk bergerak. Jadi apa pun yang menghalangi jalannya, memperlambatnya. Tapi sekali lagi, ini hanya dugaanku. Saya tidak punya fakta tentang ini.
BerggreenDK
1
RPi bahkan tidak menggunakan FAT / FAT32. Sistem file adalah EXT4.
Kibbee
3
Jawabannya memiliki poin yang baik karena bittorrent mungkin menulis data ke file dalam potongan kecil dalam urutan acak. Jenis penulisan acak ini sangat tidak efisien pada kartu SD. Tapi saya pikir defragmenting tidak akan membantu. Sebenarnya, FAT digunakan pada Pi, tetapi hanya untuk partisi boot.
Frepa
1
@ Kibbee: Lihat jawaban saya di raspberrypi.stackexchange.com/questions/8850/… untuk memahami mengapa kartu SD memiliki masalah fragmentasi sendiri. Banyak teknik perangkat lunak yang akan menghindari fragmentasi disk fisik (seperti file pra-alokasi) tidak berguna dengan kartu SD, karena sektor ditempatkan (atau dipindahkan) ketika data dituliskan kepada mereka, bukan ketika mereka dialokasikan.
supercat