web-dev-qa-db-ja.com

C ++を使用してLinuxでCPUの合計使用量を取得する方法

CPUの合計使用量を%で取得しようとしています。最初に、CPUダンプの間に遅延があるため、「top」は単に実行しないと言って開始する必要があります。2回のダンプと数秒を必要とし、プログラムをハングさせます(独自のスレッドを与えたくない)

次に試したのは「ps」です。これは瞬時ですが、常に合計で非常に高い数(20+)を与え、実際にCPUを使用して何かを実行したとき、約20のままでした...

CPUの合計使用量を取得できる他の方法はありますか? 1秒以上かどうかは関係ありませんが、長い方が便利です。

36
David Polák

猫/ proc/stat

http://www.linuxhowtos.org/System/procstat.htm

上記のこの答えに同意します。このファイルのcpu行は、システムがさまざまなタイプの処理に費やした「jiffies」の総数を示します。

必要なことは、このファイルを2回読み取り、必要な時間間隔で区切ることです。数値は増加する値であるため(整数ロールオーバーの対象)、%cpuを取得するには、間隔内で経過したjiffiesの数と、作業に費やしたjiffiesの数を計算する必要があります。

例えば14:00:00にあなたが持っていると仮定します

cPU 4698 591 262 8953 916 449 531

total_jiffies_1 =(すべての値の合計)= 16400

work_jiffies_1 =(ユーザーの合計、Nice、system =最初の3つの値)= 5551

そして14:00:05にあなたが持っています

cPU 4739 591 289 9961 936 449 541

total_jiffies_2 = 17506

work_jiffies_2 = 5619

したがって、この期間の%cpu使用量は次のとおりです。

work_over_period = work_jiffies_2-work_jiffies_1 = 68

total_over_period = total_jiffies_2-total_jiffies_1 = 1106

%cpu = work_over_period/total_over_period * 100 = 6.1%

それが少し役立つことを願っています。

80
Hitobat

/proc/loadavg。最初の3つの数値は、実際に実行されている(つまり、CPUを使用している)プロセスの数であり、それぞれ最後の1、5、および15分間の平均です。

http://www.linuxinsight.com/proc_loadavg.html

6
wdebeaum

_/proc/cpuinfo_を読んで、システムで使用可能なCPU /コアの数を見つけます。 getloadavg()を呼び出し(または代わりに_/proc/loadavg_を読み取り)、最初の値を取得し、100を掛けて(パーセントに変換する)、CPU /コアの数で除算します。値が100より大きい場合は、100に切り捨てます。完了。

関連ドキュメント:_man getloadavg_および_man 5 proc_

N.B.負荷平均は、* NIXシステムでは通常、100%(CPU /コアあたり)を超える場合があります。これは、スケジューラによって実行される準備ができているプロセスの数を実際に測定するためです。 WindowsのようなCPUメトリックスでは、負荷が100%の場合、CPUリソースの最適な使用であるか、システムが過負荷であるかはわかりません。 * NIXの下では、CPU loadavgを最適に使用すると、値〜1.0(またはデュアルシステムでは2.0)が得られます。値がCPU /コアの数よりもはるかに大きい場合、追加のCPUをボックスに接続することができます。

それ以外の場合は、_/proc_ファイルシステムを調べます。

6
Dummy00001
1
Anycorn

cpu-stat は、/ proc/statからLinux CPUカウンターを読み取ることを許可するC++プロジェクトです。

Cpu-statのsrcディレクトリからCPUData。*およびCPUSnaphot。*ファイルを取得します。

CPU全体の使用率を取得するための迅速な実装:

#include "CPUSnapshot.h"

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
  CPUSnapshot previousSnap;
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  CPUSnapshot curSnap;

  const float ACTIVE_TIME = curSnap.GetActiveTimeTotal() - previousSnap.GetActiveTimeTotal();
  const float IDLE_TIME   = curSnap.GetIdleTimeTotal() - previousSnap.GetIdleTimeTotal();
  const float TOTAL_TIME  = ACTIVE_TIME + IDLE_TIME;
  int usage = 100.f * ACTIVE_TIME / TOTAL_TIME;
  std::cout << "total cpu usage: " << usage << std::endl;
}

コンパイルする:

g++ -std=c++11 -o CPUUsage main.cpp CPUSnapshot.cpp CPUData.cpp
0
souch

2つのファイルを開始することをお勧めします...

/ proc/statおよび/ proc/cpuinfo。

http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt

0
Lauro Oliveira