Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: globaluty в Jan 29, 2015, 19:01



Титла: Скрипт за kill на процеси (overload)
Публикувано от: globaluty в Jan 29, 2015, 19:01
Здравейте,

търся наистина читав скрипт, който да килва/рестартира процеси, които надхвърлят 90% cpu usage в продължение на 10 секунди примерно. Това ще означава, че процесът е забил и трябва да бъде рестартиран.

Благодаря предварително.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: pennywise в Jan 29, 2015, 19:25
Хвърли око на монит - http://mmonit.com/monit/

Може да ти се струва малко прекалено, но е доста полезно.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: go_fire в Jan 29, 2015, 19:42
Не съм убеден, че това е сигурен знак, че нещо е забило. Процеси с интезивни изчисления не като да няма хиляди. По-скоро бих си пренаписал проблемите неща/


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: globaluty в Jan 29, 2015, 23:25
Не съм убеден, че това е сигурен знак, че нещо е забило. Процеси с интезивни изчисления не като да няма хиляди. По-скоро бих си пренаписал проблемите неща/

В моя случай става въпрос за наистина забил процес, който иска задължително рестартиране.

Все пак някой скрипт?

Ще погледна и твоето предложение pennywise, но ми трябва спешно такъв работещ скрипт.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: Astor в Jan 29, 2015, 23:34
Здравей globaluty,

Това, че процесорът (или сумарно всички налични виртуални процесори) е на 90% Usage е абсолютно нормално състояние и не е редно да kill-ваш нищо. Процесорът е за това да работи. Дали ще работи на 10-90 или 99% е абсолютно едно и също, не се отразява на производителността.

По скоро индикатор за това дали нещо е "забило" може да се приеме увеличението на load-а. Тогава нещо стои и чака за cpu време и се увеличава латентостта.

Дали е забил даден процес би било редно да провериш директно тествайки неговата наличност и тогава евентуално да предпиемеш мерки.

За по-пълна помощ може да споделиш кой/какъв точно процес те съмнява, че забива.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: pennywise в Jan 29, 2015, 23:57
Ако искаш специфични процеси при определен load, ползвай това и си го промени както ти изнася.

Код
GeSHi (Bash):
  1. #!/bin/sh
  2. # script to check server for extremely high load and restart Apache/Nginx/Varnish/MySQL if the cond$
  3. check=`cat /proc/loadavg | sed 's/\./ /' | awk '{print $1}'`
  4. # define max load avarage when script is triggered
  5. max_load='9'
  6. # log file
  7. high_load_log='/var/log/server_high_load_restart.log';
  8. #
  9. if [ $check -gt "$max_load" ]; then
  10. service nginx restart
  11. sleep 5;
  12. service php5-fpm restart
  13. sleep 5;
  14. service varnish restart
  15. echo "$(date) : Server Restart due to excessive load | $check |" >> $high_load_$
  16. fi
  17.  

Сложи го в кронтаб.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: gat3way в Jan 30, 2015, 01:38
Пълни простотии са това и широко отворена врата за по-големи золуми, без значение дали естествени или умишлени, с човешки характер. Ако става въпрос за уеб приложение, тогава вече е върховна тъпотия и мърлявщина на девелоперите. Единственото място където съм виждал такъв подход и където има смисъл е в разни realtime операционни системи като QNX. Там има установен watchdog механизъм, софтуерът трябва да е написан така че да ползва това API, периодично се изпращат "ping"-ове към определени критични процеси. Ако някой от тях не отговори в разумно време, следва рестарт на операционната система. Там има смисъл, защото касае или критични приложения където проблемът може да стане веднъж в рамките на години, но да е катастрофален, примерно рентгенов апарат или управление на електроцентрала, или пък да няма лесен и удобен начин да се дебъгне проблема и да се отстрани в движение, примерно ако е на някой марсоход. Но надали случаят е такъв.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: korea60 в Jan 30, 2015, 15:22
Използвам ред от коментара на pennywise, с разликата че е добавено и време за проверка, т.е. не се килва процеса веднага, а би трябвало да провери колкото пъти укажеш дали лоада е по-голям от зададеното.


import os
import time
from commands import getoutput


min=2
retries=2
interval=2

def check():
   count = retries
   while True:
      cpu = int(getoutput(`cat /proc/loadavg | sed 's/\./ /' | awk '{print $1}'`))
      print "This is CPU:'s", cpu
      if (cpu > min and count <= 0):
         print "Stana mnogo Golqm load-a.
         os.system("/etc/init.d/service restart")
      elif (cpu > min):
         count -= 1
         time.sleep(interval)
      else:
         count = retries
         time.sleep(interval)
         print  "OK cpu now is %s" % cpu   

check()


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: globaluty в Jan 30, 2015, 21:50
Здравейте,

давам пример със снимка: http://prikachi.com/images.php?images/255/7887255R.jpg

Това е гейм сървър, който използва в момента 63%. На машината има няколко такива.

Когато даден от тях превиши 90% и се задържи за определено време Х, то той да бъде килван/рестартиран.

Надявам се сега да са ме разбрали максимално повече хора.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: gat3way в Jan 31, 2015, 00:43
Нямам думи :)


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: zeridon в Jan 31, 2015, 10:52
Първо това не трябва да работи с руут щото си плаче за беля

Второ това че яде повечко цпу не е проблем

Подходът е да се провери дали ФУНКЦИОНИРА правилно. Дали приема заявки и т.н.

Ако все пак ужасно много настояваш да проверяваш само цпу натоварването за даден процес може да се ползва монит

Примерна проверка

Код
GeSHi (Bash):
  1. check process hlds-blqblq with pidfile /path/to/hlds.pid
  2.  stop program = "kill -9 `cat /path/to/hlds.pid`
  3.  start program = "whatever you use to start it" as uid hldsuser as gid hldsuser timeout 30"
  4.  if cpu > 80% for 5 cycles then restart
  5.  

Естествено трябва да си пипнеш нещата хлдс-то да си прави пид файл. Цикъл в монит обикновенно е 30 секунди. Името на процеса е относително свобоно. Процеса се определя в случая от pid файла.

За повече инфо за монит: http://mmonit.com/monit/documentation/monit.html


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: globaluty в Feb 01, 2015, 12:21
Благодаря за информацията.

В моя случай такъв голям cpu usage в 99.9% от случаите е еквивалент на НЕФУНКЦИОНИРАЩ правилно процес и единственото решение е restart, не знам защо се опитвате да ме убедите в обратното.


Титла: Re: Скрипт за kill на процеси (overload)
Публикувано от: 4096bits в Feb 01, 2015, 13:25
Пълни простотии са това и широко отворена врата за по-големи золуми, без значение дали естествени или умишлени, с човешки характер. Ако става въпрос за уеб приложение, тогава вече е върховна тъпотия и мърлявщина на девелоперите. Единственото място където съм виждал такъв подход и където има смисъл е в разни realtime операционни системи като QNX. Там има установен watchdog механизъм, софтуерът трябва да е написан така че да ползва това API, периодично се изпращат "ping"-ове към определени критични процеси. Ако някой от тях не отговори в разумно време, следва рестарт на операционната система. Там има смисъл, защото касае или критични приложения където проблемът може да стане веднъж в рамките на години, но да е катастрофален, примерно рентгенов апарат или управление на електроцентрала, или пък да няма лесен и удобен начин да се дебъгне проблема и да се отстрани в движение, примерно ако е на някой марсоход. Но надали случаят е такъв.
На марсоходите явно не използват нещо такова, ами ще да е  Win Server 2012 или нещо от сорта :D
Все пак, явно успяват някак да рестартират системата от разстояние от време на време,  та да се порадваме на измислени марсианци и следи от цивилизацията им.