web-dev-qa-db-ja.com

LVM、デバイスマッパー、ソフトウェアRAIDおよびブロックデバイスの先読み設定-何が勝ちますか?

私はこれについてまっすぐな答えを見つけようとしてきました、そしてそれはとらえどころのないことが証明されました。これは questionits 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で、ブロックデバイスよりはるかに高くなっています。だから、ここでいくつかの質問:

  • RA設定はどのようにして仮想ブロックデバイスチェーンに渡されますか?
  • Dm-0は、実際にアクセスしている最上位のブロックデバイスであるため、すべて切り捨てますか?
  • lvchange -rはdm-0デバイスに影響し、ここには表示されませんか?

それが単純な場合、使用している仮想ブロックデバイスからのRA設定が渡されます。それは、dm-0(またはmd0)からの読み取りが4 x 4096 RA読み取りに変換されることを意味しますか? (各ブロックデバイスに1つ)。もしそうなら、それはこれらの設定が上記のシナリオで先読みのサイズを爆発させることを意味します。

次に、先読み設定が実際に何をしているのかを理解するという意味で:

仮想デバイスの実際の先読み値を決定するために、上記のセクターサイズに相当する何を使用しますか。

  • RAIDのストライプサイズ(md0用)?
  • 他のいくつかのセクターサイズは同等ですか?
  • それは構成可能ですか?
  • FSが役割を果たす(私は主にext4とXFSに興味がある))?
  • または、単に渡された場合は、最上位デバイスのRA設定に実際のブロックデバイスのセクターサイズを掛けただけですか?

最後に、(たとえば)ストライプサイズとRA設定の間に好ましい関係はありますか?ここで私は、ストライプがRAIDデバイスから引き出される最小の要素である場合、理想的には、その最小データ単位にサービスを提供するために2つのディスクアクセスを必要とせず、RAを作成したいと考えています。 1回のアクセスで要求を満たすのに十分な大きさ。

26
Adam C

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

11
wojciechz

答えを理解するのは難しいので、例で説明します。このために、3つのブロックデバイスがあり、標準セクターを想定してRAを4(4 * 512バイト)に設定するとします。 3つのディスクを使用してRAID-5スキームを使用するとしたら、一意のディスクのストライプに触れた読み取りでも、最初にブロックデバイスRAに設定した係数によってRAが複合されます。したがって、読み取りが3つのディスクすべてにまたがる場合、有効なRAは12 * 512バイトになります。これは、MDやLVMなどのさまざまなレベルでRAを設定することで悪化します。経験則として、私のアプリがRAの恩恵を受ける場合は、可能な限り最高のレイヤーに設定するため、不必要にRAを合成しないようにします。次に、セクター2049でファイルシステムを開始し、8で割り切れる数値で各セクターの開始をオフセットします。

4
Bill Clark

それは説明のためです。私はあなたが正しいことを証明するためにRAIDとLVMのセットアップでいくつかのテストを行いました:

https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices

重要なのは、OSが使用しているものです

0
victorgp