основной цикл системы

Проблемы/вопросы, связанные с запуском под различными платформами и конфигурациями.

Модератор: immortal

ученик
Сообщения: 230
Зарегистрирован: Чт фев 12, 2015 2:34 pm
Благодарил (а): 36 раз
Поблагодарили: 6 раз

Re: основной цикл системы

Сообщение ученик » Пт мар 25, 2016 12:37 pm

что с этими таблицами делать? удалить и заново создать?
server i5, OS-Ubuntu Server 16., 1-wire
php 7, AMS,broadlink rm2,rm3 mini.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: основной цикл системы

Сообщение sergejey » Пт мар 25, 2016 3:41 pm

Это не ошибки, просто другой тип таблиц. mssendstack это я не знаю что, не из ядра системы точно, может какой из модулей. Значит дело не в испорченных таблицах, а в чём-то другом. Возможно, просто данных слишком много и памяти не хватает. Посмотрите таблицы самого большого размера.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
m-malva
Сообщения: 291
Зарегистрирован: Чт фев 26, 2015 1:38 am
Откуда: Санкт-Петербург
Благодарил (а): 16 раз
Поблагодарили: 66 раз
Контактная информация:

Re: основной цикл системы

Сообщение m-malva » Вс мар 27, 2016 12:49 pm

После последнего обновления падает
main цикл остановлен

Приходится чистить
phistory_queue
phistory
раз в два-три дня
в них набирается по 30 мб

Обновления
Вы используете последнюю версию!
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: основной цикл системы

Сообщение Ko/|xo3HUk » Вс мар 27, 2016 8:05 pm

У меня также система падала при быстром заполнении таблицы phistory: http://majordomo.smartliving.ru/forum/v ... 55&start=0
Решил проблему увеличив время задержки между опросом датчиков (а затем и вовсе с малины на ноут переехал :) )
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
m-malva
Сообщения: 291
Зарегистрирован: Чт фев 26, 2015 1:38 am
Откуда: Санкт-Петербург
Благодарил (а): 16 раз
Поблагодарили: 66 раз
Контактная информация:

Re: основной цикл системы

Сообщение m-malva » Пн мар 28, 2016 1:20 am

Ko/|xo3HUk писал(а):У меня также система падала при быстром заполнении таблицы phistory: http://majordomo.smartliving.ru/forum/v ... 55&start=0
Решил проблему увеличив время задержки между опросом датчиков (а затем и вовсе с малины на ноут переехал :) )
Огромное спасибо, что отозвались.
Но очень хочу понять что поменялось! До обновления все работало стабильно и phistory не переполнялась. А как обновился начали падать main и ping.
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: основной цикл системы

Сообщение cabat » Вт апр 05, 2016 9:31 pm

