Народ, не можем разобраться, где тонкое место и где рвется наш алгоритм парсинга.
Есть сторонний сайт, размещающий результаты спортивных и киберспортивных мероприятий. Мы с него забираем результаты. Но не по крону, ибо там максимум раз в минуту можно дергать, а с помощью самописного даймона.
Код примерно следующий
$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 не самый эффективный? Как бы Вы запустили такой даймон?..
Если эту тему прочтет грамотный админ, который умеет профилировать такие вещи и находить несбалансированные участки - рассмотрим коммерческий вариант решения проблемы.