| 
			| 
					
						| 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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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   16struct 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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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]);
 }
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |