Tôi đang điều tra một vấn đề trong đó mã hóa một thiết bị khối áp dụng một hình phạt hiệu năng rất lớn khi viết cho nó. Hàng giờ đọc và thử nghiệm trên Internet không cung cấp cho tôi một sự hiểu biết đúng đắn, chứ đừng nói đến một giải pháp.
Câu hỏi ngắn gọn: Tại sao tôi có tốc độ ghi hoàn toàn nhanh khi đặt btrfs vào thiết bị khối (~ 170MB / s), trong khi tốc độ ghi giảm mạnh (~ 20MB / s) khi đặt dm-crypt / LUKS vào giữa hệ thống tập tin và thiết bị khối, mặc dù hệ thống có nhiều khả năng duy trì thông lượng mã hóa đủ cao?
Kịch bản
/home/schlimmchen/random
là một tệp 4.0GB chứa đầy dữ liệu từ /dev/urandom
trước đó.
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Đọc nó là siêu nhanh:
$ 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
(lần thứ hai, tập tin rõ ràng đã được đọc từ bộ đệm).
Btrfs không được mã hóa
Thiết bị được định dạng trực tiếp bằng btrfs (không có bảng phân vùng trên thiết bị khối).
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
Tốc độ ghi lên tới ~ 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
Tốc độ đọc tốt hơn 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 được mã hóa trên thiết bị khối
Thiết bị được định dạng bằng LUKS và thiết bị kết quả được định dạng bằng 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
Tốc độ đọc chỉ bị ảnh hưởng nhẹ (tại sao lại không?):
$ 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 được mã hóa trong tệp trên btrfs trên thiết bị khối
Tốc độ ghi "skyrockets" tới hơn 150MB / s khi ghi vào tệp được mã hóa. Tôi đặt một btrfs vào thiết bị khối, cấp phát một tệp 16 GB, mà tôi lukfsFormat
đã chỉnh sửa và gắn kết.
$ 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
Tại sao hiệu suất ghi tăng như thế này? Việc lồng các hệ thống tập tin và thiết bị khối đặc biệt này đạt được điều gì để hỗ trợ tốc độ ghi cao?
Thiết lập
Vấn đề có thể tái tạo trên hai hệ thống chạy cùng một bản phân phối và kernel. Tuy nhiên, tôi cũng quan sát tốc độ ghi thấp với kernel 3.19.0 trên System2.
- Thiết bị: Thanh USB USB3.0 của SanDisk Extreme 64GB
- Hệ thống1: Intel NUC 5i5RYH, i5-5250U (Broadwell), RAM 8GB, SSD Samsung 840 EVO 250GB
- Hệ thống2: Lenovo T440p, i5-4300M (Haswell), RAM 16 GB, SSD Samsung 850 PRO 256GB
- Phân phối / Hạt nhân: Debian Jessie, 3.16.7
- cryptsetup: 1.6.6
/proc/crypto
cho Hệ thống1: http://pastebin.com/QUSGMfiScryptsetup benchmark
cho Hệ thống1: http://pastebin.com/4RxzPFeT- btrfs (-tools) là phiên bản 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
Suy nghĩ
- Căn chỉnh không phải là nguyên nhân xa như tôi có thể thấy. Ngay cả khi kích thước trang của thanh là 16KiB, thì bắt đầu tải trọng của cryptsetup vẫn được căn chỉnh thành 2MiB.
--allow-discards
(đối với luksOpen của cryptsetup) không giúp được gì, như tôi đã mong đợi.- Trong khi thực hiện ít thử nghiệm hơn với nó, tôi đã quan sát hành vi rất giống với ổ cứng ngoài, được kết nối qua bộ chuyển đổi USB3.0.
- Dường như với tôi rằng hệ thống đang viết các khối 64KiB. Một kịch bản systemtrap tôi đã cố gắng chỉ ra rằng ít nhất.
/sys/block/sdf/stat
ủng hộ giả thuyết này vì rất nhiều bài viết được hợp nhất. Vì vậy, tôi đoán là viết trong các khối quá nhỏ không phải là nguyên nhân. - Không có may mắn với việc thay đổi lịch trình hàng đợi thiết bị khối thành NOOP.
- Đặt mật mã vào một khối LVM không giúp được gì.