Apache / Passenger et cpulimit

Je commence le site ruby ​​on rails, quel processus traite e-mail - Le courrier électronique est déchargé directement sur l'application Web via POST de postfix.

De temps en temps, je peux avoir une splash d'email, causant une longue éclaboussure de l'utilisation de la CPU, c'est pourquoi mon fournisseur VPS n'est pas satisfait de moi. Ces courriels n'ont pas besoin d'être traités dans les meilleurs délais. - Ils sont juste nécessaires (avec le temps) traiter.

Évidemment, je ne peux pas simplement simplifier le processus, car il ne semble que l'utilisation d'un processeur sur mon VPS et ne peut pas tenir compte de l'utilisation du processeur sur d'autres VPS.

J'ai trouvé un utilitaire appelé cpulimit, Ce qui vous permettra d'établir des restrictions difficiles à l'utilisation du processeur pour un processus spécifique. (par exemple, 20%). Il semble idéal à cette fin, mais je ne peux pas m'intégrer avec apache / passagers.

Passenger Exécute un processus Ruby pour chaque serveur et redémarre périodiquement. Chaque fois que le PID changera. Cpulimit besoin d'assigner une chambre pid, De sorte qu'il a agi.

Est-ce que quelqu'un a des idées comme moi pour forcer le passager à commencer à appeler cette commande lors du démarrage de cet hôte virtuel particulier?
Invité:

Blanche

Confirmation de:

Je ne suis pas sûr que c'est la solution parfaite, mais à cause du manque de meilleure idée, j'ai écrit un petit script pour le suivre et me causer cpulimit.

Je l'ai inclus ci-dessous si cela est utile à quelqu'un d'autre.

#!/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

Pour répondre aux questions, connectez-vous ou registre