Меня где то неделю начал мучать Apache, пожирает 90-100% CPU
Сайты в этот момент открывается с +1 ~ +3 сек (Очень долго)
*Сразу скажу я не мега-сисОдмин устанавливал apache по мануалам.*
Спасал меня только рестарт apache из консоли debian-a, после рестарта где то 2-4 часа apache не поднимался даже до 20%
был стабилен 5~10%
Естественно меня это заебало и начел киллить(kill) процесы апач с 90%
Сделал для этого вот такой парсер и поставил на CRON каждые 20 мин.
<?php
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
// log in at server1.example.com on port 22
if(!($con = ssh2_connect("хуй.хуй.хуй.хуй", 22))){
echo "fail: unable to establish connection\n";
} else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con, "рот", "опиздаололо")) {
echo "fail: unable to authenticate\n";
} else {
// allright, we're in!
echo "okay: logged in…\n";
// execute a command
if (!($stream = ssh2_exec($con, "top -b -n 1 -u www-data"))) {
echo "fail: unable to execute command\n";
} else {
// collect returning data from command
stream_set_blocking($stream, true);
$data = "";
while ($buf = fread($stream,4096)) {
$data .= $buf."<br />";
#echo $buf
}
$fp = fopen("logs.txt", "w+");
$write = fwrite($fp, $data);
fclose($stream);
}
}
}
// Сохраняем логи команды top
$FileData = file("logs.txt");
// Удаляем ненужные данные из массива
unset($FileData[0], $FileData[1], $FileData[2], $FileData[3], $FileData[4], $FileData[5]);
for($i=30; $i <= 120; $i++) {unset($FileData[$i]);}
// С помощью регулярных выражений развиваем данные в простой массив
foreach($FileData as $k) {
$k = preg_replace("#(\s+)#", " ", $k);
preg_match_all("|(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s(.*)\s|isU", $k, $matches);
$a++;
$logs[$a]['pid'] = $matches[1][0];
$logs[$a]['percent'] = $matches[9][0];
$logs[$a]['time'] = $matches[11][0];
$logs[$a]['proces'] = $matches[12][0];
$total_cpu += $matches[9][0];
}
// Идет проверка на cpu, если процесс работает более 5 минут и пожирает более 20% из CPU
// убиваем процесс и заносим его в логи
echo "Total CPU: $total_cpu %<br />";
$open_logs = fopen("KillLogs.txt", "a+");
foreach ($logs as $k => $n) {
echo "PID: {$n['pid']} CPU: {$n['percent']} Time: {$n['time']} Proces: {$n['proces']}<br />";
if($total_cpu >= 90) {
if($n['time'] > "03:00:00" and $n['percent'] > 20 and $n['proces'] == "apache2") {
// Убиваем процесс
if(!(ssh2_exec($con, "kill ".$n['pid']))) {$result = "Ещё жив падла!";} else {$result = "Умер сука!";}
// Пишем в лог
$AddToKill = fwrite($open_logs, date("Y-m-d H:i:s")." PID: {$n['pid']} CPU: {$n['percent']} Time: {$n['time']} Proces: {$n['proces']} - $result\n");
}
}
}
?>
Получаю такой результат
Total CPU: 0 %
PID: CPU: S Time: %MEM Proces: TIME+
PID: 24323 CPU: 0.0 Time: 0:05.69 Proces: apache2
PID: 24384 CPU: 0.0 Time: 0:03.02 Proces: apache2
PID: 24414 CPU: 0.0 Time: 0:02.89 Proces: apache2
Скрипт работает
Но вот меня интересует вопрос:
Какие последствия могут быть если я кильну процесс который пожирает CPU и работает более чем 5 мин ?
Если это пользователь у него вроде должен в этот момент оборваться конект с сайтов… нет?
Или процессы www-data восстанавливаются если пользователь запросил опять страницу ?