私はこれについてまっすぐな答えを見つけようとしてきました、そしてそれはとらえどころのないことが証明されました。これは question と its answer は近いですが、希望する詳細は実際には得られません。私が知っていると思うことから始めましょう。
標準のブロックデバイスがあり、Sudo blockdev --report
を実行すると、次のようになります。
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 500107862016 /dev/sda
rw 256 512 4096 2048 399999238144 /dev/sda1
rw 256 512 1024 781252606 1024 /dev/sda2
ここで、任意のパーティションで--setra
を使用して、デフォルトの256から128に変更することを決定しました。これは、次のようにブロックデバイス全体で発生します。
Sudo blockdev --setra 128 /dev/sda1
Sudo blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 128 512 4096 0 500107862016 /dev/sda
rw 128 512 4096 2048 399999238144 /dev/sda1
rw 128 512 1024 781252606 1024 /dev/sda2
これは私には完全に理にかなっています。ブロックレベルのデバイスは、パーティションではなく設定があるため、すべて変更されます。また、RA設定とデバイスのデフォルトの関係は私には意味があります。
RA * sector size (default = 512 bytes)
したがって、デフォルトのセクターサイズで上記の変更を行うと、先読みが128kから64kに減少します。これまでのところ、すべて順調です。
しかし、ソフトウェアRAID、またはLVMとデバイスマッパーを追加するとどうなりますか?レポートが次のようになっているとします。
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 10737418240 /dev/xvda1
rw 256 512 4096 0 901875499008 /dev/xvdb
rw 256 512 4096 0 108447924224 /dev/xvdj
rw 256 512 4096 0 108447924224 /dev/xvdi
rw 256 512 4096 0 108447924224 /dev/xvdh
rw 256 512 4096 0 108447924224 /dev/xvdg
rw 4096 512 4096 0 433787502592 /dev/md0
rw 4096 512 512 0 429496729600 /dev/dm-0
この場合、mdadmによって作成されたmd0の上に、デバイスにマッピングされたdm-0 LVMデバイスがあります。これは、実際には4つのデバイスxvdg-jにまたがるRAID0ストライプです。
Md0とdm-0の両方のRAの設定は4096で、ブロックデバイスよりはるかに高くなっています。だから、ここでいくつかの質問:
lvchange -r
はdm-0デバイスに影響し、ここには表示されませんか?それが単純な場合、使用している仮想ブロックデバイスからのRA設定が渡されます。それは、dm-0(またはmd0)からの読み取りが4 x 4096 RA読み取りに変換されることを意味しますか? (各ブロックデバイスに1つ)。もしそうなら、それはこれらの設定が上記のシナリオで先読みのサイズを爆発させることを意味します。
次に、先読み設定が実際に何をしているのかを理解するという意味で:
仮想デバイスの実際の先読み値を決定するために、上記のセクターサイズに相当する何を使用しますか。
最後に、(たとえば)ストライプサイズとRA設定の間に好ましい関係はありますか?ここで私は、ストライプがRAIDデバイスから引き出される最小の要素である場合、理想的には、その最小データ単位にサービスを提供するために2つのディスクアクセスを必要とせず、RAを作成したいと考えています。 1回のアクセスで要求を満たすのに十分な大きさ。
RA設定はどのようにして仮想ブロックデバイスチェーンに渡されますか?
場合によります。 Xen domUの内部にいて、RA = 256であるとします。/dev/xvda1は、/ dev/dm1の下に表示されるdom0上の実際のLVです。したがって、RA(domU(/ dev/xvda1))= 256およびRA(dom0(/ dev/dm1))= 512になります。 dom0カーネルがdomUのカーネルとは別のRAで/ dev/dm1にアクセスするような効果があります。そのような単純な。
/ dev/md0(/ dev/sda1、/ dev/sda2)を想定すると、別の状況が発生します。
blockdev --report | grep sda
rw **512** 512 4096 0 1500301910016 /dev/sda
rw **512** 512 4096 2048 1072693248 /dev/sda1
rw **512** 512 4096 2097152 1499227750400 /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw **256** 512 4096 0 1500301910016 /dev/sda
rw **256** 512 4096 2048 1072693248 /dev/sda1
rw **256** 512 4096 2097152 1499227750400 /dev/sda2
/ dev/md0 RAを設定しても、/ dev/sdXブロックデバイスには影響しません。
rw **256** 512 4096 2048 1072693248 /dev/sda1
rw **256** 512 4096 2097152 1499227750400 /dev/sda2
rw **512** 512 4096 0 1072627712 /dev/md0
そのため、一般的に、私の意見では、カーネルは実際に設定されている方法でブロックデバイスにアクセスします。 1つの論理ボリュームは、RAID(またはその一部)またはdevicemapperデバイスを介してアクセスでき、それぞれが尊重される別のRAを使用します。
だから答えは-RA設定はブロックデバイスチェーンに渡されないIMHOですが、最上位デバイスのRA設定が何であれ、構成デバイスへのアクセスに使用されます
Dm-0は、実際にアクセスしている最上位のブロックデバイスであるため、すべて切り捨てますか?
「トランプオール」による深い伝播を意味する場合-以前のコメントのとおり、システム内のデバイスごとに異なるRAがある可能性があると思います。
Lvchange -rはdm-0デバイスに影響し、ここには表示されませんか?
はい、しかしこれは特別なケースです。 LVMの/ dev/vg0/blockdeviceである/ dev/dm0があるとします。もし、するなら:
lvchange -r 512 /dev/vg0/blockdevice
/ dev/dm0と/ dev/vg0/blockdeviceはカーネルアクセスに関してはまったく同じブロックデバイスであるため、/ dev/dm0も変更されます。
しかし、/ dev/vg0/blockdeviceが、それを利用しているXen domUの/ dev/dm0および/ dev/xvda1と同じであると仮定しましょう。/dev/xvda1のRAを設定すると有効になりますが、dom0はまだ独自のRAを持っていることがわかります。
仮想デバイスの実際の先読み値を決定するために、上記のセクターサイズに相当する何を使用しますか。
私は通常、さまざまな値を実験してhdparmでテストすることにより、RAを発見します。
RAIDのストライプサイズ(md0用)?
同上。
FSが役割を果たす(私は主にext4とXFSに興味がある))?
確かに-これは非常に大きなトピックです。ここから始めることをお勧めします http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php
答えを理解するのは難しいので、例で説明します。このために、3つのブロックデバイスがあり、標準セクターを想定してRAを4(4 * 512バイト)に設定するとします。 3つのディスクを使用してRAID-5スキームを使用するとしたら、一意のディスクのストライプに触れた読み取りでも、最初にブロックデバイスRAに設定した係数によってRAが複合されます。したがって、読み取りが3つのディスクすべてにまたがる場合、有効なRAは12 * 512バイトになります。これは、MDやLVMなどのさまざまなレベルでRAを設定することで悪化します。経験則として、私のアプリがRAの恩恵を受ける場合は、可能な限り最高のレイヤーに設定するため、不必要にRAを合成しないようにします。次に、セクター2049でファイルシステムを開始し、8で割り切れる数値で各セクターの開始をオフセットします。
それは説明のためです。私はあなたが正しいことを証明するためにRAIDとLVMのセットアップでいくつかのテストを行いました:
重要なのは、OSが使用しているものです