Bir blok cihazını şifrelemenin yazarken büyük bir performans cezası getirdiği bir sorunu araştırıyorum . Saatler süren Internet okuma ve deneyler bana bir çözüm değil, doğru bir anlayış sağlamıyordu.
Kısacası soru: Neden bir blok cihaza btrfs takarken (~ 170MB / s) mükemmel bir yazma hızına sahip oluyorum; dosya sistemi ve blok aygıtı, sistem yeterince yüksek bir şifreleme verimini sürdürebilmekten daha fazlası olmasına rağmen?
senaryo
/home/schlimmchen/random
/dev/urandom
önceki verilerle dolu bir 4.0 GB dosyadır .
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Okumak süper hızlı:
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 6.58036 s, 648 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 0.786102 s, 5.4 GB/s
(ikinci kez, dosya açıkça önbellekten okundu).
Şifrelenmemiş btrfs
Cihaz doğrudan btrfs ile biçimlendirilmiştir (blok cihazda bölüm tablosu yoktur).
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
Yazma hızı ~ 170MB / s'ye kadar yükseliyor:
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 27.1564 s, 157 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test2 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 25.1882 s, 169 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test3 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 29.8419 s, 143 MB/s
Okuma hızı 200 MB / sn'nin oldukça üstünde.
$ dd if=/mnt/dd-test1 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.8265 s, 215 MB/s
$ dd if=/mnt/dd-test2 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.9821 s, 213 MB/s
$ dd if=/mnt/dd-test3 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.8561 s, 215 MB/s
Blok cihazda şifreli btrfs
Aygıt LUKS ile biçimlendirilmiş ve sonuçta elde edilen aygıt btrfs ile biçimlendirilmiştir:
$ sudo cryptsetup luksFormat /dev/sdf
$ sudo cryptsetup luksOpen /dev/sdf crypt
$ sudo mkfs.btrfs /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt /mnt
$ sudo chmod 777 /mnt
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 210.42 s, 20.3 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test2 bs=1M
4265841146 bytes (4.3 GB) copied, 207.402 s, 20.6 MB/s
Okuma hızı yalnızca marjinal olarak zarar görüyor (neden hiç yok?):
$ dd if=/mnt/dd-test1 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 22.2002 s, 192 MB/s
$ dd if=/mnt/dd-test2 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 22.0794 s, 193 MB/s
luksDump: http://pastebin.com/i9VYRR0p
Şifreli btrfs blok cihazındaki btrfs dosyasında
Şifrelenmiş bir dosyaya yazarken yazma hızı "yüksek hıza" çıkar. Blok cihaza bir btrfs koydum, yerleştirdiğim ve yerleştirdiğim bir 16GB dosya lukfsFormat
ayırdım.
$ sudo mkfs.btrfs /dev/sdf -f
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
$ dd if=/dev/zero of=/mnt/crypted-file bs=1M count=16384 conv=fsync
17179869184 bytes (17 GB) copied, 100.534 s, 171 MB/s
$ sudo cryptsetup luksFormat /mnt/crypted-file
$ sudo cryptsetup luksOpen /mnt/crypted-file crypt
$ sudo mkfs.btrfs /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt /tmp/nested/
$ dd if=/home/schlimmchen/Documents/random of=/tmp/nested/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 26.4524 s, 161 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/tmp/nested/dd-test2 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 27.5601 s, 155 MB/s
Yazma performansı neden böyle artmaktadır? Bu belirli dosya sistemlerini ve blok aygıtlarını yerleştirme yüksek yazma hızlarında yardımcı olmak için neler sağlar?
Kurmak
Sorun, aynı dağıtımı ve çekirdeği çalıştıran iki sistemde tekrarlanabilir. Ancak, düşük yazma hızlarını da System2'de çekirdek 3.19.0 ile gözlemledim.
- Cihaz: SanDisk Extreme 64GB USB3.0 USB Stick
- Sistem1: Intel NUC 5i5RYH, i5-5250U (Broadwell), 8 GB RAM, Samsung 840 EVO 250 GB SSD
- Sistem2: Lenovo T440p, i5-4300M (Haswell), 16GB RAM, Samsung 850 PRO 256GB SSD
- Distro / Çekirdek: Debian Jessie, 3.16.7
- cryptsetup: 1.6.6
/proc/crypto
Sistem1 için: http://pastebin.com/QUSGMfiScryptsetup benchmark
Sistem1 için: http://pastebin.com/4RxzPFeT- btrfs (-tools) sürüm 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
Düşünceler
- Uyum, görebildiğim kadarıyla sebep değil . Çubuğun sayfa boyutu 16KiB olsa bile, kripto kurulum yükü başlangıcı yine de 2MiB'ye hizalanır.
--allow-discards
(cryptsetup's luksOpen için) beklediğim gibi, yardımcı olmadı.- Onunla çok daha az deney yaparken, USB3.0 bağdaştırıcısına bağlı harici bir sabit diskle çok benzer davranışlar gözlemledim.
- Bana öyle geliyor ki, sistem 64 KBB blok yazıyor. Çalıştığım bir systemtrap betiği en azından bunu gösteriyor.
/sys/block/sdf/stat
Birçok hipotez birleştiğinden bu hipotezi desteklemektedir. Yani benim tahminim, çok küçük bloklar halinde yazmanın nedeni değil. - Engelleme aygıtı sıra zamanlayıcısını NOOP olarak değiştirmede şans yok.
- Şifreyi bir LVM birime koymak yardımcı olmadı.