特定のファイルのLVMエクステント数を決定する


9

私は現在、仕事以外の宿題の練習に従事しています。私はext4ファイルシステムを論理ボリューム上に置いています。私はさまざまなパフォーマンスチューニング戦略をテストしていますが、このアイデアは思いつきました。pvmoveはエクステントの個別および範囲を移動できるため、特定のファイルを保持している物理エクステント(理論的には、データベースのバッキングファイル、または一般的にアクセスされる大規模なファイル共有)をマッピングして特定の場所に移動する方法はありますかストレージデバイス(たとえば、同じLVMボリュームグループに通常のHDDとSSDドライブがある)?

私は「filefrag」を使用することを考えましたが、エクステント番号が必ずしもシーケンシャルな順序で使用されるかどうかについて100%ではないことに気付きましたファイルが物理的にどのエクステント番号/ボリュームに配置されているかがわかります。

何か案は?

回答:


13

2つの主要な構成要素はhdparm --fibmap fileであり、これはファイルがLV内の物理的にlvs -o +seg_pe_ranges,vg_extent_sizeどこにあるかを示し、LVがデバイス上の物理的にどこにあるかを示します。

残りは数学です。

したがって、たとえば:

# hdparm --fibmap linux-3.8.tar.bz2 

linux-3.8.tar.bz2:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0     288776     298511       9736
     4984832     298520     298623        104
     5038080     298640     298695         56
     5066752     298736     298799         64
     5099520     298824     298895         72
     [...]

なぜこれがそんなに断片化されているのか私にはわかりません-wgetでダウンロードしました。ご覧のように、少なくとも断片化されたファイルについては、なんとかしてこれをスクリプト化しないと頭痛の種になるので、良い例かもしれません。最初のセグメント288776-298511(9736セクター)を取り上げます。512バイトセクターではないため、カウントは間違っています。

まず、このデータが実際に正しいことを確認します。

# dd if=linux-3.8.tar.bz2 bs=512 skip=0 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0506548 s, 98.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

# dd if=/dev/lvm/src bs=512 skip=288776 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.123292 s, 40.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

Wheeee。それは同じなので、適切な場所でLV-srcを読み取っています。ソースLVはどこにありますか?

# lvs -o +seg_pe_ranges,vg_extent_size
  LV          VG   Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert PE Ranges             Ext   

[...]
 src         lvm  -wi-ao---   4.00g                                            /dev/dm-1:5920-6047   32.00m
[...]

今では退屈ですが、このLVは断片化されていません。ここで頭痛はありません。とにかく。

これは、srcが/ dev / dm-1にあり、PE 5920で始まり、PE 6047で終わることを示しています。PEサイズは32 MiBです。

/ dev / dm-1から同じものを直接読み取ることができるかどうかを確認してみましょう。数学的には、これまでに512バイトのブロックサイズを使用していたので、これは少し難解です。ハ!:-D

# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0884709 s, 56.3 MB/s
3858a4cd75b1cf6f52ae2d403b94a685  -

ブーブー。これは私たちが探しているものではありません。何が悪かったのか?ああ!LVMメタデータとがらくたを保存するために、PVの先頭にLVMが占めるオフセットを追加するのを忘れていました。通常、これはMiBアラインメントなので、別のMiBを追加するだけです。

# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776 + 1024*1024/512)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0107592 s, 463 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

そこにあります。


3
いつか彼らはあなたの名誉のために像を建てます。
Bratchley 2013

しかし、1つ、なぜ私のhdparm呼び出しがsegfaultingであるかについての考えはありますか?
Bratchley 2013

実際、ストライクして、私のgoogle-fuを改善する必要があるようです。SSDとLVMに関連する新しいRHELバグです。これは、ファイルがすでにSSDにあることを意味します。ハ
ブラッチリー2013

彼らがこれを修正するまで、LV内のファイルの位置を決定する別のユーティリティはありますか?
Bratchley 2013

あなたはすでにそれを述べました- filefrag。それ以外の場合、他のツールがfibmapまたはfiemapを実行する場合はグーグルします。
frostschutz 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.