すべてのPID「utime」の合計は、システムの合計utimeですか?


9

ユーザーの合計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.

man proc(5)から

したがって、私の「ユーザーutime」は、utimeこのユーザーが実行しているすべてのPIDの合計です。

これにより、このユーザーが費やしたCPU秒数の正確な値が得られることを期待しています。私は正しい軌道に乗っていますか?

私がまだ理解していない、または考慮していないことのいくつか:

  • 各PIDには、親PID(またはゼロ)もあります。しかし、私は0のppidを持つものだけでなく、すべてのPIDをカウントしています。これは正しいですか?
  • utime、stime、cutime、cstimeに加えて、それらについて心配する必要がありますか?私は、utimeがPIDのCPU秒の合計数であり、親を数えないと仮定しています。

を使用してシステムの合計CPU時間を計算すると/proc/uptime、この値はすべてのユーザーの合計にかなり近くなりますが、その差は大きくなります。たとえば(分単位):

system cpu_time:         96.13
sum of users_cputime:   111.45

補正:

私はあらゆる種類のものについて「賢明に見える」値を得ます。現時点では、utime、stime、cutime、cstimeの合計を使用しています。そして、私はそれらを理解していませんが、からの測定値と非常によく相関する値を報告しますtime

私が完全に間違った軌道に乗っている場合、別の質問があります:


/proc/cputimeCPUがプロセスを実行するのに費やした時間についての情報はないので、「システムのcpu_time」の計算が何であるかがわかりません。2番目の数値で何かをしている場合、それはアイドルタスクによって費やされた時間です。それが実際に何を意味するのか正確にはわかりません。
Gilles 'SO-悪をやめる'

1
「ユーザー時間」には、すべてのデッドプロセスからのutime値も追加する必要があります。それらをどのように考慮しますか?
Gilles 'SO-悪をやめる'

んー 私が「システムCPU時間」と呼ぶのは、/ proc / uptimeの最初の値、「システム秒」にすぎません。カーネルスレッドもカウントするため、これは高すぎると思いましたが、ご覧のとおり、すべての "utime"値の合計は、/ proc / utimeからのシステム時間よりもまだ高くなっています。私の知る限り、あなたのリンクはその理由を説明しています。はっきりさせておきますが、私はその数には本当に興味がありません。「ユーザーあたりのCPU時間」に興味があります。
ステファノパラッツォ

2番目のコメントについて:当面は、これを定期的に(たとえば、毎秒)測定することを計画していました。これにより、短期間のプロセスは無視されます。
ステファノパラッツォ

したがって、システムのCPU時間の計算は($ 1- $ 2 / $ number_of_cups)です。ここで、$ 1と$ 2は/proc/uptime?次に、アイドルタスクに起因するI / Oが違いを説明していると思います。私はトピックについて何も知らないので、私は何か大きなことを見逃していると思います:特にユーザーのcputimeの合計が多くの短い欠落している可能性があることを考えると、アイドルタスクでそれほど多くのことが起こるとは思いません生きているプロセス。
Gilles 'SO-悪をやめる'

回答:


3

ユーザーのCPU時間をログに記録して追跡する従来の方法は、プロセスアカウンティングです。Linuxでは、GNUアカウンティングユーティリティをインストールします。これは通常、というパッケージで提供されますacct。非常に短期間のプロセスで費やされた時間を追跡するのにどれほど正確かはわかりませんが、少なくとも、これまでに実行されたすべてのプロセスがリストされます。

実行lastcommして、任意のユーザーが実行したすべてのコマンドとそれぞれに費やされた時間のリストを取得します(有効期間が短いプロセスの場合は〜10msに丸められ、多くのが表示されると予想されます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


非常に長時間実行されるプロセスはどうですか?いsaてのCPU時間を報告する前に終了するプロセスのために待機を?
ステファノパラッツォ

@StefanoPalazzoはい、会計データはプロセスが停止したときに書き込まれます。また、私が知る限り、システムクラッシュ後に実行されていたプロセスのデータは取得できません。
Gilles 'SO-悪をやめる'

これは問題です。長時間実行されるプロセスが多数あるため、使用できないことを意味します。
ステファノパラッツォ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.