3台のハードドライブにLinuxソフトウェアRAID5をセットアップし、cryptsetup/LUKSで暗号化したいと思います。私のテストでは、暗号化によってパフォーマンスが大幅に低下することが示されましたが、これは説明できません。
RAID5は、暗号化なしで187 MB/s [1]を書き込むことができます。その上に暗号化を使用すると、書き込み速度は約40MB /秒に低下します。
RAIDのチャンクサイズは512Kで、書き込みインテントビットマップがあります。 -c aes-xts-plain -s 512 --align-payload=2048
のパラメータとしてcryptsetup luksFormat
を使用したので、ペイロードは512バイト(つまり1MB)の2048ブロックに整列する必要があります。 cryptsetup luksDump
は、4096のペイロードオフセットを示しています。したがって、アライメントは正しく、RAIDチャンクサイズに適合していると思います。
CPUはAES(aesni_intel)をハードウェアでサポートしているため、ボトルネックではありません。同じく暗号化されている別のドライブ(LVMを備えたSSD)に書き込む場合、書き込み速度は150 MB/sになります。 top
は、CPU使用率が実際に非常に低く、RAID5 xorのみが14%を占めることを示しています。
また、ファイルシステム(ext4)を暗号化されていないRAIDに直接配置してみたので、階層化に問題があるかどうかを確認します。ファイルシステムは、期待どおりにパフォーマンスを少し低下させますが、それほどではありません(書き込み速度は変動しますが、> 100MB /秒)。
概要:
ディスク+ RAID5:良好
ディスク+ RAID5 + ext4:良好
ディスク+ RAID5 +暗号化:不良
SSD +暗号化+ LVM + ext4:良好
読み取りパフォーマンスは暗号化の影響を受けません。暗号化なしで207MB/s、暗号化ありで205 MB/sです(CPUパワーが問題ではないことも示しています)。
暗号化されたRAIDの書き込みパフォーマンスを向上させるにはどうすればよいですか?
[1]すべての速度測定は、dd if=/dev/zero of=DEV bs=100M count=100
を数回実行して行われました(つまり、100Mのブロックで10Gを書き込みます)。
編集:これが役立つ場合:Linux2.6.38でUbuntu11.0464ビットを使用しています。
Edit2: 4KB、1MB、または10MBのブロックサイズをdd
に渡しても、パフォーマンスはほぼ同じです。
解決策は、mdレイドにstripe_cache_size
機能を設定することです。
デフォルトでは256に設定されていますが、最大32768まで増やすことができます。
これは、必要なサイズを/sys/block/md0/md/stripe_cache_size
に書き込むことによって行われます(レイドがmd0
の場合)。 Ask Ubuntuには 値を永続的に設定するための解決策 があります。
質問とまったく同じRAIDでテストしたところ、次の数値が得られました。
size 256: 50 MB/s
size 4096: 123 MB/s
size 8192: 142 MB/s
size 16384: 140 MB/s
size 32768: 142 MB/s
これらのテストは、Ubuntu 12.04(Linux 3.2)を使用して、1MBのブロックを含むファイルに10GBを書き込むことによって実行されました。
背景:ストライプキャッシュには、最近書き込まれたブロックが格納されます。データが継続的に書き込まれる場合、最初の書き込み中に1つのストライプの一部のみが書き込まれることがあります。つまり、RAIDコードは、ディスクから完全なストライプを読み取り、更新して、完全に再書き込みする必要があります。同じストライプの別の部分に対して2回目の書き込みが行われた場合、これをすべて再度実行する必要があります。これで、キャッシュが使用され、最初の書き込みで書き込まれたデータがまだ含まれている場合、2番目の書き込みの前に必要だった読み取りを省略できます。
通常、書き込み時にブロックサイズを大きくすると、問題が発生しなくなります(フルストライプが一度に書き込まれるため、読み取りがまったく必要ないため)。ただし、暗号化は基盤となるデバイスへの書き込み時に小さなブロックのみを使用するようであるため、キャッシュを増やすとプラスの効果があります。
LUKSには問題があります。つまり、ブロックデバイスごとに1つのスレッドを生成するだけです。
RAID 5の上に暗号化を配置していますか?次に、OSの観点からは、デバイスは1つだけであり、それらすべてのディスクに1つのスレッドのみを使用します。つまり、ディスクは並列ではなくシリアルで動作します。
暗号化されたデバイスの上にLVMを配置していますか?次に、デバイスごとに1つのスレッドを生成して、デバイスが並行して動作できるようにします。
そのための解決策は? Linuxを使用している場合は、CPU速度、電力、コア数に関係なく、ソフトウェアRAIDを使用してから、暗号化されたディスク上にボリュームを作成します。そうすれば、OSは複数のデバイスを認識し、各デバイスごとにスレッドを生成します。
欠点は、パスキーを何度も入力する必要があることですが、それを回避するには、この設定を行うことができます。 1つのディスクまたはディスクの一部にブートパーティションとルートパーティションがあり、ブートは暗号化されておらず、ルートは暗号化されてキーファイルを保持しています。そのキーファイルは他のデバイス(おそらく同じディスクの残りの部分)を復号化するために使用されます。
この問題はRAIDを使用していないが、ホストOSの速度を低下させている仮想マシンを処理していることがわかりました。推測のOSがラックスレッドを独占していることに気付くまで、同じデバイス上に異なるパーティションを作成し、仮想マシンに1つのパーティションを使用することにしましたディスクの場合、スレッドを独占できず、両方のOSのパフォーマンスが大幅に向上します。
ソフトウェアRAIDを使用することもメリットがあると思います。ハードウェアに依存する必要はありません。