블록 장치를 암호화 하면 쓸 때 큰 성능 저하 가 발생하는 문제를 조사 중 입니다. 몇 시간의 인터넷 읽기 및 실험으로 해결책은 물론 적절한 이해도를 얻지 못했습니다.
간단히 말해 : btrfs를 블록 장치 (~ 170MB / s)에 넣을 때 쓰기 속도가 완벽하게 빠른 이유는 무엇입니까? 시스템이 충분히 높은 암호화 처리량을 유지할 수 있지만 파일 시스템과 블록 장치는 무엇입니까?
대본
/home/schlimmchen/random
/dev/urandom
이전의 데이터로 채워진 4.0GB 파일 입니다.
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
쓰기 속도는 암호화 된 파일에 쓸 때 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
왜 이렇게 쓰기 성능이 향상됩니까? 파일 시스템 및 블록 장치의 이러한 특정 중첩은 높은 쓰기 속도를 지원하기 위해 무엇을 달성합니까?
설정
동일한 배포판과 커널을 실행하는 두 시스템에서 문제를 재현 할 수 있습니다. 그러나 System2의 커널 3.19.0에서 쓰기 속도가 느리다는 것도 관찰했습니다.
- 장치 : SanDisk Extreme 64GB USB3.0 USB 스틱
- 시스템 1 : Intel NUC 5i5RYH, i5-5250U (Broadwell), 8GB RAM, Samsung 840 EVO 250GB SSD
- 시스템 2 : Lenovo T440p, i5-4300M (Haswell), 16GB RAM, Samsung 850 PRO 256GB SSD
- 배포판 / 커널 : 데비안 제시, 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
(cryptsetup의 luksOpen의 경우) 예상대로 도움이되지 않았습니다.- 그것으로 실험을하는 동안 USB3.0 어댑터를 통해 연결된 외장 하드 드라이브와 매우 유사한 동작을 관찰했습니다.
- 시스템이 64KiB 블록을 쓰고있는 것 같습니다. systemtrap 스크립트 내가 시도는 적어도 것을 나타냅니다.
/sys/block/sdf/stat
많은 쓰기가 병합되므로이 가설을 뒷받침합니다. 그래서 내 생각 엔 너무 작은 블록으로 쓰는 것이 원인이 아니라는 것입니다. - 블록 장치 큐 스케줄러를 NOOP로 변경하면 운이 없습니다.
- 암호를 LVM 볼륨에 넣는 것은 도움이되지 않았습니다.