web-dev-qa-db-ja.com

ext4lazyinitの進行状況を測定する方法はありますか?

Ext4lazyinit here について質問しました。私が読んで理解したすべてのことから、ファイルシステムのすべてのiノードを作成せずに、hddを使い始めることができます。

知っている、または測定できる唯一の方法は、モニタリングext4lazyinit in iotop。進捗状況をパーセンテージで取得する方法はありますか?

18
shirish

これをチェックしてください パッチ 議論。 lazyinitなしでシステムを初期化できますが、測定することはできません。待つ時間があれば、待ってください。ディスカッションからパッチを試すことができますが、パッチワークによれば、「拒否」の状態になっています。

2

私はext4lazyinitの進行状況を概算する方法を見つけたようです。

TL; DR:以下のScriptを参照してください。

この方法では、パーティションが最初にマウントされてからディスクが切断されていない(またはシステムが再起動されていない)こと、およびパーティションで使用されているのとまったく同じ量のデータがパーティションに書き込まれている(つまり、削除されていない)ことを前提としています。またはファイルの変更)。

ステップ1:fdiskのパーティションサイズ(kiBに変換)を、dfに示されている1Kブロックの数と比較します。 (kiBのパーティションサイズ)から(1Kブロックの数)を引くと、(iノードテーブルのおおよそのサイズ)が得られます。

編集:例、fdisk:

Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device     Start         End     Sectors  Size Type
/dev/sdd1   2048 11720978398 11720976351  5.5T Linux filesystem

df:

Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604  21% /mnt/backup_work

11720976351セクター* 512バイト/セクター/ 1024 = 5860488175.5 kiB(fdiskによると、ほぼ5.5 TiB)。マイナスdfの5813233164は、おおよそのiノードテーブルサイズで47255011.5 kiB(約45 GiB)に相当します。

ステップ2:取得(パーティションに書き込まれた合計KiB):

awk '{ print $3"\t"$10 }' /proc/diskstats

パーティションに適した行を選び、kiBに変換します。

編集:例:

sdb     260040
sdb1    260040
sdd     2530109116
sdd1    2530108940

私の場合、sdd1を使用すると、書き込まれた合計kiB = 2530108940セクター* 512バイト/セクター/ 1024 = 1265054470 kiB(ほぼ1.2 TiB)。

ステップ:ファイルシステムにすでにデータを書き込んだ場合にのみ必要です。 (パーティションに書き込まれたkiBの合計)から(使用されている1Kブロックの数、dfに示されている)を差し引いて(iノードテーブルに書き込まれたkiBの概算)。

編集:例:iノードテーブルに書き込まれるおおよそのkiB = 1265054470(ステップ2から)-1217095176(ステップ1のdf出力を参照)= 47959294 kiB(45.7 GiB)

ステップ4:(inodeテーブルに書き込まれたおおよそのkiB)を(kiBのinodeテーブルのおおよそのサイズ)で除算し、100を掛けて進行状況をパーセントで取得します。

編集:例:おおよその進捗= 47959294/47255011.5 * 100%= 101.5%

スクリプト

または、それを部分的なスクリプトとして記述するには(安全上の理由から、fdiskへの呼び出しをスクリプト化することを拒否します):

let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"

$ 1 = "パーティションの名前"(例:sdd1)、$ 2 = "fdiskに基づくパーティションのセクター"、$ 3 = "末尾にスラッシュのないマウントポイント"で呼び出します。

テスト結果

私は自分の方法を一度だけテストしました。セットアップ:

  • 6 TBパーティション

  • cryptsetupを使用した暗号化

  • -m 0以外のデフォルトのパラメーターで作成されたファイルシステム

  • 279 GiB ext4lazyinitが完了する前にパーティションに書き込まれたファイルの数。

結果:完了時の読み取り値は99.7%:-)

編集:同じディスクで、ほぼ別のTiBのデータを書き込んだ後、推定値は101.5%になります。役に立つほど正確だと思います。

2
theaviatrix