ユーザーの合計CPU時間を測定するには、次の「utime」フィールドを使用しました/proc/[pid]/stat
。
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(からヒューマンプロセス(5))
utime
したがって、私の「ユーザーutime」は、このユーザーが実行しているすべてのPIDの合計です。
これにより、このユーザーが費やしたCPU時間(秒)の正確な値を取得できるようになります。私は正しい道を行っていますか?
私が理解していない、または考慮していないいくつかのことがあります。
- 各PIDには親PID(または0)もあります。しかし、私はppidが0のPIDだけでなく、すべてのPIDを計算しています。これは正しいですか?
- utimeに加えて、stime、cuttime、cstimeがあります。私はこれについて心配する必要がありますか? utime は、親プロセスを除く PID の総 CPU 秒数であると仮定します。
以下を使用してシステムの合計CPU時間を/proc/uptime
計算すると、かなりすべてのユーザーを組み合わせたものを得ることができるのと似ていますが、大きな違いがあります。はい(分):
system cpu_time: 96.13
sum of users_cputime: 111.45
正しい:
私はさまざまなことについて「外見上合理的な」価値観を持っています。現在私はutime、stime、cuttime、cstimeの合計を使用しています。報告される値は測定値と密接に関連していますが、理解できませんtime
。
私が正確に間違った方向に行っている場合は、ここに別の質問があります。
- ユーザーあたりの合計CPU時間を監視する最も公平な方法は何ですか?Ubuntuに聞いてください(+ 500賞金)
答え1
ユーザーのCPU時間を記録して追跡する従来の方法は次のとおりです。プロセス会計。 LinuxではインストールしてくださいGNU会計ユーティリティ、一般的に呼ばれるパッケージで提供されますacct
。寿命が非常に短いプロセスで費やされた時間を追跡するのがどれほど正確かはわかりませんが、少なくとも実行されたすべてのプロセスを一覧表示します。
走るlastcomm
すべてのユーザーが実行したすべてのコマンドのリストと各コマンドに費やされた時間を取得します(短いプロセスでは、最大約10ミリ秒に丸められ、多く表示されると予想されます)0.00
。走るsa
さまざまな合計と統計を表示します。具体的には、sa -m
各ユーザーの合計が表示されます。sa
アカウントログ(通常の場所)の最後の循環以降に累積された統計/var/log/account/
。
定期的なサンプリングですべてのプロセスをキャプチャすることはできませんが、それとは距離が離れていることに注意してください。ほぼすべての短期プロセスと長いプロセスの最後の数秒を見逃してしまいます。プロセス会計は、すべての過去のプロセスをリストします。
ユーザー時間は/proc/$pid/stat
、I / Oを実行するのに費やされたシステム時間ではなく、計算を実行するのに費やされた時間です。どちらを計算するかは、情報で何をしたいかによって異なります。
すべてのPIDの統計が正確です。親PIDがこれとどのように関連しているかわかりません。
システムの面で説明が/proc/uptime
間違っているようです。ウィキペディア私が書いたように。最初のフィールドは、システムが起動してから経過した実際の時間から一時停止または休止状態になった時間を引いたものです。 2番目のフィールドは、すべてのCPUでアイドル操作に費やされた累積時間です。これがまさに何を意味するのか分かりません。確かに私のコンピュータの総アイドル時間ではありません。カーネルの値を合計します。存在するuptime_proc_show
更新の変数存在するaccount_idle_time
。