Последние пару дней постоянно останавливался main цикл.
Заметил, что в таблице "phistory_queue" много записей (около 1500), хотя по логике кода скрипта cycle_main.php,
они должны каждую минуту переносится в таблицу "phistory" с учетом отбрасывания одинаковых значений (я правда у себя это отключил).
Судя по всему, не успевали переносится все значения, накопившиеся в буфере "phistory_queue" и возникал "затор".
Изменил немного запрос в строке 105 (cycle_main.php#L105):

было:

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

$queue=SQLSelect("SELECT * FROM phistory_queue ORDER BY ID LIMIT 5000");
стало:

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

$queue=SQLSelect("SELECT * FROM phistory_queue ORDER BY ID LIMIT 100"); 
вроде стало получше, за несколько часов кол-во записей упало уже до 300 и цикл main больше пока не останавливался.

06.04.2016 UPDATE
За ночь вроде совсем нормализовалось - в таблице "phistory_queue" в среднем до 10 записей.
За это сообщение автора cabat поблагодарил:
Ko/|xo3HUk (Вт апр 05, 2016 9:35 pm)
Рейтинг: 1.16%
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: основной цикл системы

Сообщение cabat » Чт апр 07, 2016 10:17 am

07.04.2016 UPDATE
Что то не так в датском королевстве..
Днем вроде все было нормально, но когда вечером я проверил - в таблице "phistory_queue" было около 15000 записей!!!
Видимо какая то проблема с переносом записей из "phistory_queue" в "phistory"..
У меня конечно больше 900000 записей в таблице "phistory", но это же не повод..
Наверное попробую вынести этот процесс в отдельный цикл для профайлинга..
Аватара пользователя
m-malva
Сообщения: 291
Зарегистрирован: Чт фев 26, 2015 1:38 am
Откуда: Санкт-Петербург
Благодарил (а): 16 раз
Поблагодарили: 66 раз
Контактная информация:

Re: основной цикл системы

Сообщение m-malva » Чт апр 07, 2016 1:10 pm

m-malva писал(а): phistory не переполнялась. А как обновился начали падать main
phistory у меня переполнялась потому, что стояло время хранения истории для всего объекта ThisComputer (7 дней, по-умолчанию там ноль) и каждое свойство при этом хранило историю, включая обновления циклов.
поставил видимо в самом начале, когда изучал систему.
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: основной цикл системы

Сообщение cabat » Пт апр 08, 2016 11:19 am

Кажется нашел причину тормозов (по крайней мере конкретно в моей системе) - это удаление старых значений из таблицы "phistory" при переносе строк из таблицы "phistory_queue".
Строка 116 цикла main выполняется столько раз, сколько строк получено из таблицы "phistory_queue":

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

SQLExec("DELETE FROM phistory WHERE VALUE_ID='".$q_rec['VALUE_ID']."' AND TO_DAYS(NOW())-TO_DAYS(ADDED)>".(int)$q_rec['KEEP_HISTORY']);
 
Когда я на время закомментировал эту строку - кол-во записей в таблице "phistory_queue" стало стремительно уменьшаться.

Немного переделал этот кусок цикла:

было:

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

   $queue=SQLSelect("SELECT * FROM phistory_queue ORDER BY ID LIMIT 100");
   if ($queue[0]['ID']) {
    $total=count($queue);
    for($i=0;$i<$total;$i++) {
     $q_rec=$queue[$i];
     $value=$q_rec['VALUE'];
     $old_value=$q_rec['OLD_VALUE'];

     SQLExec("DELETE FROM phistory_queue WHERE ID='".$q_rec['ID']."'");

     if ($value!=$old_value) {
       SQLExec("DELETE FROM phistory WHERE VALUE_ID='".$q_rec['VALUE_ID']."' AND TO_DAYS(NOW())-TO_DAYS(ADDED)>".(int)$q_rec['KEEP_HISTORY']);
       $h=array();
       $h['VALUE_ID']=$q_rec['VALUE_ID'];
       $h['ADDED']=$q_rec['ADDED'];
       $h['VALUE']=$value;
       $h['ID']=SQLInsert('phistory', $h);
     } elseif ($value==$old_value) {
       $tmp_history=SQLSelect("SELECT * FROM phistory WHERE VALUE_ID='".$q_rec['VALUE_ID']."' ORDER BY ID DESC LIMIT 2");
       $prev_value=$tmp_history[0]['VALUE'];
       $prev_prev_value=$tmp_history[1]['VALUE'];
       if ($prev_value==$prev_prev_value) {
         $tmp_history[0]['ADDED']=$q_rec['ADDED'];
         SQLUpdate('phistory', $tmp_history[0]);
       } else {
         $h=array();
         $h['VALUE_ID']=$q_rec['VALUE_ID'];
         $h['ADDED']=$q_rec['ADDED'];
         $h['VALUE']=$value;
         $h['ID']=SQLInsert('phistory', $h);
       }
     }
стало (перед циклом выборки строк из таблицы "phistory_queue" производится урезание записей из таблицы "phistory" - наверное это решение не совсем соответствует логике, которую закладывал Сергей, но для моей конфигурации это подходит):

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

  $keep=SQLSelect("SELECT distinct value_id,keep_history FROM phistory_queue");
   if ($keep[0]['value_id']) {
    $total=count($keep);
    for($i=0;$i<$total;$i++) {
     $keep_rec=$keep[$i];
     SQLExec("DELETE FROM phistory WHERE VALUE_ID='".$keep_rec['VALUE_ID']."' AND TO_DAYS(NOW())-TO_DAYS(ADDED)>".(int)$q_rec['KEEP_HISTORY']);
    }
   }

   $queue=SQLSelect("SELECT * FROM phistory_queue ORDER BY ID LIMIT 100");
   if ($queue[0]['ID']) {
    $total=count($queue);
    for($i=0;$i<$total;$i++) {
     $q_rec=$queue[$i];
     $value=$q_rec['VALUE'];
     $old_value=$q_rec['OLD_VALUE'];

     SQLExec("DELETE FROM phistory_queue WHERE ID='".$q_rec['ID']."'");

     if ($value!=$old_value) {
       //SQLExec("DELETE FROM phistory WHERE VALUE_ID='".$q_rec['VALUE_ID']."' AND TO_DAYS(NOW())-TO_DAYS(ADDED)>".(int)$q_rec['KEEP_HISTORY']);
       $h=array();
       $h['VALUE_ID']=$q_rec['VALUE_ID'];
       $h['ADDED']=$q_rec['ADDED'];
       $h['VALUE']=$value;
       $h['ID']=SQLInsert('phistory', $h);
     } elseif ($value==$old_value) {
       $tmp_history=SQLSelect("SELECT * FROM phistory WHERE VALUE_ID='".$q_rec['VALUE_ID']."' ORDER BY ID DESC LIMIT 2");
       $prev_value=$tmp_history[0]['VALUE'];
       $prev_prev_value=$tmp_history[1]['VALUE'];
       if ($prev_value==$prev_prev_value) {
         $tmp_history[0]['ADDED']=$q_rec['ADDED'];
         SQLUpdate('phistory', $tmp_history[0]);
       } else {
         $h=array();
         $h['VALUE_ID']=$q_rec['VALUE_ID'];
         $h['ADDED']=$q_rec['ADDED'];
         $h['VALUE']=$value;
         $h['ID']=SQLInsert('phistory', $h);
       }
     }
 
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: основной цикл системы

Сообщение cabat » Пт апр 08, 2016 4:06 pm

По итогам регулярной проверки в течении дня кол-во записей в таблице "phistory_queue" не поднималось больше 2-3 !!
Посмотрим, что будет через день-два..
Ответить