Macのディスク暗号化による書き込み速度の低下

Macでは、ディスクをフォーマットする際にドライブ(パーティション)全体を暗号化することができる。この設定を行うと、パーティションのマウント時にパスワードの入力が求められるため、他人にデータを盗み見られることを防ぐことができる。

f:id:try-best-tomorrow-in-same-today:20160110155314p:plain

特にUSBメモリやSDカードなどのリムーバブルドライブに対して、紛失時のデータ保護が期待できることから、僕はMicroSDカードをフォーマットする際に暗号化オプションを利用している。

しかし最近、このドライブにアクセスする際のもたつきが気になってきたので、ドライブの暗号化によるデータ転送速度の変化を確認してみた。

環境

  • MacBook Air 13-inch, Early 2014
  • [MicroSDカードアダプター EAD-103ARD]

データ書き込み速度ベンチマーク

暗号化ドライブと非暗号化ドライブそれぞれに対して、ddコマンドを使って512MByte分のゼロ及び乱数データの書き込みを行う際の処理時間を10回計測した。それぞれ最大値と最小値を除外した8時点のデータについて比較した。

結果

データ種別 ドライブ暗号化 平均時間[sec] 標準偏差 平均速度[Mbyte/sec]
乱数 あり 70.904 8.157 7.221
乱数 なし 9.494 0.428 53.929
ゼロ あり 77.847 19.679 6.577
ゼロ なし 8.922 0.405 57.386

ゼロデータ及び乱数データのいずれにおいても、暗号化ドライブに対する書き込みは、非暗号化ドライブに対する書き込みより7倍程度遅いことが分かった。

結論

SDカードのようなリムーバブルディスクの紛失に備えて、ドライブの暗号化は欠かすことができない安全対策である。しかし、データの書込み速度の低下はかなり大きいため、データの書換えを頻繁に行う場合には、SSDなど適切なローカルドライブを活用するようにしたい。

検証用スクリプト

テストデータ書き込みスクリプト:bench_sd.sh

#!/bin/sh

count=128;
bs=1m; #128MByte data
outputDir=$1;
loopNum=$2;

if [ $# -ne 2 ];
then
    echo "usage: $1 [output_dir_path] $2 [trial_num]" 1>&2;
    exit 0;
fi;

echo " ===== bench start =====";
echo " *** zero write ***";
for i in `seq $loopNum`;
do
    echo " .. round $[i] ..";
    dd if=/dev/zero of=${outputDir}/test_zero${i} count=${count} bs=${bs};
done;

echo " *** rand write ***";
for i in `seq $loopNum`;
do
    echo " .. round $[i] ..";
    dd if=/dev/urandom of=${outputDir}/test_rand${i} count=${count} bs=${bs};
done;
echo " ===== bench done =====";
exit 0;

検証の実行

1. テスト実行

# 非暗号化ドライブへの書き込み
$ bench_sd.sh /Volumes/SD 10 2>&1| tee bench_sd-normal.log
# 暗号化ドライブへの書き込み
$ bench_sd.sh /Volumes/SD 10 2>&1| tee bench_sd-encrypt.log
# 集計用ファイルの作成
$ awk '{if(/write/) type = $2} {if(/secs/) print substr(FILENAME,10,6)" "type" "$5}' bench_sd-* > result

2. Rによる結果の集計

A <- read.csv("result", header=F, sep=" ")
res <- matrix(nrow=0, ncol=5)
for (file in unique(A$V1)){
B <- A[A$V1==file,]
for (type in unique(B$V2)){
    C <- B[B$V2==type,]
    Cdmax <- C[-(which(C$V3==max(C$V3))),]
    Cdmaxmin <- Cdmax[-(which(Cdmax$V3==min(Cdmax$V3))),]
    sd <- round(sd(Cdmaxmin$V3),3)
    ave <- round(mean(Cdmaxmin$V3),3)
    spd <- round(512 / ave,3)
    res <- rbind(res, c(file, type, ave,sd, spd))
}
}
result <- data.frame(res[order(res[,2]),c(2,1,3,4,5)])
names(result) <- c("dataType", "format", "mean", "sd", "speed")
print(result)

本ページには、Amazon.co.jpアソシエイト・プログラムによるリンクが含まれております。