データがディスクに書き込まれる方法を理解したいと思います。さまざまなブロックサイズを使用してデータを書き込んでいますが、dd
iostatによると、ディスクは常に同じサイズのブロックの影響を受けているようです。たとえば、このコマンドは128Kブロックを書き込む必要があります。
dd if=/dev/zero of=/dev/sdb bs=128K count=300000
切り取られた出力iostat -dxm 1
:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 129897.00 0.00 1024.00 0.00 512.00 1024.00 142.09 138.81 0.00 138.81 0.98 100.00
これに対する私の解釈は、1024の作業で512MBpsを書いたことです。これは、各書き込み=512/1024=512Kを意味する。
同じことを計算する別の方法は、avgrq-sz列に1024個のセクタが表示されることです。このSamsung 850 Pro SSDによると、gdisk
セクタサイズは512Bなので、各書き込みは1024セクタ* 512B = 512Kです。
私の質問は、なぜ指定された128Kブロックの代わりに512Kブロックを書くのですかdd
?代わりに4Mブロックを書くと、dd
iostatの結果はまったく同じです。数字を組み合わせることも私にとって意味がありません。
これはブロックデバイスに直接書き込むことです。ただし、XFSでフォーマットしてファイルシステムに書き込む場合、数値はゼロマージを除いて同じです。
dd if=/dev/zero of=/mnt/ddtest bs=4M count=3000
これで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
sdb 0.00 0.00 0.00 1024.00 0.00 512.00 1024.00 142.31 138.92 0.00 138.92 0.98 100.00
ところで、私はRHEL 7.7を使用しています。
答え1
指定しないと、O_DIRECT
I / O要求はページキャッシュに移動します。この書き込みキャッシュがデバイスに書き換えると、カーネルはできるだけ多くの書き込みを使用します。
(これがマージされた書き込みと見なされるかどうかはわかりません。)
カーネルメモリ管理によって生成される書き込みサイズは、さまざまな変数によって制限できます。
特に:私のIOリクエストサイズが約512Kに制限されているのはなぜですか?
上記のリンクには長い分析が含まれています。ただし、結果として物理RAMが断片化されると、カーネルは物理的に連続した複数のページではなく、使用する個々のページのみを見つけることができます。単一IOのサイズは、分散/収集リストの最大サイズに制限されます。