SD kart 8-128 kB kayıt boyutu için rasgele yazma performansı neden 4 kB kayıt boyutu performansının altına düşüyor?


15

SD kartların performansını rastgele yazma için kontrol ettiğimde, 4 kB kayıt boyutu için performansın oldukça kötü olduğunu görebiliyorum (bu şaşırtıcı değil), ancak daha sonra birkaç kart için artmadan önce daha büyük kayıt boyutları için bile düşüyor. Rasgele yazma performansını iozone v3.430 ile ölçtüm ve farklı üreticilerin birkaç flash kartını test ettim. Bu dosya boyutu 50 MB ile ölçmek için kullanılan iozone komutudur:

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

Dosya boyutu 50 MB olan sonuçlar:

İozon ve 50 MB dosya boyutuyla test edildiğinde rastgele yazma için SD kartların performans düşüşü

Soru: 8, 16, 32, 64 ve 128 kB kayıt boyutuna sahip rastgele yazma performansının 4 kB kayıt boyutuna göre daha yavaş olmasının nedeni nedir?

Peter Brittain daha büyük bir dosya boyutuyla test etmeyi önerdi, bu yüzden 500 MB dosya boyutuyla da denedim. Sonuçlar şunlardır:

İozon ve 500 MB dosya boyutuyla test edildiğinde rasgele yazma için SD kartların performans düşüşü

Genel performans kötüleşti, ancak fenomen hala gerçekleşiyor.

Bölümler 4 MB sınırlarına hizalanır. Dosya sistemi 4 kB blok boyutunda ext4'tür. Testlerin başlaması için kullanılan bölüm mmcblk0p2'dir.

$ 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

Güncelleme 1: Özellikle küçük kayıt boyutları için rastgele yazma performansının ardışık yazma ile karşılaştırıldığında önemli ölçüde düşük olduğu açıktır. NAND flash depolamanın bellek hücreleri sayfalara gruplanır ve silme blokları olarak adlandırılır. Tipik sayfa boyutları 4, 8 veya 16 kB'dir. Denetleyicinin tek sayfa yazması mümkün olsa da, ilk önce silinmeden verilerin üzerine yazılamaz ve silme bloğu bir NAND flash belleğin silebileceği en küçük birimdir. Silme bloğu boyutu tipik olarak 128 kB ile 2 MB arasındadır. Modern SD kartlarda, az sayıda silme bloğu, ayırma grupları veya ayırma birimleri veya segmentleri olarak adlandırılan eşit boyuttaki daha büyük birimlerde birleştirilir. Normal segment boyutu 4 MB'dir.Depolama alanındaki her yazma işlemi, tüm segment için bir okuma-değiştirme-yazma işlemi ile sonuçlanır. Örneğin, 4 MB segment boyutuna sahip bir SD kartta, rastgele yerlere 4 kB veri yazmak 1024 yazma amplifikasyon faktörüne neden olur. SD kartların denetleyicileri bir çeviri katmanı uygular. Herhangi bir G / Ç işlemi için, denetleyici tarafından sanaldan fiziksel adrese bir çeviri gerçekleştirilir. Bir segment içindeki verilerin üzerine yazılacaksa, çeviri katmanı segmentin sanal adresini silinmiş başka bir fiziksel adresle yeniden eşler. Eski fiziksel segment kirli olarak işaretlenir ve silme işlemi için sıraya alınır. Daha sonra silindiğinde tekrar kullanılabilir. SD kartların denetleyicileri, rasgele yazma işlemlerinin performansını artırmak için genellikle bir veya daha fazla segmenti önbelleğe alır.SD kartlar bir kök dosya sistemini depolarsa, kartın denetleyicisinin yazma işleminin / işlemlerinin yapıldığı segment (ler) i, dosya sistemi için meta verileri depolayan segmentleri (eğer kullanılabilir) dosya sisteminin günlüğü. Sonuç olarak, bir SD kartın rastgele yazma performansı silme bloğu boyutuna, segment boyutuna ve segment sayısına, denetleyici önbelleklerine bağlıdır. Ancak bu, 8, 16, 32, 64 ve 128 kB kayıt boyutuna sahip rastgele yazma performansının 4 kB kayıt boyutunda olduğu gibi neden daha yavaş olduğunu açıklamaz.

