プロセスのきめ細かいメモリロギングにtopを使用すると、そのプロセスが遅くなります。

プロセスのきめ細かいメモリロギングにtopを使用すると、そのプロセスが遅くなります。

私のRコードからメモリ消費の急増を記録しようとしていますが、Rプロファイラのどれもコンパイルされたモジュールのメモリ消費を測定できません。だから私は代わりにtopを使ってきましたが、これだけで私が望む情報を得るのに十分でした。問題は、短いメモリ急増を捉えるために遅延を非常に低く設定する必要があるため、topが実行されるとRプロセスがかなり遅く実行されることです。 topが使用されているメモリを読み取る方法を完全に理解していませんが、この速度低下を防ぐためにtopまたは他のツールを使用する方法はありますか?

私のbashスクリプトは実際には次のようになります。

top -b -d 0.1 -p $1 | awk -v OFS="," -v metavar=$2 '@load "time"; $1+0>0 { printf metavar "%.3f,",gettimeofday(); print $10; fflush() }' >> ./other/bench.csv

コードスニペットのベンチマークが必要なときにRを使用して新しいプロセスを作成し、このスクリプトを実行して後でcsvファイル(複数の関連ベンチマークを含む)を分割できるようにRのPIDといくつかの追加情報を渡します。 。その後、ベンチマーク中のコードの実行が完了すると、Rは最上位の実行プロセスを終了します。

編集:この記事を投稿して10分後、私はスクリプトの別の部分(awkとデータをファイルに出力)を速度低下の原因として除外しようとしたことがないことに気づきました。出力をnullにリダイレクトまたは削除した場合

>> ./other/bench.csv

すると減速が消えます。これで質問は、速度を遅くせずにこのデータを保存する方法に移されたようです。

ベストアンサー1

私の質問に対するSotto Voceのコメント応答(Rがディスク使用量に敏感である可能性があることを示唆しています)に触発され、tmpfs(メモリ内)を使用して保存されたcsvファイルにログ情報を出力しようとしましたが、速度の低下が完全に消えた。これは、ベンチマークを実行するときにRがファイルシステムを使用しようとしていることを示します。私のコードのどれもファイルに明示的にアクセスしていないため、予期しなかった結果です。これで、テストデータを構築するために使用するライブラリの1つは、RAMの使用量を減らすための方法でデータを保存するためにディスクストレージを使用していると思われます(これはファイルからデータを明示的にロードするための文書化された機能ですが、明らかに、コード内でデータが動的に生成される場合は、よく文書化されていません。

簡単に言えば、bashスクリプトのtop、awk、またはその他の項目に問題はありません。ディスクアクセスに対する予期しない競合。

おすすめ記事