ディスクから大容量ファイルを順番に読み込んでいるiostat
間に出力を理解しようとしています。
- ファイルサイズ: 10GB
- 読み取りバッファ:4KB
- 先読み (/sys/block/sda/queue/read_ahead_kb): 128KB
出力iostat
は次のとおりです
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 833.00 14.00 103.88 0.05 251.30 6.07 5.69 2.33 205.71 1.18 100.00
I / O要求の平均サイズを計算すると、=(rMB / sをr / sで割ったもの)約128 KBです。これは先読み値です。これは、読み取りシステム呼び出しで4KBのバッファを指定しても、実際のディスクI / Oは先読み値に基づいて発生することを意味するようです。
先読み値を256KBに増やすと、iostat
出力は次のようになります。
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 28.00 412.00 12.00 102.50 0.05 495.32 10.78 12.15 4.76 265.83 2.36 100.00
同様に、平均I / O要求サイズは256 KBであり、先読みと一致します。
これは先読み値を 512 KB に設定するまで続いており、先読み値を 1024 KB に増やした場合は持続しませんでした。 I / O要求の平均サイズはまだ512KBでした。 max_sectors_kb(I / O要求ごとの最大データ量)をデフォルト値の512 KBから1024 KBに増やすことは役立ちません。
これが起こる理由 - 理想的には、読み取りIOPSをできるだけ少なくし、I / O要求ごとに大量のデータ(要求あたり512KB以上)を読みたいと思います。また、すべてのケースで100%ディスク使用率を得ました。良いシーケンシャルスループットで、読み取りに対するディスク使用率を50〜60%に制限したいと思います。つまり、シーケンシャルリードI/Oの最適なアプリケーション/カーネル設定は何ですか?
答え1
max_sectors_kb
設定によって制限されることがあります/dev/sda
。
cat /sys/block/sda/queue/max_sectors_kb
ほぼ確実に512を返します。
次のように1024に変更できます。
echo 1024 > /sys/block/sda/queue/max_sectors_kb
他の制限がないと仮定すると、表示されるIOサイズは1024 KBに増加する必要があります。