CPUを実行していないとき、grepは何をしますか?


19

で一致するものを探すgrepと、その後の検索にかかる時間が最初の検索よりもはるかに短いことに気づくことがよくあります(例:25秒対2秒)。明らかに、それは最後の実行からのデータ構造を再利用することによるものではありません-それらは割り当て解除されるべきでした。でtimeコマンドを実行するとgrep、興味深い現象に気付きました。

real    24m36.561s
user    1m20.080s
sys     0m7.230s

残りの時間はどこに行くのですか?毎回高速に実行するためにできることはありますか?(たとえば、ファイルをgrep検索する前に、別のプロセスにファイルを読み取らせます。)

回答:


34

かなり頻繁にページキャッシュに関連しています

最初に、データをディスクから(物理的に)読み取る必要があります。

2回目(ファイルが大きすぎない場合)は、ページキャッシュにある可能性があります。

したがって、最初にcat(1)のようなコマンドを発行して(大きすぎない)ファイルをページキャッシュ(つまりRAM)に入れ、次に2番目のgrep(1)(またはファイルを読み取るプログラム)が一般に高速に実行できます。

(ただし、データはいつでもディスクから読み取る必要があります)

(実質的にまれアプリケーション・プログラムで、時には役に立つが、)も参照先読み(2) posix_fadvise(2)と、おそらくのmadvise(2) シンク(2) はfsync(2) ...など

LinuxAteMyRAM読んでください

ところで、これが、プログラムをベンチマークするとき、それを数回実行することが推奨される理由です。また、これが、RAMを追加購入するのに役立つ可能性がある理由です(データにすべてを使用してプログラムを実行しない場合でも)。

もっと理解したいなら、オペレーティングシステムのような本を読んでください:Three Easy Pieces


12
したがって、TL;DR答えは「[ブロック待機中] I / O」です。
mgarciaisaia

10
@PaulDraper本当に:)ないcat+はgrepまだよりも時間がかかるとしているgrepだけで。
-chepner

3
@chepnerマルチスレッドができcatて、何か他のことをしている最中に安価なプリフェッチとして使用できる場合を除きgrep、関心のある準備をします。
hBy2Py


3
@ G-Man:2つのcatsをtac同じ効果とより高いRAM使用量で置き換えることもできます:Dまたはtacのすべての猫
Mark K Cowan

-1

ネットワークストレージ環境では、サーバーとは別の「ファイラー」にあるファイルに最初にアクセスするときに、比較的大幅な遅延が発生する可能性もあります。そのファイルがサーバー上でアクセスされると、ローカルにキャッシュされ、その後のデータへのアクセスははるかに高速になります。

これは、grepではなく、ファイルデータのチェックサムを計算するだけの実験です。最初の呼び出しは遅く、その後の呼び出しは高速です。

> du -Dh file_348m
348M    file_348m

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.60user 0.15system 0:03.02elapsed 25%CPU (0avgtext+0avgdata 1524maxresident)k
708144inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.67user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.65user 0.07system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.66user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

私はそれらを解釈する方法がわからないので、下票に対するコメントを歓迎します。私の答えの説明は正しいと思います。おそらく、コマンドの例は明確ではありませんか?または、grepコマンドのベンチマークを実行しなかったことが気に入らないでしょうか?(私のポイントを説明するために、意図的に単純なコマンドmd5sumを使用しました。)
ウィンストンスミス

1
その理由は、あなたの投稿は私が求めていたものに関連する新しい情報を追加しなかったからだと思います。私はすでに遅れがあることを知っていました、そして、最初の答えはすでにそれが起こっている理由の説明をすでに与えました。しかし、ええ、私も説明なしで下票を得ます。良い答えのある質問でも。
アレックス

理由を提案してくれた@Alexに感謝します。最初の回答で説明した、ローカルストレージからメモリにデータを移動するオーバーヘッド時間と、ネットワークストレージからローカルサーバーにデータを移動するオーバーヘッド時間を区別しようとしました。これをより明確に説明できるか、より良いコマンド例を提供できると思います。
ウィンストンスミス

私の考えでは、あなたの投稿を読んだ後でも、データが保存されている場所からメモリに移動するオーバーヘッドです。ネットワークストレージからであろうと、ローカルストレージからであろうと、問題ではありません。UNIXは、まだディレクトリからメモリに移動しているように見えます。ps--私の説明は正しいようです-理由を付けた私のコメントは賛成です。
アレックス

私は、あなたが探していたものにとって重要ではない区別を追加していました。OK。ところで、私はあなたのコメントを支持したので、それは支持の理由の問題を解決しません。:
ウィンストンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.