5

Linux のトップ コマンドのように動作するように、C/C++ でプログラムを作成しようとしています。私はいくつかの調査を行い、プロセスのCPU使用率をカウントする方法をすでに知っています。現在時刻と数秒後の /proc/[PID]/stat から stime + utime を計算することで、CPU 使用率を取得できます。次に、stime + utime の差を計算し、その結果をアップタイムの差で割ると、CPU 使用率が得られます。シングルプロセス/マルチスレッドプロセスではとても簡単です。

問題は、マルチプロセスとして動作する httpd のような場合です。Web サーバーがビジー状態になると、httpd は子プロセスを fork して一連のリクエストを処理します。次に、合計プロセス数を数えます。たとえば、500 とします。これらのプロセスの CPU 使用率を計算したいのですが、それらを要約すると、1 つの httpd CPU 使用率しか表示されません。しかし、上記のようなアルゴリズムを実行すると、数秒後にプロセス数が 500 未満に減少すると、計算が次のようになるため、負の値が得られます (たとえば、乱数を選択して、簡単な説明をしてください):

Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874

上記の例を見ると、Stime + Utime のデルタは、プロセスの数が減少するため、負の値になり、数ミリ秒後に低い値になります。私が知りたいのは、このようなプロセスを計算する他の方法はありますか? ありがとうございました。

4

2 に答える 2

1

各プロセスのデータを個別に保持することをお勧めします。
新しいサンプルがある場合、各プロセスは次の 3 つのカテゴリのいずれかに分類されます。
1. 前と後の両方に存在 - 新しいものから古いものを差し引く。
2. 現在は存在しますが、以前は存在しません。新しい値を使用してください。
3. 以前は存在したが、現在は存在しない - 無視する。サンプル期間の 90% で CPU を使用した可能性があるため、ここで何かが欠けていますが、完璧な精度は必要ありません。

サンプル間により多くのデータを保持し、より複雑なデータ構造を使用する必要がありますが、妥当な結果が得られるはずです。

于 2012-01-11T09:04:22.523 に答える
0

正確な結果が必要な場合、またはプロセスの寿命が短い場合は、プロセスが終了したときのプロセスの使用時間を読み取る必要があります。

少なくとも2つの方法があります。

1)wait4(2)またはwait3(2)関数を使用してプロセスの終了を待機します。これらの関数は、プロセスのutimeとstimeを返します。

2)を読み取るまで、終了したプロセスをゾンビ状態に保ちます/prox/<pid>/stat

于 2012-01-11T12:53:39.923 に答える