web-dev-qa-db-ja.com

`sync`操作の進行状況を監視できますか?

Linuxシステムに非同期でマウントされたUSBディスクに大きなファイルをコピーしました。これはコマンドプロンプトに比較的迅速に戻りますが、syncと入力すると、もちろん、すべてディスクに移動する必要があり、これには長い時間がかかります。

遅くなることは理解していますが、カウンターがゼロになるところをどこかで見られますか? bufferstopを見ても役に立ちません。

110
mattdm

見つめている /proc/meminfoは、すべてのデータがスプールされるにつれて、Dirtyの数が時間とともに縮小することを示します。一部はWritebackにも流出します。これはすべてのデバイスに対する要約になりますが、システム上の1つのデバイスが他のデバイスよりもはるかに遅い場合、通常、そのキュー内のすべてがそれに関連していることになります。開始するとDirtyの数値が大きくなり、syncが0に近づくのとほぼ同時に終了します。これを試して、インタラクティブな表示を取得します。

watch -d grep -e Dirty: -e Writeback: /proc/meminfo

通常のディスクでは通常Writebackを無視できますが、それがUSB転送パスに頻繁に関与しているかどうかはわかりません。それが明確な傾向なしに上下に跳ねるだけの場合は、おそらくDirtyの数値だけを見ることができます。

178
Greg Smith

/sys/block/<device>/stat同期中の適切なデバイスのファイル。 9番目 列には、デバイスでの処理中のリクエストの数が表示されます。同期が完了すると、リクエストはゼロになります。
これをバイト数に変換する方法がわからない場合でも、未処理の「もの」がどれだけ残っているかを大まかに把握できるはずです。

詳細については、カーネルのドキュメントの stat.txt ファイルを参照してください。 (私のシステムのそのディレクトリにはinflightファイルもあります。このファイルには、読み取りおよび書き込みの処理中のリクエストが含まれている可能性がありますが、そのドキュメントは見つかりません。)

24
Mat

Gregの回答を使用することで、メモリ内のDirtyブロックの状態を表示しながら、syncをバックグラウンドで実行できます。

これを実現するには、次のコマンドを実行します。

sync & watch -n 1 grep -e Dirty: /proc/meminfo

これは、前でsyncを実行しているときに、バックグラウンドでwatchを呼び出します。 syncコマンドが完了すると(Dirtyブロックのサイズが0に近づくと)、次のような出力が得られます。

1]  + 27260 done        sync

これは、コマンドが終了し、watchコマンドを Ctrl+C

12
jflemieux