ฉันกำลังตรวจสอบปัญหาที่การเข้ารหัสอุปกรณ์บล็อกกำหนดโทษประสิทธิภาพอย่างมากเมื่อเขียนลงไป ชั่วโมงการอ่านทางอินเทอร์เน็ตและการทดลองไม่ได้ทำให้ฉันมีความเข้าใจที่ถูกต้อง
คำถามสั้น ๆ :ทำไมฉันถึงได้ความเร็วการเขียนที่รวดเร็วอย่างสมบูรณ์แบบเมื่อวาง btrfs ลงในอุปกรณ์บล็อก (~ 170MB / s) ในขณะที่ความเร็วในการเขียนลดลง (~ 20MB / s) เมื่อวาง dm-crypt / LUKS ไว้ในระหว่าง ระบบไฟล์และอุปกรณ์บล็อกแม้ว่าระบบจะมีความสามารถในการรองรับปริมาณการเข้ารหัสที่สูงเพียงพอหรือไม่?
สถานการณ์
/home/schlimmchen/random
เป็นไฟล์ 4.0GB ที่เต็มไปด้วยข้อมูลจาก/dev/urandom
ก่อนหน้านี้
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
การอ่านมันเร็วสุด ๆ :
$ 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
(ครั้งที่สองไฟล์อ่านอย่างชัดเจนจากแคช)
btrfs ที่ไม่ได้เข้ารหัส
อุปกรณ์ถูกจัดรูปแบบโดยตรงกับ btrfs (ไม่มีตารางพาร์ติชันบนอุปกรณ์บล็อก)
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
ความเร็วในการเขียนสูงถึง ~ 170MB / s:
$ 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
ความเร็วในการอ่านสูงกว่า 200MB / s
$ 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
เข้ารหัส btrfs บนอุปกรณ์บล็อก
อุปกรณ์ถูกฟอร์แมตด้วย LUKS และอุปกรณ์ผลลัพธ์ถูกจัดรูปแบบด้วย btrfs:
$ 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
ความเร็วในการอ่านมีเพียงเล็กน้อยเท่านั้น (ทำไมจึงเป็นเช่นนั้น?):
$ 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
เข้ารหัส btrfs ในไฟล์บน btrfs บนอุปกรณ์บล็อก
ความเร็วในการเขียน "skyrockets" มากกว่า 150MB / s เมื่อเขียนลงในไฟล์ที่เข้ารหัส ฉันใส่ btrfs ลงในอุปกรณ์บล็อคจัดสรรไฟล์ 16GB ซึ่งฉันlukfsFormat
ติดตั้งไว้แล้ว
$ 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
เหตุใดประสิทธิภาพการเขียนจึงเพิ่มขึ้นเช่นนี้ การทำรังของระบบไฟล์และอุปกรณ์บล็อกนี้ช่วยให้เกิดความเร็วในการเขียนสูงได้อย่างไร
ติดตั้ง
ปัญหานี้สามารถทำซ้ำได้ในสองระบบที่ใช้ distro และ kernel เดียวกัน อย่างไรก็ตามฉันยังสังเกตเห็นความเร็วในการเขียนต่ำด้วยเคอร์เนล 3.19.0 บน System2
- อุปกรณ์: Stick USB SanDisk Extreme 64GB USB3.0
- ระบบ 1: Intel NUC 5i5RYH, i5-5250U (Broadwell), 8GB RAM, Samsung 840 EVO 250GB SSD
- ระบบ 2: Lenovo T440p, i5-4300M (Haswell), RAM 16GB, Samsung 850 PRO 256GB SSD
- Distro / Kernel: Debian Jessie, 3.16.7
- cryptsetup: 1.6.6
/proc/crypto
สำหรับ System1: http://pastebin.com/QUSGMfiScryptsetup benchmark
สำหรับ System1: http://pastebin.com/4RxzPFeT- btrfs (-tools) คือเวอร์ชัน 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
ความคิด
- การจัดตำแหน่งไม่ใช่สาเหตุเท่าที่ฉันเห็น แม้ว่าขนาดหน้ากระดาษของแท่งเป็น 16KiB การเริ่มต้นของอัตราการโหลด cryptsetup จะถูกจัดตำแหน่งเป็น 2MiB ต่อไป
--allow-discards
(สำหรับ luksOpen ของ cryptsetup) ไม่ได้ช่วยอย่างที่ฉันคาดไว้- ในขณะที่ทำการทดลองน้อยลงฉันสังเกตเห็นพฤติกรรมที่คล้ายกันมากกับฮาร์ดไดรฟ์ภายนอกที่เชื่อมต่อผ่านอะแดปเตอร์ USB3.0
- สำหรับฉันดูเหมือนว่าระบบกำลังเขียนบล็อก 64KiB สคริปต์ systemtrapผมพยายามแสดงให้เห็นว่าอย่างน้อย
/sys/block/sdf/stat
สำรองสมมติฐานนี้ขึ้นเนื่องจากมีการรวมการเขียนจำนวนมาก ดังนั้นฉันเดาว่าการเขียนในบล็อกเล็กเกินไปไม่ใช่สาเหตุ - ไม่มีโชคกับการเปลี่ยนเครื่องมือจัดคิวคิวของอุปกรณ์บล็อกเป็น NOOP
- การใส่รหัสลับในปริมาตร LVM ไม่ได้ช่วยอะไร