Интегральный индикатор загрузки
Добавлено: Чт мар 13, 2014 12:03 pm
Как создать интегральный индикатор загрузки сервера
Что значит интегральный и зачем он нужен? Обычные индикаторы загрузки не дают представления о действительной (определяющей «здоровье» сервера) загрузке. Обычно мы видим штакет
и то ли это много, то ли мало — непонятно.
Идея такая — создать индикатор, который усредняет нагрузку за некоторый период времени. Достаточно большой, чтобы отражать среднюю загрузку и достаточно небольшой, чтобы отражать изменение нагрузки в реальном времени. Понятно? Отлично, тогда продолжаем.
Как это реализовать? Нужно создать кольцевой буфер, который постоянно пополняется свежими значениями контроллируемой величины и постоянно теряет старые значения. В данном примере глубина буффера — 120 значений, т. е. при обновлениии раз в 2 секунды усреднение призводится на интервале в 4 минуты.
Итак, шаг 1 --------------
Создаём любой объект, например
serverCPUload
создаём любое свойство, например
arrTest
Шаг 2 --------------
Создаём второй объект, например
srvCPUload
создаём любое свойство, например
middleLoad
Шаг 3 --------------
Создаём скрипт, например
ohm_server_cpu_load
С содержимым
---> !!!ЗДЕСЬ ВАШ IP АДРЕС!!! <---
-------------------
$ch = curl_init('http://192.168.1.35:8085/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
//----------------------- CPU
$cpu = $json -> {'Children'}[0] -> {'Children'}[1];
$cpu_load = $cpu -> {'Children'}[2] -> {'Children'}[0] -> {'Value'};
//Debmes("---direct1");
$temp222 = substr($cpu_load, 0, strpos($cpu_load, ' '));
$load = round($temp222, 1);
setGlobal('serverCPUload.value', $load);
// $tt = getGlobal("analog21.val3");
// Debmes($tt);
// Линейка индикатора в меню
$load2 = round($load / 10, 0);
$a = "";
for ($i = 0; $i <= $load2; $i++) {
$a = $a.'■';
}
$len = 8 - $load2;
for ($i = 0; $i <= $len; $i++) {
$a = $a.'□';
}
setGlobal("srvCPUload.visio", $a);
$arr = unserialize(getGlobal('serverCPUload.arrTest'));
$deep = 120;
for ($i = $deep; $i > 0; $i--) {
$arr[$i] = $arr[$i - 1];
}
$arr[0] = $load;
$all = 0;
for ($i = $deep; $i > 0; $i--) {
$all = $all + $arr[$i];
}
$all = round($all / $deep, 0);
setGlobal('serverCPUload.arrTest', serialize($arr));
setGlobal("srvCPUload.middleLoad", $all);
-------------------
, который вызываем раз в 2 секунды любым удобным вам способом
-------------
Внимание! Json настроен на мой компьютер, у вас могут не совпасть значения.
$cpu = $json -> {'Children'}[0] -> {'Children'}[1];
$cpu_load = $cpu -> {'Children'}[2] -> {'Children'}[0] -> {'Value'};
значит вам нужно будет подкорректировать этот фрагмент кода
(ну и OHM должен стоять, естественно)
-------------
Далее, шаг 4 --------------
Редактируем файл
\htdocs\templates\default.html
-------------
Внимание! У вас уже должен быть установлен jsgraphics
http://smartliving.ru/forum/viewtopic.php?f=4&t=1523
-------------
Добавляем в него:
<script type="text/javascript">
level_2 = new level2('lev2', 'srvCPUload.middleLoad', 'MAJORDM', 2000, '%');
level_2.alertmin = 0;
level_2.alertmax = 50;
//level_2.background = 'rgba(200, 40, 40, 1)';
level_2.redraw();
</script>
и
<canvas id="lev2" width="80" height="30">Canvas not supported</canvas>
вставляем в любое место, где вы хотите видеть этот индикатор.
И это — всё!
Что значит интегральный и зачем он нужен? Обычные индикаторы загрузки не дают представления о действительной (определяющей «здоровье» сервера) загрузке. Обычно мы видим штакет

Идея такая — создать индикатор, который усредняет нагрузку за некоторый период времени. Достаточно большой, чтобы отражать среднюю загрузку и достаточно небольшой, чтобы отражать изменение нагрузки в реальном времени. Понятно? Отлично, тогда продолжаем.
Как это реализовать? Нужно создать кольцевой буфер, который постоянно пополняется свежими значениями контроллируемой величины и постоянно теряет старые значения. В данном примере глубина буффера — 120 значений, т. е. при обновлениии раз в 2 секунды усреднение призводится на интервале в 4 минуты.

Итак, шаг 1 --------------
Создаём любой объект, например
serverCPUload
создаём любое свойство, например
arrTest
Шаг 2 --------------
Создаём второй объект, например
srvCPUload
создаём любое свойство, например
middleLoad
Шаг 3 --------------
Создаём скрипт, например
ohm_server_cpu_load
С содержимым
---> !!!ЗДЕСЬ ВАШ IP АДРЕС!!! <---
-------------------
$ch = curl_init('http://192.168.1.35:8085/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
//----------------------- CPU
$cpu = $json -> {'Children'}[0] -> {'Children'}[1];
$cpu_load = $cpu -> {'Children'}[2] -> {'Children'}[0] -> {'Value'};
//Debmes("---direct1");
$temp222 = substr($cpu_load, 0, strpos($cpu_load, ' '));
$load = round($temp222, 1);
setGlobal('serverCPUload.value', $load);
// $tt = getGlobal("analog21.val3");
// Debmes($tt);
// Линейка индикатора в меню
$load2 = round($load / 10, 0);
$a = "";
for ($i = 0; $i <= $load2; $i++) {
$a = $a.'■';
}
$len = 8 - $load2;
for ($i = 0; $i <= $len; $i++) {
$a = $a.'□';
}
setGlobal("srvCPUload.visio", $a);
$arr = unserialize(getGlobal('serverCPUload.arrTest'));
$deep = 120;
for ($i = $deep; $i > 0; $i--) {
$arr[$i] = $arr[$i - 1];
}
$arr[0] = $load;
$all = 0;
for ($i = $deep; $i > 0; $i--) {
$all = $all + $arr[$i];
}
$all = round($all / $deep, 0);
setGlobal('serverCPUload.arrTest', serialize($arr));
setGlobal("srvCPUload.middleLoad", $all);
-------------------
, который вызываем раз в 2 секунды любым удобным вам способом
-------------
Внимание! Json настроен на мой компьютер, у вас могут не совпасть значения.
$cpu = $json -> {'Children'}[0] -> {'Children'}[1];
$cpu_load = $cpu -> {'Children'}[2] -> {'Children'}[0] -> {'Value'};
значит вам нужно будет подкорректировать этот фрагмент кода
(ну и OHM должен стоять, естественно)
-------------
Далее, шаг 4 --------------
Редактируем файл
\htdocs\templates\default.html
-------------
Внимание! У вас уже должен быть установлен jsgraphics
http://smartliving.ru/forum/viewtopic.php?f=4&t=1523
-------------
Добавляем в него:
<script type="text/javascript">
level_2 = new level2('lev2', 'srvCPUload.middleLoad', 'MAJORDM', 2000, '%');
level_2.alertmin = 0;
level_2.alertmax = 50;
//level_2.background = 'rgba(200, 40, 40, 1)';
level_2.redraw();
</script>
и
<canvas id="lev2" width="80" height="30">Canvas not supported</canvas>
вставляем в любое место, где вы хотите видеть этот индикатор.

И это — всё!