@muhasa

Поможет ли php-fpm + ngnix в нашей проблеме с нагрузкой при парсинге?

Народ, не можем разобраться, где тонкое место и где рвется наш алгоритм парсинга.

Есть сторонний сайт, размещающий результаты спортивных и киберспортивных мероприятий. Мы с него забираем результаты. Но не по крону, ибо там максимум раз в минуту можно дергать, а с помощью самописного даймона.

Код примерно следующий

$parser_result = json_decode(file_get_contents($url), true);

foreach ($parser_result['Value'] as $game){
     $cdate_unixtime = $game['S'];
     $gid = intval($game['I']);
     $urls[] = $url."&game_id=".$gid;
}

// array of curl handles
$multiCurl = [];
// data to be returned
$result = [];
// multi handle
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
  // URL from which data will be fetched
  $multiCurl[$i] = curl_init();
  curl_setopt($multiCurl[$i], CURLOPT_URL,$url);
  curl_setopt($multiCurl[$i], CURLOPT_HEADER,0);
  curl_setopt($multiCurl[$i], CURLOPT_RETURNTRANSFER,1);
  curl_multi_add_handle($mh, $multiCurl[$i]);
}

$index=null;
do {
  curl_multi_exec($mh,$index);
} while($index > 0);
// get content and remove handles
foreach($multiCurl as $k => $ch) {
  $req = curl_multi_getcontent($ch);
  $parser_kf = json_decode($req, true);
  
  // здесь мы вычленяем данные, кладем их в базу, а потом ниже удаляем хендлер соединения, весь код я опустил
  
  curl_multi_remove_handle($mh, $ch);
}
// закрываем соединение
curl_multi_close($mh);


Запускаем мы этот код вот таким образом

#!/bin/bash
while true;
do 
/opt/php72/bin/php parser.php;
sleep 5;
done


и сам запуск через nohup

nohup ./daemon.sh >/dev/null 2>&1 &

Таких парсеров у нас 5 штук, и даймонов тоже. То есть в фоне линукса висит 5 процессов круглосуточно. В какой-то момент оперативка (2 гб на OpenVZ VPS-ке) забилась, сработал киллер процессов и выгрузил наш парсер. Сайт встал.

У нас, возможно, будет еще больше парсеров и даймонов. На OpenVZ платформе не получается сбросить оперативную память, в отличие от KVM-виртуализации (проверяли кучей способов, но если Вы знаете как - подскажите). Постоянно забивается кеш оперативки.

Теперь самое главное
Правильно я понимаю, что причин и решений может быть несколько?

1) У нас сейчас гоняется apache. Я слышал, что ngnix лучше работает с процессами, но не вникал о каком классе задач идет речь. Также слышал о большей производительности php-fpm. Поможет ли нам связка ngnix+php-fpm в решении этого вопроса? У нас в фоне щас дохера php и httpd процессов запущено и может быть они так говнисто отрабатывают.

2) Может код написан криво и мы где-то чего недооптимизировали? Или вообще проблема в этом curl_multi_init?.. Мы одновременно должны опросить от 4 до 100 адресов (точнее адрес 1, меняет в url только параметр игры), нам последовательный опрос не подходит.

3) Возможно ли решить проблему, указав линуксу, что эти процессы не должны убиваться? И как это можно сделать, если можно?..

4) Может вариант с nohup не самый эффективный? Как бы Вы запустили такой даймон?..

Если эту тему прочтет грамотный админ, который умеет профилировать такие вещи и находить несбалансированные участки - рассмотрим коммерческий вариант решения проблемы.
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 5
Sanes
@Sanes
Веб-сервер тут при чем? Вы парсите через php-cli
Ответ написан
shambler81
@shambler81 Куратор тега Linux
нет не решит проблему php-fpm даст вам ну 20% скорости но никак не решит проблему.
а вот если у вас 5.6 то переход на 7.2 даст вам реально 100% к скорости и реальное снижение нагрузки.
Как вариант снижения запускайте их последоватлеьно
Ответ написан
Комментировать
@Nc_Soft
А зачем запускать через nohup? Используйте что-то адекватное, типа supervisord
Ответ написан
alexfilus
@alexfilus
Senior backend developer
nginx не при чём вообще.
Похоже где-то память течёт, без отладки могу посоветовать либо напихать побольше unset, либо переписать так, чтобы при падении процесса, он перезапускался и стартовал с того места где остановился (например реализовать некую очередь).
Ответ написан
Комментировать
@shtirmuz
Fpm поможет высвободить дифицитную память. Помочь адптировать движек под чистый nginx без проблем. Ну и не мешает взять 4гб с запасом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы