Apache/Passenger i cpulimit


Prowadzę witrynę Ruby on Rails, która obsługuje e-maile - e-mail jest przesyłany bezpośrednio do aplikacji internetowej za pośrednictwem POST z Postfix.
Od czasu do czasu mogę otrzymać gwałtowny wzrost liczby wiadomości e-mail, powodujący długi wzrost wykorzystania procesora, co sprawia, że ​​mój dostawca VPS jest ze mnie niezadowolony. Te wiadomości e-mail nie muszą być przetwarzane w odpowiednim czasie - wystarczy je (po pewnym czasie) przetworzyć.
Oczywiście nie mogę po prostu uprościć procesu, ponieważ patrzy tylko na użycie procesora na moim VPS i nie może brać pod uwagę użycia procesora w innych VPS.
Znalazłem narzędzie o nazwie cpulimit, które pozwoli ci ustawić sztywne limity użycia procesora dla określonego procesu. (na przykład 20%). Wydaje się idealne do tego celu, ale nie mogę zintegrować się z apache/pasażerami.
Pasażer uruchamia proces ruby ​​dla każdego serwera i okresowo je restartuje. Za każdym razem pid się zmieni. Cpulimit potrzebuje numeru pid, aby działał.
Czy ktoś ma jakieś pomysły, jak mogę skłonić pasażera do wywołania tego wywołania polecenia, gdy ten konkretny wirtualny host zostanie uruchomiony?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie jestem pewien, czy jest to idealne rozwiązanie, ale z braku lepszego pomysłu napisałem mały skrypt, aby to śledzić i wywołać za mnie cpulimit.
Zawarłem to poniżej na wypadek, gdyby ktoś tego potrzebował.
#!/home/dgs/.rvm/rubies/ruby-1.9.3-p125-perf/bin/ruby# script to check for mail server processes and enforce a cpulimit on them# cmd to get the pid of the process you want to limit. 
YOU WOULD NEED TO MAKE THIS RELEVANT TO YOU
CMD='ps -ef | grep mailserver | grep Rack | grep -v grep | awk "{print \$2}"'# how often to check
PERIOD = 60#array to hold list of the currently limitied processes
limiting = []while true
processes = `#{CMD}`.split("\n") # iterate thru the newly found processes, limiting any that
# aren't already being limited
processes.each do |p|
if ! limiting.include? p
system "cpulimit -p #{p} -l 10 -z &"
limiting << p
end
end # check if any old processes have been killed
limiting.each do |p|
begin
Process.getpgid( p.to_i )
rescue Errno::ESRCH
limiting.delete p
end
end
sleep PERIOD
end

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się