Назад | Перейти на главную страницу

Поиск последнего конца файла вызывает зависание Apache, и он никогда не перезагружается

Я действительно решил свою проблему с помощью более качественного сценария, но мне все еще не понятно, почему Apache2 завис полностью - это готовая установка ISPCONFIG 3.03, все обновлено, работает отлично. До того как...

Трудный, но невинно выглядящий сценарий:

$fp = fopen("/var/log/ispconfig/cron.log", "r");
fseek($fp, -5000, SEEK_END);
$line_buffer = array();
while (!feof($fp)) {
    $line = fgets($fp, 1024);
    $line_buffer[] = $line;
    $line_buffer = array_slice($line_buffer, -10, 10);
}
foreach ($line_buffer as $line) {
echo $line;
}

Вы поняли, что это просто сценарий, который я где-то нашел на форуме. Я сделал это для различных журналов, так как это приятное простое окно о том, что происходит (конечно, в каталоге защиты!).

Однажды, когда журналы разрослись, и я отсортировал все мои cron, скрипты и ошибки очереди почты, я подумал, что пора начать заново. обновил, перезагрузил, заархивировал и удалил логи. Когда через пару часов я запустил свой сценарий, он завис. И завис. Я ждал 8 минут. Конечно, Chrome отключил страницу, но сервер так и не ожил. htop показал / usr / sbin / apache2 -k restart с использованием 100% ЦП. Никогда не возвращался, пока не перезапустил службу apache2. Все нормально, как только я снова нажму на этот файл журнала ... мертв.

Итак, я решил, что это сценарий файла журнала, и я понял, что поиск за пределами конца файла не годится, и я нашел лучший сценарий http://www.php.net/manual/en/function.fseek.php#90450

Но вот что я задаюсь вопросом: почему что-то не перезапустило или не остановило процесс? Как одна зависшая страница могла вывести из строя весь сервер? Он работает suphp. Я говорю «из коробки», я настроил mysql и apache для разветвления и резервирования разумного количества процессов для 512 Мб ОЗУ VPS, и он будет обрабатывать несколько обновлений больших страниц и не зависал раньше.

Есть идеи, как бы этого избежать? Google мне не друг в этом случае, если не считать рекомендаций. выше о количестве процессов по сравнению с доступной оперативной памятью.

Ни Apache, ни ваша ОС по умолчанию не предполагают, сколько времени может выполняться скрипт. Для таких вещей существует системная возможность rlimit, которую mod_cgi предоставляет для управления временем выполнения скрипта (но mod_cgid этого не делает).

Apache также использует фиксированное количество потоков / процессов, и если вы используете их все в ожидании ввода-вывода, который никогда не произойдет, он в конечном итоге не сможет принять новое соединение.