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


26

私はこれについての真っ直ぐな答えを見つけようとしてきましたが、とらえどころのないことが証明されました。この質問その答えは近いですが、私が望む詳細を本当に教えてくれません。私が知っていると思うことから始めましょう。

標準のブロックデバイスを使用して実行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 -rDM-0のデバイスに影響を与えるし、ここに表示されていませんか?

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

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

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

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

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


どのLinuxディストリビューションを使用していますか?ハードウェアまたはソフトウェアRAIDを使用していますか?ソフトウェアのようです。ハードウェアの場合、使用しているカード/チップセットの多くは、デバイスのファームウェアに設定および保存されます。
ジェイソンハントリー

また、RA設定はファイルシステムの割り当てスキームに大きく依存します。ext4を使用していますか?
ジェイソンハントリー

私は実際に質問でそれがソフトウェアRAIDとLVMであることを言及しているので、はい-ソフトウェア。ファイルシステムの観点では、私はここにXFSとext4の違いに興味がある、のいずれかについての答えは次のようになり良いけれども
アダム・C

XFSは、パフォーマンスを向上させるために大幅に調整できます。これについては、このサイトのいくつかの場所で説明しています。ここここ ...どのLinuxディストリビューションを使用していますか?ディストリビューション固有のツールも利用できるため、これが要因となります。
ewwhite

これは、パフォーマンスの問題ではありません、それはより具体的だ-私はちょうどRAの設定について知りたいと、彼らはLVM /ソフトウェアRAID層で通過/相互作用の変換方法
アダム・C

回答:


11

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 blockdevicesには影響しません。

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設定はブロックデバイスチェーンに渡されない私見ですが、最上位のデバイス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


これは私が探しているものと私が疑っているものに非常に近いです-あなたは私のために1つのことをクリアすることができます:/ dev / md0(/ dev / sda1、/ dev / sda2)状況で私はあなたが設定できることを知っていますRAの値を分離しますが、/ dev / md0に/ dataをマウントしてファイルを読み取る場合、512 RAは/ dev / sda1および/ dev / sda2からの読み取りに使用されますか(つまり、両方に512が使用されます)またはそれぞれに256が使用されていますか?かつての場合は、RAID0にRAが設定されていることが賢明と思われる:SUM(RAID0内のデバイスのRA)
アダム・C

1
私の経験から言うと、/ dev / sdXディスクを使用して/ dev / md0にRA = 512を設定すると、たとえばRA = 256を使用できるにもかかわらず、RA = 512で/ dev / sdXにアクセスした場合とまったく同じ動作をします一番下のブロックデバイスの設定。この場合、256設定は無視されます(/ dev / sdaは、/ dev / md0の一部である場合、ブロックデバイスとしては使用できません)。私はカーネルプログラマーではありませんが、これは論理的に思え、私の練習で確認されたようです。安心して。/ dev / md0、RA = 512から読み取る3スレッドは、RA = 512で/ dev / sd {a、b、c}から読み取る3スレッドに相当します。
wojciechz

まことにありがとうございます!答えを明確にするために、少し編集しました。承諾する前にもう1つ質問することはできますか?hdparmを使用してRAをテストする例(またはリンク)がありますか?私は自分自身に似たようなことをしようとしていたので、良いリファレンスがあれば時間を節約できます。
アダムC

複雑ではありませんが、確認する内容によって異なります。hdparmのマニュアルを参照してください。ディスクの読み取り(readaheadの派生物)を確認する場合は、hdparm -t / dev / md0などのコマンドを発行できます。結果は、バッファリングされたディスク読み取りのタイミングのようなものを示します:3.02秒で310 MB = 102.79 MB /秒。通常、最後の値はRA設定の影響を強く受けます。
wojciechz

1
ああ、そうではない直接測定-理解、今受け入れ-助けてくれてありがとう:)
アダムC

4

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


だから、あなたはRA設定がトップレベルのデバイスにあるものは何でも、それは単に伝えられるだろうと言っています。したがって、LVM-> 2 x RAID-> 4 x物理ディスクを使用し、RAが4であった場合、8つの物理デバイスがあるため、実効RAは32になります。 RAIDのチャンク/ストライプサイズがそのシナリオで効率的である-2回アクセスする必要がないように、RAがストライプ全体をカバーすることを想定していますか?
アダムC

ところで、私がこれを正しく理解している場合、私が説明するシナリオでは、RAID0のチャンク/ストライプをXに設定したいと思います(X = RA * 512バイト)。したがって、64kのチャンク/ストライプ(mdadmのデフォルト)がある場合、使用すべき最小RAは128です。これは、ストライプ全体を1回で取得できるためです。
アダムC

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.