プロセスを開始し、プロセスが終了する前に必要なCPU時間(ユーザー+システム)を測定したいと思います。
私はwait4
、ユーザーとシステム時間を含む構造体を返すシステムコールを使用できることを知っています(私は2時間の合計を使用します)。
私も使えますcpuacct
cgroupサブシステム、プロセスを新しい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_fn
cgroupに新しいプロセスを追加する引数を関数に渡します(したがって、これはシステムコール間で行われます)。開始されたプロセスはJava VMです。関連性がないと思いますが、もし備えてこの情報を提供したかったです。Popen
fork
exec