Мониторинг нагрузки

  • Автор темы DrewBlin
  • Дата начала
D

DrewBlin

#1
Привет всем.
У меня появилась такая задача: надо написать демона, который будет с периодичностью в пару секунд снимать показатели нагрузки компьютера (загрузку ЦПУ, жестких дисков, памяти и т.д.). Делаться это должно под FreeBSD. Вот я и не знаю, от куда брать эти параметры. Думаю, что должны быть какие-то библиотеки, но найти что-то про них никак не удается.
В самой системе существует куча утилит для просмотра этих параметров (типа top, gstat...). Как вариант парсить их вывод... Но такая идея мне не нравится. Они же от куда-то берут свои данные.
Подскажите, пожалуйста, если не сами библиотеки, то хотя бы куда копать.
Заранее спасибо
 
I

ierofant

#2
Можно взять и посмотреть исходники той же gstat. В том и есть вся прелесть ОС с открытым кодом.
Исходники можно взять где-нибудь здесь.
 
M

msoba

#3
загрузку цпу можно вычислять при помощи rdtsc, инструкция считает количество отработанных тактов процессора, результат в edx eax
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
msoba, поведай нам каким образом этой инструкцией можно замерить загрузку.
 
D

dreamer

#5
DrewBlin
Есть библиотека libgtop. Думаю, это то, что нужно.
С бздями не знаком, но, может быть, по образу и подобию Linux там есть файлик /proc/avgload? Оттуда тоже можно стянуть информацию о загрузке процессора.
 
M

msoba

#6
asm("rdtsc\n": "=d"(v1),"=a"(v2)) старшие байты в v1 младшие в v2, можно снять количество тактов 2 раза, по разности определить количество тактов за промежуток времени ну и зная тактовую частоту можно оценить нагрузку процессора
 

lazybiz

Well-known member
03.11.2010
1 339
0
#7
Ей можно замерить время выполнения кода это понятно. Как с помощью этой инструкции замерить загрузку ЦП ?
 
D

dreamer

#10
lazybiz
Товарищ имеет в виду, что можно получить количество инструкций, которое процессор может выполнить за N-ное время, умножив частоту на N и поделить количество реально выполненных инструкций за время N на эту величину. Правда, сомневаюсь хотя бы в том, что такой метод сработает на многоядерных процессорах.

Ещё в интернетах (в частности, в википедии) пишут, что замерять CPU utilization можно по количеству процессов в очереди.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#11
dreamer
Не заступайся. Если бы он хотел это сказать то он бы это сказал. К тому же, даже если он хотел сказать именно это, то я все-равно не пойму как этим можно замерить загрузку процессора.
 
M

msoba

#12
...
a = RDTSC();

... код ...

b = RDTSC();
time_ms = (b - a) / CPU_Freq_MHz / 1000;
...
время выполнения кода Вы ей замерить не сможете ибо многозадачность имеет место быть, можно попытаться приближенно оценить это время, при условии устранения побочных процессов системы. я же вроде описал как это работает, все произходит на аппаратном уровне и код с вызовом инструкции тут не причем, мы замеряем время работы процессора а не кода
 
D

dreamer

#13
msoba
Код:

C++:
#include <iostream>
#include <intrin.h>
#pragma intrinsic(__rdtsc)
#include <windows.h>
#include <winbase.h>

using namespace std;

unsigned __int64 rdtsc() 
{
return __rdtsc();
}

int main()
{
unsigned __int64 a, b;

while (true) {
a = rdtsc();
Sleep(1000);
b = rdtsc();

cout << b - a << endl;
}
}
И при простое системы, и при ощутимой загрузке (видно по диспетчеру задач) выдаёт 279XXXXXXX. Скорость одного ядра процессора - как раз ~2.8 GHz. Так что этот метод скорее подходит для измерения скорости процессора, чем для измерения загрузки.
 
M

msoba

#14
действительно этот счетчик негодится для этой цели. для очистки собственной совести заглянул в исходники top stat они берут инфу из проков, наиболее адекватно инфа представленна в /proc/stat четвертая цифра в строке cpu равна времени простоя процессора с момента загрузки цп, можно измерить ее 2 раза, найти разность, поделить на интервал времени и умножить на 100 получим время простоя процессора в процентах. там же и загрузку хардов, памяти можно посмотреть