Куча зависших процессов php gallery_checker.php

Постим сюда все найденые ошибки
xawm
Posts: 542
Joined: Tue Dec 25, 2012 6:37 pm

Куча зависших процессов php gallery_checker.php

Post by xawm »

Обнаружил что на сервере очень большой расход памяти. начал изучать и обнаружил что имею 330 процессов "процессов php gallery_checker.php". Причём некоторые из них ранают по несколько дней.

Стал изучать и вот какие факты нашёл:
1. Такие процессы есть как для master сайтов так и для slave
2. Для одного сайта аж до 40 таких процессов.

Убил все из них, но вопросы остались:

1. Почему они зависают и не умирают?
2. Зачем чекать галеры на слейвах?
3. Стоит ли чинить это или просто ограничить время выполнения и пусть просто процесс убивается через сажем 120-240 секунд?

Точно воспроизводится на: (c) SmartCJ Pro V 2.1 Build 201512010036 , если надо завтра могу посмотреть все версии сайтов на которых была проблема.
xawm
Posts: 542
Joined: Tue Dec 25, 2012 6:37 pm

Re: Куча зависших процессов php gallery_checker.php

Post by xawm »

Пока вы ложите ХУЯ на проблему сервак вывесился в своп из-за зависших gallery_checker.php. Поддержка на высоте...

Хотя самоуверенность и распиздяйство разработчика в этом скрипте похоже главное.
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

Re: Куча зависших процессов php gallery_checker.php

Post by admin »

Пришлите плз доступ на сервак, пока повторить проблему на локале не получается.
Don't forget to run script update
xawm
Posts: 542
Joined: Tue Dec 25, 2012 6:37 pm

Re: Куча зависших процессов php gallery_checker.php

Post by xawm »

Отчаявшись ждать ответа и фикса настроили просто убийство php процессов работаюзих дольше 2х часов. Сейчас таких процессов нету. Доступ какой нужен? root? или достаточно юзера который имеет доступ к запуску php кронов?
xawm
Posts: 542
Joined: Tue Dec 25, 2012 6:37 pm

Re: Куча зависших процессов php gallery_checker.php

Post by xawm »

А вообще блин надо бы и аналитически думать. Почему скрипт может зависать навечно:
1. бесконечный цикл (очень надеюсь что это не этот случай иначе окопы рыть уже поздно)
2. какая-то блокирующая операция. Например IO. Например curl на плохой галере с CURLOPT_CONNECTTIMEOUT = 0.

Пересмотрите код на предмет вышеназванных причин + если не найдётся то добавляйте тонны логгинга и давайте еге энейблить на сервере.

Update:
Собственно говоря вооружившись netstat, ps и grep выясняется что эти процессы держат исходящий коннект на 66.152.82.22:80 что является сервером платника на котором захостаны FHG. Итого предположение №2 похоже имеет место быть не предположением. Предполагаемый сценарий:
1. Скрипт доходит в свеой проверке до плохой галеры которая не раздаётся
2. Скрипт до усрачки пробует забрать галеру.

P.S.: Очень надеюсь что хватит у вас времени и желания не положить хуя, а по приведённой выше инфонмации пофиксить.

P.P.S.: тут от одного нашего общего знакомого поступило предположение что Спон может подбанивать IP сервера за частые запросы, поэтому фейлить галеру сразу нельзя если её чек не прошёл.
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

Re: Куча зависших процессов php gallery_checker.php

Post by admin »

Дефолтный таймаут 300 секунд

вот пример скирпта для проверки этой проблемы
если он у вас не отваливается после 30 секунд при запросе того урла то что-то не так с curl

Code: Select all

<?php
error_reporting(E_ALL & ~E_NOTICE);


$data = array(
	array('url' => 'http://test.com/')
);


print_r(multiRequest($data));

function multiRequest($data, $options = array()) {


  $curly = array();
  $result = array();

  $mh = curl_multi_init();

  foreach ($data as $id => $d) {

    $curly[$id] = curl_init();

    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
    curl_setopt($curly[$id], CURLOPT_URL,            $url);
    curl_setopt($curly[$id], CURLOPT_HEADER,         1);
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curly[$id], CURLOPT_FOLLOWLOCATION, 1);
    
    if ($d['type'] == '404_check') curl_setopt($curly[$id], CURLOPT_NOBODY, 1);

    curl_setopt($curly[$id], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 ');
    
    //curl_setopt($curly[$id], CURLOPT_VERBOSE,  1);


    curl_multi_add_handle($mh, $curly[$id]);
  }

  // execute the handles
  $running = null;
  do {
    curl_multi_exec($mh, $running);
    sleep(1);
  } while($running>0 && $ready!=-1);


  foreach($curly as $id => $c) {
  	$info = curl_getinfo($c);
  	//print_r($info);
    $result[$id] = ($info['http_code'] == 200) ? curl_multi_getcontent($c) : $info['http_code'];
    curl_multi_remove_handle($mh, $c);
  }

  curl_multi_close($mh);

  return $result;
}


Don't forget to run script update
xawm
Posts: 542
Joined: Tue Dec 25, 2012 6:37 pm

Re: Куча зависших процессов php gallery_checker.php

Post by xawm »

Результаты тестов?

Code: Select all

 $data = array('url' => 'http://test.com/')
Вывел HTML контент страницы

Code: Select all

$data = array('url' => 'http://test3333.com/')
Залип и был убит через 2 часа.

Ещё исследование:

Вчера на всех серверах одновременно стало рости колличество PHP процессов (+1-1.5к процессов на сервер). Скорее всего gallery_checker (доказательств нет). Через 2 часа процессы были убиты и следов не осталось. Есть предположение что у Спона были проблемы с сервером и FHG либо не отдавались, либо отдавались медленно. И собственно curl и позависали.

Соответственно лимиты похоже не отрабатывают. Сейчас буду гуглить как их с конфигов выставлять.

К слову:

Code: Select all

php --version
PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with the ionCube PHP Loader (enabled) + Intrusion Protection from ioncube24.com (unconfigured) v5.0.11, Copyright (c) 2002-2015, by ionCube Ltd.
Обновлятся?


Update:
как выключить эту фичу полностью до тех пор пока не решим проблему?
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

Re: Куча зависших процессов php gallery_checker.php

Post by admin »

Можно в админке выключить чек галер
Либо переименовать сам файл


Залип и был убит через 2 часа.
А должен был отвалиться тк

CURLOPT_CONNECTTIMEOUT

Pass a long. It should contain the maximum time in seconds that you allow the connection phase to the server to take. This only limits the connection phase, it has no impact once it has connected. Set to zero to switch to the default built-in connection timeout - 300 seconds.

А в примере мы его нигде не передаем, те должно быть дефолтным .
Don't forget to run script update
xawm
Posts: 542
Joined: Tue Dec 25, 2012 6:37 pm

Re: Куча зависших процессов php gallery_checker.php

Post by xawm »

А может не будет плохим решением передать TIMEOUT явно?
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

Re: Куча зависших процессов php gallery_checker.php

Post by admin »

Да, можно и так конечно, а у вас добавление этого параметра в тестовом скрипте помогло ?
Don't forget to run script update
Post Reply