CPU時間測定にwait4とcpuacct cgroupを使用する

CPU時間測定にwait4とcpuacct cgroupを使用する

プロセスを開始し、プロセスが終了する前に必要なCPU時間(ユーザー+システム)を測定したいと思います。

私はwait4、ユーザーとシステム時間を含む構造体を返すシステムコールを使用できることを知っています(私は2時間の合計を使用します)。

私も使えますcpuacctcgroupサブシステム、プロセスを新しいcgroupに入れ、cpuacct.usageファイル(ユーザー時間とシステム時間の組み合わせが含まれています)を読み取ります。

プロセスが子プロセスを作成すると、電子に問題があることがわかります(時々計算されません)。しかし、単一プロセスの場合、2つの測定値はほぼ同じでなければならないと思います。私はcgroupが作成された後にのみプロセスをcgroupに入れることができるので、cpuacct値は少し小さいと予想しました(しかし、フォークの直後にこれを行うので、違いは小さくなければなりません)。

これで、数秒かかるプロセスについて予想される結果が表示されます。

例:

wait4:   8.292518s
cpuacct: 8.299105444s

wait4:   13.788861s
cpuacct: 13.796484557s

wait4:   24.229514s
cpuacct: 24.234132965s

wait4:   84.101255s
cpuacct: 84.104336222s

ただし、時間がかかるプロセスの場合は、他の結果が表示されます。

wait4:   155.309706s
cpuacct: 155.306291274s

wait4:   505.547594s
cpuacct: 505.526723631s

wait4:   897.180069s
cpuacct: 897.131232685s

cpuacct の値は、まったく予期しないレベルにわずかに低くなります。なぜこれが起こるのか知っている人がいますか?

私は0.1秒の精度に興味がなく、より高い違いを経験したことがありません。違いはいつもそんなに小さいと確信していますか?それとも、違いが大きくなる可能性がありますか?

文書には、cpuacctこの値が2つの場合に不正確である可能性があることが示されています。ただし、これらのシナリオのいずれも適用されません。なぜなら、私は64ビットコンピュータを使用していて、プロセスが完了した後に任意の時間を待つことができ、cpuacct.usage読み取られた値は変わりません。古い値)。

正確な設定:
私の起動プロセスはPythonプロセスです。私はsubprocess.Popen()仕事を作り、os.wait4()時間を取るのに慣れています。 cgroupを使用するには、preexec_fncgroupに新しいプロセスを追加する引数を関数に渡します(したがって、これはシステムコール間で行われます)。開始されたプロセスはJava VMです。関連性がないと思いますが、もし備えてこの情報を提供したかったです。Popenforkexec

ベストアンサー1

おすすめ記事