Полный

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Полный

Сообщение sergejey » Чт мар 27, 2014 11:51 am

Про профайлинг -- в XRay есть такая закладка как Performance, она как раз для отлова длительных/частых операций, показывает статистику операций за последние 10 секунд (если я не ошибаюсь). Чтобы её использовать нужно перед подозрительной оперкцией в коде поставить StartMeasure('ключевое_слово'); и после кода EndMeasure('ключевое_слово',1); (единичка нужна, чтобы статистика записывалась в базу данных и была доступна в XRay). Ключевое слово может быть любым, но одно и то же при открытии и закрытии измерения. Таких конструкций можно сколько угодно понаставить. Так можно попробовать отловить/локализовать проблемы производительности.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Полный

Сообщение Ivan » Чт мар 27, 2014 11:58 am

Кстати у Вас случайно нет 1-Wire
В предпоследнем update было реализовано чтение параметров "Избранное" из не кешируемого раздела

Хорошо бы иметь Профайлинг всех запросов на сервер. На странице он есть, если открыть "Исходные коды страницы в низу" - кстати как его отключить?

А вот запросы от Ajax никак не посмотришь их время выполнения
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Полный

Сообщение sergejey » Чт мар 27, 2014 12:13 pm

Ivan писал(а):Кстати у Вас случайно нет 1-Wire
В предпоследнем update было реализовано чтение параметров "Избранное" из не кешируемого раздела

Хорошо бы иметь Профайлинг всех запросов на сервер. На странице он есть, если открыть "Исходные коды страницы в низу" - кстати как его отключить?

А вот запросы от Ajax никак не посмотришь их время выполнения
Запросы AJAX можно посмотреть тем способом, что я указал выше -- они будут сохраняться в базу данных и доступны для анализа через XRay.
Отключить вывод отчёта производительности в исходном коде можно убрав performanceReport из файла /index.php

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Полный

Сообщение Alex » Чт мар 27, 2014 2:27 pm

Обнаружилась мистическая связь s2 индикаторов с канвасом. Если нет корректного канваса хотя бы для одного индикатора — начинаются глюки с отказом js и повышенной загрузкой сервера.
ipz
Сообщения: 238
Зарегистрирован: Чт ноя 26, 2015 10:54 pm
Благодарил (а): 38 раз
Поблагодарили: 45 раз

Re: Полный

Сообщение ipz » Вс фев 12, 2017 12:30 am

Попробовал воспользоваться StartMeasure, EndMeasure.

1) Кусок кода в EndMeasure, который отвечает за запись в базу был закомментирован(!)
Раскомментировал - появились данные на закладке X-Ray->Performance ))))

2) Удивительные значения я там увидел:
- Average time по функции(ям) getProperty рос как на дрожжах. Когда посчитал, оказалось он немногим больше 9 лет))). При uptime малины 2 дня. Это среднее-то время выполнения...

В коде object.class.php, в начале функции getProperty был кусок

Код: Выделить всё

  if ($this->object_title) {
   $value=SQLSelectOne("SELECT VALUE FROM pvalues WHERE PROPERTY_NAME = '".DBSafe($this->object_title.'.'.$property)."'");
   if (isset($value['VALUE'])) {
   startMeasure('getPropertyCached2');
    endMeasure('getPropertyCached2', 1);
    endMeasure('getProperty ('.$property.')', 1);
    endMeasure('getProperty', 1);
    return $value['VALUE'];
   }
  }
  startMeasure('getProperty');
  startMeasure('getProperty ('.$property.')');
 
Сначала закомментировал странное закрытие измерения. Помогло. Исправил на

Код: Выделить всё

  startMeasure('getProperty');
  startMeasure('getProperty ('.$property.')');

  if ($this->object_title) {
   $value=SQLSelectOne("SELECT VALUE FROM pvalues WHERE PROPERTY_NAME = '".DBSafe($this->object_title.'.'.$property)."'");
   if (isset($value['VALUE'])) {
    startMeasure('getPropertyCached2');
    endMeasure('getPropertyCached2', 1);
    endMeasure('getProperty ('.$property.')', 1);
    endMeasure('getProperty', 1);
    return $value['VALUE'];
   }
  }
 
Теперь, кажется, работает.

Просьба, если я не прав, скажите, т.к. очень нужен инструмент мониторинга...

PS: Система не альфа. Не скачаны обновления от 08.02.17.

UPD1:
- значения среднего времени выполнения растут медленно, но верно
- уменьшил срок хранения значений в perfomance_log c одного часа до одной минуты. Все равно используются последние 10 секунд...
- получается, что чистится эта таблица только если открыта страница X-Ray->Performance. Хорошо, что заметил... Добавил чистку в один из методов onNewMinute()
- по коду - очень неаккуратно закрываются измерения (просмотрел только setProperty и getProperty), что увидел, исправил
- посмотрим доживет ли малина до утра)))

UPD2:
Не знаю радоваться мне или, наоборот... не радоваться...
С одной стороны я нашел, что искал - замедление работы системы и в целом и в отдельных ее частях. Отсюда отваливающиеся Websocket'ы на главной странице, катастрофическое замедление чтения socket'ов в модуле MySensor и бог его знает чего еще...

С другой стороны код StartMeasure, EndMeasure стремный какой-то:
- написан в 2001-2004 гг.
- судя по всему с тех пор им вообще никто не пользовался))))
- получаемые с помощью него значения не понятно как интерпритировать, например, в текущий момент в моей системе процесс чтения сокета запускается 38 раз в 10 секунд и занимает в среднем ~3500 секунд. Это почти час. А система все еще работает....

UPD3:
Вот, например
Как понять?Показать
setProperty.jpg
setProperty.jpg (25.9 КБ) 2972 просмотра
SETPROPERTY - время записи согласно модулю измерений
SETTESTPROP - время измерения конкретного свойства, замеренное напрямую, без участия модуля измерений, в одном из onNewMinute()
(Масштаб у графиков разный (!) )
Ответить