Как получить нагрузку на процессор определенным потоком\процессом в Linux

Как получить нагрузку на процессор определенным потоком\процессом в Linux

21.12.2018 10:07:57 Просмотров 36 Источник

Здравствуйте я пишу на с++. Мне надо узнать на сколько % мой текущий код грузит процессор. Как мне это узнать? Я пытаюсь искать информацию о /proc но пока ничего не нашел

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/923665/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d1%83-%d0%bd%d0%b0-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d1%80-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%bc-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%bc-%d0%b2-linux#comment1525115_923665
Мне это нужно для кода который будет мониторить нагрузку. Тоесть мне надо реализовать свой маленький top который буду в программе смотреть превышает ли нагрузка допустимую меру
https://ru.stackoverflow.com/questions/923665/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d1%83-%d0%bd%d0%b0-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d1%80-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%bc-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%bc-%d0%b2-linux#comment1525133_923665
Разве это будет время конкретного процесса? файл stat вроде как общий вообще единственный разве там может быть конкретный процесс ,а если может то как его узнать?
https://ru.stackoverflow.com/questions/923665/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d1%83-%d0%bd%d0%b0-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d1%80-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%bc-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%bc-%d0%b2-linux#comment1525139_923665
@Fat-Zer Большое спасибо . последний вопрос. может вы знаете какие именно значения в этом файле отвечают за процессорное время. т.к он отличается от обычного /proc/stat который явно писал cpu cpu1 и тд

Ответы - Как получить нагрузку на процессор определенным потоком\процессом в Linux / Как получить нагрузку на процессор определенным потоком\процессом в Linux

Родион Якутович

21.12.2018 10:57:12

https://stackoverflow.com/questions/16726779/how-do-i-get-the-total-cpu-usage-of-an-application-from-proc-pid-stat

Вот тут все есть. Но спасибо @Fat-Zer за наводку,без него не нашел бы)

https://web.archive.org/web/20130302063336/http://www.lindevdoc.org/wiki//proc/pid/stat

а вот тут описание файла

Является ответом!
Fat-Zer

24.12.2018 04:16:46

Для получения процента нагрузки на процессор данного процесса необходимо сделать два измерения процессорного времени (или время процесса) с неким промежутком, а затем разделить на длительность промежутка. В псевдокоде это будет выглядеть как:

MyTime_t proc_time1 = getCurrentProcessTime ();
MyTime_t monotonic_time1 = getCurrentMonotonicTime ();

waitOrDoSomething ();

MyTime_t proc_time2 = getCurrentProcessTime ();
MyTime_t monotonic_time2 = getCurrentMonotonicTime ();

PercentType processLoadPercent = (proc_time2 - proc_time1) / (monotonic_time2 - monotonic_time1);

getCurrentMonotonicTime ()

Представляет из себя обычный запрос монотонных часов, для С++11 вполне можно использовать std::chrono::steady_clock::now(). Для Си следует воспользоваться системным вызовом Linux: clock_gettime() c CLOCK_MONOTONIC.

getCurrentProcessTime ()

Запрашивает текущее процессорное время.

Для произвольного процесса.

Для произвольного процесса с идентификатором PID данную информацию можно получить из файла /proc/PID/stat. Формат представляет из себя список значений разделённый пробелами (см. man 5 proc), например:

28703 (bash) S 3325 28703 28703 34823 23441 4210688 95587 249495898 324 4433 242 51 1526331 71466 20 0 1 0 78424609 22585344 1413 18446744073709551615 94750838333440 94750839090304 140728355270256 0 0 0 65536 3670020 1266777851 0 0 0 17 2 0 0 0 0 0 94750841189992 94750841211472 94750841643008 140728355272606 140728355272616 140728355272616 140728355278830 0

В данном случае процессорное время разделено на две части: пользовательское время (utime) и системное время (stime). И это соответственно значения 14 и 15. В примере выше это 242 и 51 соответственно. Измеряется в тиках, количество тиков в секунде можно запросить с помощью sysconf(_SC_CLK_TCK).

long unsigned processTime = utime + stime
double processTimeInSeconds = (double) processTime / sysconf(_SC_CLK_TCK);

Замечание: Разбор содержимого stat несколько более сложная задача, чем кажется на первый взгляд т.к. имя исполняемого файла (второе значение) может включать в себя пробелы и скобки, поэтому для полноты необходимо считать весь файл и убрать всё начиная от первой открывающей скобки и до последней закрывающей и только потом считывать остальные значения начиная с 3-го.

Для текущего процесса/потока.

Для того чтобы узнать процессорное время текущего процесса/потока stat парсить не обязательно можно просто запросить его с помощью clock_gettime() из часов CLOCK_PROCESS_CPUTIME_ID или CLOCK_THREAD_CPUTIME_ID соответственно. Или переносимым способом, но с гораздо меньшим разрешением с помощью обычного Си'шного clock().

https://ru.stackoverflow.com/questions/923665/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d1%83-%d0%bd%d0%b0-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d1%80-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%bc-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%bc-%d0%b2-linux/924677#comment1527933_924677
Я немного не понимаю что мы получаем в итоге и зачем нам замерять время? Допустим я проверяю интервалом в 1 секунду. получается я сразу могу получить значение нагрузки?Да и как его потом в проценты перевести?
https://ru.stackoverflow.com/questions/923665/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d1%83-%d0%bd%d0%b0-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d1%80-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%bc-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%bc-%d0%b2-linux/924677#comment1528163_924677
@РодионЯкутович, если честно, немного не понимаю, что вызывает смущение... просто считаем сколько процессорного времени получил процесс за данный промежуток времени... затем делим процессорное время на длительность промежутка и получаем искомый процент нагрузки (само собой чтобы получить собственно проценты надо умножить на 100).
Закрыть X