Как получить общее использование процессора в Linux с помощью C++
Я пытаюсь получить общее использование процессора в%. Во-первых, я должен начать с того, что "top" просто не подойдет, так как между дампами cpu есть задержка, для этого требуется 2 дампа и несколько секунд, что приводит к зависанию моей программы (я не хочу давать ей собственный поток)
Следующее, что я попробовал, это "ps", который мгновенный, но всегда дает очень большое число (20+), и когда я действительно заставил свой процессор делать что-то, он остался на уровне около 20...
Есть ли другой способ, которым я мог бы получить полное использование процессора? Неважно, если это более одной секунды или более длительные периоды времени... Хотя более длительные периоды были бы более полезными.
7 ответов
cat / proc / stat
Я согласен с этим ответом выше. Строка ЦП в этом файле показывает общее количество "потрясений", которые ваша система потратила на различные типы обработки.
Что вам нужно сделать, это взять 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%
Надеюсь, это немного поможет.
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
Попробуйте прочитать /proc/loadavg
, Первые три числа - это количество фактически запущенных процессов (т. Е. Использующих ЦП), усредненных за последние 1, 5 и 15 минут соответственно.
Читать /proc/cpuinfo
чтобы найти количество процессоров / ядер, доступных для систем. Позвоните getloadavg()
(или альтернативно прочитайте /proc/loadavg
), возьмите первое значение, умножьте его на 100 (для пересчета в проценты), разделите на количество процессоров / ядер. Если значение больше 100, обрежьте его до 100. Готово.
Соответствующая документация: man getloadavg
а также man 5 proc
NB Средняя загрузка, обычная для систем *NIX, может превышать 100% (на процессор / ядро), поскольку она фактически измеряет количество процессов, готовых к запуску планировщиком. В метрике ЦП, подобной Windows, когда нагрузка составляет 100%, вы на самом деле не знаете, является ли это оптимальным использованием ресурсов ЦП или система перегружена. В *NIX оптимальное использование CPU loadavg даст вам значение ~1.0 (или 2.0 для двойной системы). Если значение намного больше, чем число процессоров / ядер, вы можете подключить дополнительные процессоры к коробке.
В противном случае, копать /proc
файловая система.
взгляните на эту C++ Lib.
Информация берется из /proc/stat. он также анализирует использование памяти из /proc/meminfo и загрузку Ethernet из /proc/net/dev.
----------------------------------------------
current CPULoad:5.09119
average CPULoad 10.0671
Max CPULoad 10.0822
Min CPULoad 1.74111
CPU: : Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
----------------------------------------------
network load: wlp0s20f3 : 1.9kBit/s : 920Bit/s : 1.0kBit/s : RX Bytes Startup: 15.8mByte TX Bytes Startup: 833.5mByte
----------------------------------------------
memory load: 28.4% maxmemory: 16133792 Kb used: 4581564 Kb Memload of this Process 170408 KB
----------------------------------------------
cat / proc / stat
Я предлагаю два файла для запуска...
/ proc / stat и / proc / cpuinfo.
http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt