ФорумПрограммированиеPHP для идиотов → Парсер CPU на PHP

Парсер CPU на PHP

  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 26 июля 2011 г. 15:04, спустя 38 минут 13 секунд

    Здравствуйте

    Меня где то неделю начал мучать 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 восстанавливаются если пользователь запросил опять страницу  ?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 26 июля 2011 г. 13:46, спустя 22 часа 41 минуту 7 секунд

    спасибо за ип, рута и его пароль!
    Сапожник без сапог
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 26 июля 2011 г. 13:54, спустя 8 минут 30 секунд

    Бля во я лоханулся …. пиздец
    удалите конеты )
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 26 июля 2011 г. 14:04, спустя 10 минут 4 секунды

    лад, хорошо что новый vps не успел на нем что то поставить ))
    Но все равно пиздец ))
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 26 июля 2011 г. 14:19, спустя 14 минут 45 секунд

    Теперь все норм бывает и такое…
    Спустя 19 сек.
    Вопрос остается в силе )
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 26 июля 2011 г. 14:22, спустя 2 минуты 55 секунд

    хехе)) а чо яйки то подхал? зазвенели? xD
    Сапожник без сапог
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 26 июля 2011 г. 14:26, спустя 4 минуты 26 секунд

    phpdude, а то)) забыл этот код отредактировать после того как писать сюда.
    Дуд можешь пожалуйста IP замазать ))
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 26 июля 2011 г. 15:05, спустя 38 минут 28 секунд

    тебе все таки удалось победить мою лень)) замазал
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 июля 2011 г. 15:21, спустя 15 минут 52 секунды

    хороший скриптик, плюсанул.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 26 июля 2011 г. 15:25, спустя 4 минуты 23 секунды

    Какие последствия могут быть если я кильну процесс который пожирает CPU и работает более чем 5 мин ?

    да нихуя страшного, ктото просто увидит "соединение оборвано" :-)

    и то возможно не оборвается, думаю зависит от типа процесс менеджменат апача - mpm, prefork.

    именно апачу не тсрашно потерять форки, ты главное рутовый процесс не пристрели xD

    если пристрелишь - уже не будут они оживать, надо будет перезапускать апач)
    Сапожник без сапог
  • mexys

    Сообщения: 19 Репутация: N Группа: Кто попало

    Spritz 26 июля 2011 г. 21:13, спустя 5 часов 48 минут 33 секунды

    Все это конечно хорошо, но лучше с причиной разобраться чем с симптомами. Сам по себе апач таким вещам не особо подвержен.
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 июля 2011 г. 21:22, спустя 8 минут 54 секунды

    tartar, капитан очевидность сказал правду.
    ты не выяснил отчего тормоза? какие модули апача установлены, расширения php? были сообщения, что иногда eacclerator создает дикие тормоза.
    ιιlllιlllι унц-унц
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 27 июля 2011 г. 0:04, спустя 2 часа 41 минуту 42 секунды

    ты главное рутовый процесс не пристрели xD

    Сортировку сделал по "top -b -n 1 -u www-data" так что root сюда не попадет.

    Все это конечно хорошо, но лучше с причиной разобраться чем с симптомами. Сам по себе апач таким вещам не особо подвержен.

    На vps установлен LAMP Server (linux, apache, mysql, php)

    Когда CPU 100%, на вершине команды htop вот это строка
    4565 www-data 20 0 292M 18352 4856 S 99% 3.5 0:03.51 /usr/sbin/apache2 -k start

    Согласен, питался выяснить в логах папача, нет ошибок во время скачка CPU
    - Проверил и логи сайтов (хз мб ддосят) чисты хотя гугл заглядывает но он не только в это время заглядывал

    eacclerator создает дикие тормоза

    хм, да eacclerator установлен попробую удалить его
    Спустя 108 сек.
    удалось победить мою лень)) замазал

    большое спасибо :)
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 27 июля 2011 г. 0:09, спустя 5 минут 16 секунд

    нахуй нужен этот апач в пизду его блять
  • Sinkler

    Сообщения: 8086 Репутация: N Группа: в ухо

    Spritz 27 июля 2011 г. 0:13, спустя 3 минуты 14 секунд

    кстати, того же мнения, как-то после полного перехода на нгинкс пол года назад, к апачу вообще не тянет

Пожалуйста, авторизуйтесь, чтобы написать комментарий!