Как получить общее использование процессора в Linux с помощью C ++ - PullRequest
36 голосов
/ 10 июня 2010

Я пытаюсь получить общее использование процессора в%.Во-первых, я должен начать с того, что «top» просто не подойдет, так как между дампами cpu есть задержка, для этого требуется 2 дампа и несколько секунд, что приводит к зависанию моей программы (я не хочу давать ей собственный поток)

Следующая вещь, которую я попробовал, это "ps", которая является мгновенной, но всегда дает очень большое число (20+), и когда я действительно заставлял свой процессор делать что-то, он оставался на уровне 20 ...

Есть ли другой способ получить общее использование процессора?Не имеет значения, если это более одной секунды или более длительные периоды времени ... Хотя более длительные периоды были бы более полезными.

Ответы [ 6 ]

79 голосов
/ 10 июня 2010

cat / proc / stat

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

Я согласен с этим ответом выше. Строка ЦП в этом файле показывает общее количество «потрясений», которые ваша система потратила на различные типы обработки.

Что вам нужно сделать, это взять 2 чтения этого файла, разделенных на любой интервал времени, который вам требуется. Числа увеличивают значения (в зависимости от целочисленного опрокидывания), поэтому для получения% cpu вам нужно рассчитать, сколько jiffies прошло за ваш интервал, по сравнению с тем, сколько jiffies было потрачено на работу.

например. Предположим, в 14:00:00 у вас есть

процессор 4698 591 262 8953 916 449 531

total_jiffies_1 = (сумма всех значений) = 16400

work_jiffies_1 = (сумма user, nice, system = первые 3 значения) = 5551

и в 14:00:05 у вас

процессор 4739 591 289 9961 936 449 541

total_jiffies_2 = 17506

work_jiffies_2 = 5619

Таким образом, процент использования процессора за этот период:

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%

Надеюсь, это немного поможет.

6 голосов
/ 10 июня 2010

Прочитайте /proc/cpuinfo, чтобы узнать количество процессоров / ядер, доступных для систем.Вызовите getloadavg() (или, альтернативно, прочитайте /proc/loadavg), возьмите первое значение, умножьте его на 100 (для преобразования в проценты), разделите на количество процессоров / ядер.Если значение больше 100, обрежьте его до 100. Готово.

Соответствующая документация: man getloadavg и man 5 proc

NB Средняя загрузка, обычная для * NIX систем, может быть большечем 100% (на процессор / ядро), поскольку фактически измеряет количество процессов, готовых к запуску планировщиком.С Windows-подобной метрикой ЦП, когда нагрузка составляет 100%, вы на самом деле не знаете, является ли это оптимальным использованием ресурсов ЦП или система перегружена.В * NIX оптимальное использование загрузки процессора даст вам значение ~ 1,0 (или 2,0 для двойной системы).Если значение намного превышает число процессоров / ядер, возможно, вы захотите подключить дополнительные процессоры к коробке.

В противном случае копайте файловую систему /proc.

6 голосов
/ 10 июня 2010

Попробуйте прочитать /proc/loadavg.Первые три числа - это количество фактически запущенных процессов (т. Е. Использующих ЦП), усредненных за последние 1, 5 и 15 минут соответственно.

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

1 голос
/ 10 июня 2010

кошка / прок / стат

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

0 голосов
/ 18 апреля 2018

cpu-stat - это проект C ++, который позволяет считывать счетчик ЦП Linux из / proc / stat.

Получить файлы CPUData. * И CPUSnaphot. * Из каталога spc cpu-stat..

Быстрое внедрение, чтобы получить общее использование процессора:

#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 голосов
/ 10 июня 2010

Я предлагаю два файла для запуска ...

/ proc / stat и /proc/cpuinfo.

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

...