• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

DrewBlin

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

ierofant

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

msoba

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

lazybiz

msoba, поведай нам каким образом этой инструкцией можно замерить загрузку.
 
D

dreamer

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

msoba

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

lazybiz

Ей можно замерить время выполнения кода это понятно. Как с помощью этой инструкции замерить загрузку ЦП ?
 
L

lazybiz

Любого.
C++:
	...
a = RDTSC();

... код ...

b = RDTSC();
time_ms = (b - a) / CPU_Freq_MHz / 1000;
...
Ты совсем балбес или просто хочешь таким казаться?
Повторяю вопрос: как с помощью RDTSC замерить загрузку процессора?
 
D

dreamer

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

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

lazybiz

dreamer
Не заступайся. Если бы он хотел это сказать то он бы это сказал. К тому же, даже если он хотел сказать именно это, то я все-равно не пойму как этим можно замерить загрузку процессора.
 
M

msoba

...
a = RDTSC();

... код ...

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

dreamer

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!