2

Time Unixコマンドに関するこの回答から、時間がどのように機能するかについての基本的なアイデアが得られます。新しいプロセスをフォークし、その新しいプロセスでコマンドを実行します。ただし、理解できない動作に遭遇しました。

DaCapo ベンチマーク スイートのベンチマークであるlusearchのプロファイルを作成しようとしています。さまざまな構成 (スレッド数と反復回数) で起動し、ベンチマーク出力を無視して、時間を使用して実際のユーザー時間とシステム時間を記録したいと考えています。ほとんどの構成で、私のスクリプトは問題なく動作し、ベンチマークを起動して時間を記録します。

1 つの特定の構成 (大規模なデータセット、2 つのスレッド、10 回の反復) では、ベンチマークが終了しないことがあります (約 100 の暫定的なケースのうち 80%)。これは私がそれを起動するために使用しているコマンドです:

(time -p java -jar DaCapo.jar lusearch -s large -t 2 -i 10 
 >/dev/null 2>/dev/null) 2>&1 | awk '{print $2 $4 $6}' > timed &

ただし、時間を前に追加しないと、ベンチマークは 100% の時間で終了します (約 100 の暫定的なものでも):

(java -jar DaCapo.jar lusearch -s large -t 2 -i 10 >/dev/null 2>/dev/null)

この動作は、このベンチマーク (およびこの構成) でのみ発生しますが、他のベンチマークをプロファイリングするか、別の数のスレッドまたは別の数の反復を使用すると、同じことが起こっていることがわかりません。私の推測では、それはベンチマークに干渉する何かが行われていることに関係していると思います。

fork+exec がベンチマークの動作をどのように変更できるかわかりません。これを引き起こす可能性のある特定のものはありますか?たとえば、ベンチマークも使用したいリソースを使用している時間はありますか? ベンチマークの起動中に何か問題がありますか?

4

1 に答える 1

1

「終了に至らない」というのはかなりあいまいです。すべてを に送信しているため、エラー メッセージを見逃すことになります/dev/null。このプログラムの動作、エラー メッセージ、バックトレースについて何も知らずに明確な答えを出すことは不可能です。

私が考えることができる唯一の実際の違いは、2番目のケースでバックグラウンド化していないことです。/dev/nullパイプとリダイレクトの特定の組み合わせを使用した Bash は、バックグラウンド処理時に暗黙的に stdin にリダイレクトしません。プログラムの一部がそれに敏感である可能性があります。明示的なリダイレクトが必要な例については、私のテストケースを参照してください。ここで Bash は完全に POSIX に従っているわけではなく、非同期リスト、パイプ、およびリダイレクトの特定の組み合わせで、他のすべてのシェルとは異なります。

私はそれが何かと関係があると真剣に疑っていますtime。ここでより良い答えが得られない場合は、help-bash リストに質問してみてください。

于 2012-12-13T23:26:35.693 に答える