Güncelleme 2 (myaut'a cevap): Tablonun ekran görüntüsü benim işim. Şu anda, tek kartlı bilgisayar kümeleri hakkında bir makale / makale yazıyorum çünkü öğrenci projelerine ve araştırmacılara kaynak sağlamak için ilginç bir seçenek. Bu bağlamda, tek bir düğümün CPU, depolama ve ağ arayüzünün performansını da araştırdım. Test edilen tüm SD kartları satın aldım. Taktığım kartlardan birine (dd ile kopyalandı) Raspian Wheezy (sürüm 2014-06-20). Ağ ayarlarını yapılandırıp bazı ek paketler (örn. İozone) yükledikten sonra, tüm SD kartı diğer tüm SD kartlara kopyaladım.

Güncelleme 3 (Gabriel Southern'in cevabı): Sonuçlar tek seferliktir. Prosedür şöyleydi:

  1. Raspberry Pi Model B'ye kart takın
  2. Sistemi önyükleyin
  3. SSH ile giriş
  4. İozone test çalıştırmasını başlat
  5. Sistemi durdurun ve başka bir SD kart ile deneyin

Bazı kartlar kontrol etmek için birkaç kez denedim. Çok az değişiklik vardı. Bu olay, iki Samsung kartı ve bir Verbatim kartı hariç her zaman ortaya çıkar.

Güncelleme 4: Şu anda orada kesin bir cevap istemek için NAND flash klon kaydedicileri (Samsung, SanDisk, Toshiba ...) üreten bir şirketle iletişim kurmaya çalışıyorum. SanDisk'in bir forumu var. Ben sordum bir açıklama için orada. Ayrıca Kingston'un teknik destek bölümüne bir istek gönderdim.

Güncelleme 5: Silme bloğu boyutu ve ayırma birimi (segment) boyutu olaydan sorumlu değildir. ThinkPad X240 dizüstü bilgisayarın dahili kart okuyucusunda pritcsd.py alet yumruğu ve son olarak bir Raspberry Pi Model B ile tüm SD kartların silme bloğu boyutunu test ettim Erase block size of mmcblk0 is 65536 bytes. Ayrıca segment boyutu, test edilen tüm SD kartlar için eşittir. 4 MB. Bu bilgi dosyada bulunabilir /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size . Bence tüm bu kartların aynı silme bloğu boyutuna ve segment boyutuna sahip olması olağanüstü. Bu arada test edilen kartların ambalajlarından ürün kimliklerini / ürün numaralarını topladım. İşte buradalar.

Test edilen kartların ambalajlarından ürün kimlikleri / ürün numaraları

Güncelleme 6: Kingston'un teknik desteği, test edilen Kingston kartlarının (ve büyük olasılıkla diğer kartların) denetleyicilerinin 4 kB boyutundaki dosyalar için optimize edildiğini yazdı. Tam denetleyici uygulaması gizlidir. Kingston'ın cevabı aldığım en iyisi. SanDisk destek isteğime hiçbir zaman yanıt vermedi ve Sony, Samsung veya Verbatim'den bir kişi bulamadım


1
Bu ilginç bir soru. Raporladığınız sonuçlar, birden fazla çalıştırmada mı yoksa yalnızca tek bir çalıştırmada mı? Sonuçlarda ne kadar varyasyon olduğunu bilmek isterdim.

1
Mantıksal yeniden eşleme ve aşınma seviyelemesi sonucunda, "Örneğin 4 MB segment büyüklüğüne sahip bir SD kartta, rasgele konumlara 4 kB veri yazmak 1024 yazma yazma faktörü ile sonuçlanır." yanlış.
Ben Voigt

1
Deneyim performans testimde, daha küçük ölçekli testlerde her türlü optimizasyon ve önbelleğe ulaşıyorsunuz. Özellikle, daha yavaş flaşlı üreticilerin dosya sistemi güncellemelerini verimli bir şekilde işlemek için bu optimizasyonlara ihtiyaç duyacağına inanabilirim, ancak tüm kontrolörler için genel dokümantasyon eksikliği nedeniyle bunu kanıtlayamazlar. Bununla birlikte, yalnızca 50 MB'lık bir dosya kullandığınızı fark ettim. Buna karşı koymak için çok daha büyük dosyalar ( iozone.org/docs/IOzone_msword_98.pdf'deki "çalıştırma kuralları" uyarınca ) denediniz mi?

1
Hiçbir fark bulamadığınız varsayımına göre, bu konuda başka bir veriye baktım. Görünüşe göre Linaro org benzer araştırmalar yaptı . Özellikle, ekstra büyük SLC önbellek çok hızlı sonuçlarınızı açıklayabilir. FAT32 optimizasyonları özellikle küçük yazılara yönelik olacak.

1
Evet - sayfada zaten bu sorunu fark ettim ... Bence FAT32'de bir şey eksik olabilirsiniz: kartlar sadece FAT32 için değil, "FAT32'de gözlemlenen erişim kalıpları için" optimize edilmiştir. FAT'deki tipik bir erişim modeli, dosya verilerinin ve bir FAT güncellemesinin akışını gerektiren yeni bir dosya yazmak olacaktır. FAT güncellemesi genellikle az sayıda blok içerecektir. Bir FTL yazıyor olsaydım, FAT performansına yardımcı olmak için sayfa boyutumdan daha küçük tüm yazıları optimize etmeyi planlıyorum.

Yanıtlar:


4

SD Kart Hücreleri Yapısı:

Katı hal elektroniğinde bir hücre, bir veya daha fazla bilgi bitini depolayabilen bir bellek elemanıdır, hücre başına bit sayısı kullanılan teknolojiye bağlıdır. (SLC / MLC / TLC)

Üreticiler yapısını yönetmek için flash bellekte farklı teknolojiler kullanırlar, en çok kullanılan yapı TLC ve MLC'dir, çünkü bu teknoloji ile ilgili daha ucuz maliyetler özellikle TLC'dir.

Bu teknik bilgilerin SD Kartlar ve USB çubukları için elde edilmesi zordur, üreticiler buna benzer diğer flaşlarla ilgili olarak bu bilgilerin neredeyse her zaman sağlandığı SSD olarak karar verdi.

Bunun donanım ömrü üzerinde ve aynı zamanda hız üzerinde doğrudan etkisi vardır.

SLC, Tek Seviyeli Hücre (1 bit)

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

MLC, Çok Seviyeli Hücre (2 veya daha fazla bit)

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

TLC, Üç Seviyeli Hücre (3 bit)

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

Not :

Hücreler 1, 2 veya 3 bit içerebileceğinden, sd kart denetleyici yongasının kayıt boyutuna ve hücre kapasitesine bağlı olarak daha fazla erişim döngüsü gerçekleştirmesi gerekecektir.

Samsung kartlarınız muhtemelen bir SLC teknolojisi kullanıyor veya güçlü bir denetleyici yongasına sahip.

Not 2:

Ext4 blok boyutu 4 kb ve 1 kb bölümleriyle yaptığınız gibi bazı testleri denedim, ancak büyük bir fark olmadan


Samsung kartları ve Verbatim kartı tüketici ürünleridir ve son yıllarda SLC bellek bu tür cihazlarda yaygın değildi. Samsung kartları MB-MP16D ve MB-MS16D'dir ve sözlü kart 44007 numaralı makaledir .
Neverland

Belki bazı kontrolörlerin özellikleri mevcuttur. SD kartları açabilir ve bu kartların hangi denetleyicileri içerdiğini kontrol edebilirim, ancak microSD kartları açamıyorum. SD kartların denetleyicilerinin ürün kimliğini / numarasını yazılım aracılığıyla okuma şansı var mı?
Neverland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.