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

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

  1. DrewBlin

    DrewBlin Гость

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

    ierofant Гость

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

    msoba Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

    dreamer Гость

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

    msoba Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

    msoba Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

    ... код ...

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

    dreamer Гость

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

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

    lazybiz Well-Known Member
    C\C++ Team

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

    msoba Гость

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

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

    msoba Гость

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

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