注記: ここで似たような質問をいくつか見ましたが、
- いずれも多数のファイルを並列に読み取ることに関係するものではなく、
- ほとんどは 10 年以上前のものであり、もはや関連性のないハードウェアとカーネルのバージョンに関するものです。
背景:
私は Linux マシン (Ubuntu、カーネル 5.15.0-82-generic) を所有しており、2 つの 128 コア CPU と 128 GB の RAM を搭載しています。このマシンには、SATA 経由で接続された 10 台の SSD の RAID 5 アレイがあり、各 SSD の読み取り速度は最大 530 MB/秒です。これらは、使用中は実質的に読み取り専用です (主に日中に使用され、新しいデータは毎晩追加されます)。私の一般的な問題は、数十のコアにディスクからデータを並列に供給することです。
ベンチマーク手順
私はインスタンスを実行して読み取りのベンチマークを行っています
dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576
と並行して実行しますiostat
。iotop
実行の合間に、実行してキャッシュをクリアします。
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
これが正しく機能すると確信しています。なぜなら、これを行わない場合、ホット ファイルのその後の読み取りはほぼ即座に終了し、これを実行すると、そのファイルの読み取りは以前と同じパフォーマンスに戻るからです。
ベンチマーク結果
ソフトウェア RAID 経由で 1 つのファイルを読み取ると、読み取り速度は 500 ~ 700 MB/秒になります。出力を見ると、iostat
これは 10 個のドライブのそれぞれから基本的にまったく同じ速度で並行して読み取ることによって実現されていることがわかります。
ドライブから直接読み取る場合 (つまり、の引数として/dev/sda
、/dev/sdb
などを指定する場合)、各ドライブから 530MB/秒ずつ並列に読み取ることができます (つまり、10 台すべてから 1GB を読み取るのにかかる時間は、そのうちの 1 台から 1GB を読み取るのにかかる時間とまったく同じです)。if=
dd
ただし、ソフトウェア RAID で複数のファイルを並行して読み取ろうとすると、パフォーマンスが大幅に低下します。ソフトウェア RAID で 10 個のファイルを並行して読み取ると、個々のファイルの読み取り速度は 150 ~ 350 MB/秒になり、プロセス全体には、同じ量のデータをドライブから直接コピーする場合の 4 倍ほどの時間がかかります。
さらに、iotop の報告によると、ソフトウェア読み取りによる読み取りは、合計読み取り速度が約 2.7 GB/秒で絶対的な壁にぶつかるようです。
すべてのコアに無駄のない十分なディスク データを供給するには、SATA ではなく NVMe に移行する必要があると思いますが、ソフトウェア RAID またはその上流の何かが、これらのディスクから読み取ることができる速度に上限を設けているようなので、まずはこの問題を解決したいと思います。
質問:
- ボトルネックがどこにあるかをどのように診断すればよいでしょうか?
- ここで設定オプションを確認するにはどうすればいいのでしょうか。また、他のオプションは何でしょうか。
- 私の設定には、私がやろうとしていることを不可能にする根本的な制限がありますか? もしそうなら、使用できる代替構成はありますか?
すでに試したこと
- のブロック サイズを
dd
大きくしたり小さくしたりしても、効果はありません。 - RAIDの先読みやストライプキャッシュのサイズを設定しても効果はありません
- apt が望んでいたカーネルをわずかに新しいバージョンにアップグレードすると、ベンチマーク結果が大幅に低下し、基本的に合計スループットが 500 MB/秒に制限されるようになりました。
補遺:
iostat -k 1
ベンチマーク実行中のサンプル出力:https://pastebin.com/yuWwWbRU
の内容/proc/mdstat
:
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
bitmap: 0/59 pages [0KB], 65536KB chunk
unused devices: <none>