MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« : 05-05-2007 11:55 » |
|
Не являюсь спецом в программинге на плюсах да ещё и в линухе. Интересует вот что : Есть ли какие то стандартные методы узнать насколько загружен процессор всей системы и сколько юзается памяти ?
ЗЫ. Чтение и парсинг данных из файлов /proc/cpuinfo, /proc/meminfo и так далее не устраивает.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #1 : 07-05-2007 08:03 » |
|
Хммм.... неужто нет никаких вариантов ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Антон (LogRus)
|
|
« Ответ #2 : 07-05-2007 12:05 » |
|
|
|
|
Записан
|
Странно всё это....
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #3 : 07-05-2007 12:25 » |
|
Хммм... что то это не совсем то что нужно. В указаном тобой примере всё относиться к данному процессу, а мне нужны данный по всей системе в целом. Сколько процентов цпу и рама загружено. Да и в том примере выводится CPU time. Что это значит CPU time ? ЗЫ. Ногами не бейте ибо в линухах я слаб.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Антон (LogRus)
|
|
« Ответ #4 : 07-05-2007 12:33 » |
|
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 08-05-2007 10:51 » |
|
Может просто команду top запустить?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #6 : 08-05-2007 11:15 » |
|
Может просто команду top запустить?
Не пойдёт Пишу простенький XPCOM компонент, и в нём нужно реализовать два метода : 1. который вернёт загрузку процессора всей системой 2. который вернёт загрузку памяти во всей системе
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #7 : 08-05-2007 13:50 » |
|
С sysinfo всё хоккей ! Спасибки за ссылку. Пойду искать/разбираться с загрузкой процессора
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Антон (LogRus)
|
|
« Ответ #8 : 08-05-2007 17:12 » |
|
так sysinfo вроде говорит загрузку процессора, но я бы на твоём месте посмотрел прежде всего в двух местах в 1. доки идущев в комплекте с исходниками ядра. 2. в сырцах уже существующего ПО например в GKRELLM
|
|
|
Записан
|
Странно всё это....
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #9 : 08-05-2007 18:01 » |
|
так sysinfo вроде говорит загрузку процессора sysinfo выводит что то типа CPU Time за 1, 5 и 15 минут. НО разве это загрузка в процентах ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 08-05-2007 19:16 » |
|
MOPO3, это некая "средняя" величина. В литературе не описыно или я не смог найти. Попробуем разобраться... Я надергал из файлов исходников ядра несколько "цитат". Сначала константы, макросы и определение структуры, а потом код изменяющий это среднее время, и код из системного вызова. Хранится это время в unsigned long avenrun[3]; Константа HZ для x86 равна 100. /* * These are the constant used to fake the fixed-point load-average * counting. Some notes: * - 11 bit fractions expand to 22 bits by the multiplies: this gives * a load-average precision of 10 bits integer + 11 bits fractional * - if you want to count load-averages more often, you need more * precision, or rounding will get you. With 2-second counting freq, * the EXP_n values would be 1981, 2034 and 2043 if still using only * 11 bit fractions. */ extern unsigned long avenrun[]; /* Load averages */
#define FSHIFT 11 /* nr of bits of precision */ #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ #define LOAD_FREQ (5*HZ) /* 5 sec intervals */ #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ #define EXP_5 2014 /* 1/exp(5sec/5min) */ #define EXP_15 2037 /* 1/exp(5sec/15min) */
#define CALC_LOAD(load,exp,n) \ load *= exp; \ load += n*(FIXED_1-exp); \ load >>= FSHIFT; #define SI_LOAD_SHIFT 16 struct sysinfo { long uptime; /* Seconds since boot */ unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ unsigned long totalram; /* Total usable main memory size */ unsigned long freeram; /* Available memory size */ unsigned long sharedram; /* Amount of shared memory */ unsigned long bufferram; /* Memory used by buffers */ unsigned long totalswap; /* Total swap space size */ unsigned long freeswap; /* swap space still available */ unsigned short procs; /* Number of current processes */ unsigned short pad; /* explicit padding for m68k */ unsigned long totalhigh; /* Total high memory size */ unsigned long freehigh; /* Available high memory size */ unsigned int mem_unit; /* Memory unit size in bytes */ char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ }; static inline void calc_load(unsigned long ticks) { unsigned long active_tasks; /* fixed-point */ static int count = LOAD_FREQ;
count -= ticks; if (count < 0) { count += LOAD_FREQ; active_tasks = count_active_tasks(); CALC_LOAD(avenrun[0], EXP_1, active_tasks); CALC_LOAD(avenrun[1], EXP_5, active_tasks); CALC_LOAD(avenrun[2], EXP_15, active_tasks); } } val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT); val.loads[1] = avenrun[1] << (SI_LOAD_SHIFT - FSHIFT); val.loads[2] = avenrun[2] << (SI_LOAD_SHIFT - FSHIFT);
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #11 : 09-05-2007 04:29 » |
|
Хммм... Т.е. как я понял, ты привёл мне код, который реализует то, что выдаёт член структуры sysinfo unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
Мдас, жаль что в прошлом мало времени уделял особенностям линукс кернела А как считается процентальная загрузка той же командой top ? Может исходник какой есть ? Там отдельно на каждый PID, но общее количество сосчитать думаю нетрудно.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 09-05-2007 19:57 » |
|
Традиционно, информация о процессе берется из /proc/<pid>/ . Посмотри man proc - там объясняется назначение файлов и их формат. Тебе подойдет /proc/<pid>/stat . Время измеряется там в тиках. Колличество тиков в секунде для системы можно получить так: #include <time.h> #include <unistd.h>
clock_t ticks_per_second = sysconf(_SC_CLK_TCK);
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #13 : 10-05-2007 04:12 » |
|
Ну чтение инфы путём парсинга /proc файлов - это не то что мне нужно. А вообще жаль что без танцев с бубном не узнать загрузку процессора всеми процессами. Не знаю как это делается в винде, но думаю всё же проще, хотя не факт.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 10-05-2007 06:04 » |
|
MOPO3, а в чем сложность? Парсить там ничего не надо - формат фиксированный - просто используй sscanf(). Пролистать директорию не сложнее, чем пользоваться специализированными ф-иями в винде.
/proc - виртуальная файловая система. Придумана в 70-х и до сих пор применяется. Прелесть текстового интерфейса прежде всего в том, что если разработчики добавят доп.поля в информацию о процессе, то тебе не только переписывать программу - даже перекомпилировать не нужно будет.
Если очень хочется бинарно, то посмотри мануал: pinfo libc раздел Resoure Usage And Limitation/Resource Usage Только эти ф-ии ограничены своим процессом и дочерними (только завершенными).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #15 : 10-05-2007 12:19 » |
|
MOPO3, а в чем сложность? Да собственно в том что пишу я XPCOM компонент, а из него когда пытаюсь открывать файлы /proc - то всё ломается и не работает Потому собственно и хочется чего-нибудь наподобие системного вызова : sysinfo() Вот например как выглядит метод который возвращает мне кол-во используемой памяти : NS_IMETHODIMP SystemUsage::GetUsedRAM( PRInt32 *_retval ) { struct sysinfo s_info; int error; error = sysinfo(&s_info); *_retval = (PRInt32)(s_info.totalram-s_info.freeram); //used RAM
return NS_OK; }
|
|
« Последнее редактирование: 10-05-2007 12:22 от MOPO3 »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Антон (LogRus)
|
|
« Ответ #16 : 10-05-2007 12:43 » |
|
посмотри код gkrellm и выдери от туда получение текущей загруженности проца.
|
|
|
Записан
|
Странно всё это....
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #17 : 10-05-2007 13:06 » |
|
посмотри код gkrellm и выдери от туда получение текущей загруженности проца.
смотрю. всё выдирает из /proc Эх. придётся танцевать с бубенчиками. Иду пробовать.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #18 : 10-05-2007 16:10 » |
|
Да собственно в том что пишу я XPCOM компонент, а из него когда пытаюсь открывать файлы /proc - то всё ломается и не работает Если процесс падает, то видимо у тебя где-то не хватает контроля ошибок. Я так думаю. Собственно, даже не нужно разбирать попроцессно - дальше в мане описана объщеститемная статистика. /proc/uptime
В этом файле содержатся два числа, обозначающие: время работы системы с момента загрузки (в секундах) и время, проведенное системой в ожидании (в секундах). /proc/stat
Статистика ядра/системы. Зависит от архитектуры. Общие записи включают в себя:
cpu %d %d %d %d
Количество тиков (1/100 секунды), произведенных системой в обычном пользовательском режиме, в пользовательском режиме с низким приоритетом, в системном режиме и в режиме ожидания соответственно. Последнее значение должно быть равно умноженному на 100 значению 2-ого поля в псевдофайле uptime.
Чтоб понять загрузку за некий период нужно считать значения в начале периода и в конце, получить разницу и вывести проценты.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Rulik
Помогающий
Offline
|
|
« Ответ #19 : 28-02-2008 12:23 » |
|
Вот если что функция которой я пользуюсь для определения общей загрузки процессора и загрузки по ядрам: #include <stdio.h> #include <sys/times.h> #include <unistd.h> #include <time.h>
typedef struct { unsigned long usage[16]; } proc_info_t; unsigned long GetProcessorLoad(proc_info_t *info) { static unsigned long pre_total[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, pre_used[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; unsigned long cpu[16], nice[16], system[16], idle[16];
FILE *fp; if (!(fp = fopen("/proc/stat", "r"))) { return 0; } unsigned int index = 0; char name[1024]; do { fgets(name, sizeof(name)-1, fp); if((name[0] != 'c')&&(name[0] != 'p')&&(name[0] != 'u')) break; sscanf(name, "%*s %d %d %d %d", &cpu[index], &nice[index], &system[index], &idle[index]); index++; } while(index < sizeof(cpu));
fclose(fp);
unsigned long used[16]; unsigned long total[16]; for(unsigned int k = 0; k < index; k++) { used[k] = cpu[k] + system[k] + nice[k]; total[k] = cpu[k] + nice[k] + system[k] + idle[k]; }
unsigned long usage = 0; for(unsigned int k = 0; k < index; k++) { if((pre_total[k] == 0)||(pre_used[k] == 0)) { info->usage[k] = 0; } else { info->usage[k] = (unsigned long)((100 * (double)(used[k] - pre_used[k]))/(double)(total[k] - pre_total[k])); } pre_used[k] = used[k]; pre_total[k] = total[k]; } return index-1; }
int main() { proc_info_t info; unsigned long Load = GetProcessorLoad(&info); for(unsigned int k = 0; k < 10000; k++) for(unsigned int l = 0; l < 1000000; l++);
Load = GetProcessorLoad(&info); printf("Load (%d)CPUs : Main=%d%, CPU0=%d%, CPU1=%d%\n", Load, info.usage[0],info.usage[1],info.usage[2]); }
|
|
|
Записан
|
|
|
|
|