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

Тема в разделе "Общие вопросы по С и С++", создана пользователем DrewBlin, 5 фев 2011.

  1. DrewBlin

    DrewBlin Гость

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

    ierofant Гость

    Репутация:
    0
    Можно взять и посмотреть исходники той же gstat. В том и есть вся прелесть ОС с открытым кодом.
    Исходники можно взять где-нибудь здесь.
     
  3. msoba

    msoba Гость

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

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    msoba, поведай нам каким образом этой инструкцией можно замерить загрузку.
     
  5. dreamer

    dreamer Гость

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

    msoba Гость

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

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Ей можно замерить время выполнения кода это понятно. Как с помощью этой инструкции замерить загрузку ЦП ?
     
  8. msoba

    msoba Гость

    Репутация:
    0
    какого кода? инструкция снимает показания счетчика с момента последней загрузки оси и до ее вызова
     
  9. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Любого.
    Код (C++):
        ...
    a = RDTSC();

    ... код ...

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

    dreamer Гость

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

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

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    dreamer
    Не заступайся. Если бы он хотел это сказать то он бы это сказал. К тому же, даже если он хотел сказать именно это, то я все-равно не пойму как этим можно замерить загрузку процессора.
     
  12. msoba

    msoba Гость

    Репутация:
    0
    время выполнения кода Вы ей замерить не сможете ибо многозадачность имеет место быть, можно попытаться приближенно оценить это время, при условии устранения побочных процессов системы. я же вроде описал как это работает, все произходит на аппаратном уровне и код с вызовом инструкции тут не причем, мы замеряем время работы процессора а не кода
     
  13. dreamer

    dreamer Гость

    Репутация:
    0
    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. Так что этот метод скорее подходит для измерения скорости процессора, чем для измерения загрузки.
     
  14. msoba

    msoba Гость

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

Поделиться этой страницей