Страница 11 из 18

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

Добавлено: Пт мар 25, 2016 12:37 pm
ученик
что с этими таблицами делать? удалить и заново создать?

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

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

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

Добавлено: Вс мар 27, 2016 12:49 pm
m-malva
После последнего обновления падает
main цикл остановлен

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

Обновления
Вы используете последнюю версию!

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

Добавлено: Вс мар 27, 2016 8:05 pm
Ko/|xo3HUk
У меня также система падала при быстром заполнении таблицы phistory: http://majordomo.smartliving.ru/forum/v ... 55&start=0
Решил проблему увеличив время задержки между опросом датчиков (а затем и вовсе с малины на ноут переехал :) )

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

Добавлено: Пн мар 28, 2016 1:20 am
m-malva
Ko/|xo3HUk писал(а):У меня также система падала при быстром заполнении таблицы phistory: http://majordomo.smartliving.ru/forum/v ... 55&start=0
Решил проблему увеличив время задержки между опросом датчиков (а затем и вовсе с малины на ноут переехал :) )
Огромное спасибо, что отозвались.
Но очень хочу понять что поменялось! До обновления все работало стабильно и phistory не переполнялась. А как обновился начали падать main и ping.

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

Добавлено: Вт апр 05, 2016 9:31 pm
cabat
Последние пару дней постоянно останавливался 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 записей.

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

Добавлено: Чт апр 07, 2016 10:17 am
cabat
07.04.2016 UPDATE
Что то не так в датском королевстве..
Днем вроде все было нормально, но когда вечером я проверил - в таблице "phistory_queue" было около 15000 записей!!!
Видимо какая то проблема с переносом записей из "phistory_queue" в "phistory"..
У меня конечно больше 900000 записей в таблице "phistory", но это же не повод..
Наверное попробую вынести этот процесс в отдельный цикл для профайлинга..

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

Добавлено: Чт апр 07, 2016 1:10 pm
m-malva
m-malva писал(а): phistory не переполнялась. А как обновился начали падать main
phistory у меня переполнялась потому, что стояло время хранения истории для всего объекта ThisComputer (7 дней, по-умолчанию там ноль) и каждое свойство при этом хранило историю, включая обновления циклов.
поставил видимо в самом начале, когда изучал систему.

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

Добавлено: Пт апр 08, 2016 11:19 am
cabat
Кажется нашел причину тормозов (по крайней мере конкретно в моей системе) - это удаление старых значений из таблицы "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);
       }
     }
 

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

Добавлено: Пт апр 08, 2016 4:06 pm
cabat
По итогам регулярной проверки в течении дня кол-во записей в таблице "phistory_queue" не поднималось больше 2-3 !!
Посмотрим, что будет через день-два..