Fórum Ubuntu CZ/SK

Ostatní => Tipy a triky pro Linux => Téma založeno: petrakis 25 Srpna 2009, 10:31:50

Název: Jak udrzet procesy na uzde [cpulimit]
Přispěvatel: petrakis 25 Srpna 2009, 10:31:50
Mozno hodne z vas cpulimit zna, doufam ze dalsim tenhle navod pomuze tak jako mne. Pouzivanim cpulimit-u jako demona se mi podarilo zabranit nadmernemu prehrivani pri screensaveru http://forum.ubuntu.cz/index.php/topic,38588.0.html (http://forum.ubuntu.cz/index.php/topic,38588.0.html) , rhythmbox pri obycejnem hrani radia prestal vyskakovat az na 60% spotreby CPU a podobne.


INSTALACE
pro absolutni zacatek potrebujeme nasledovne:

Kód: [Vybrat]
sudo apt-get install cpulimit
Demon ktereho vytvorime potrebuje take balik gawk takze ho instalujeme take:

Kód: [Vybrat]
sudo apt-get install gawk
VYTVORENI DEMONA
 
Kód: [Vybrat]
#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================

# Variables
CPU_LIMIT=20        # Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3  # Daemon check interval in seconds
BLACK_PROCESSES_LIST=   # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST=   # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.

# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.
if [[ -n "$BLACK_PROCESSES_LIST" &&  -n "$WHITE_PROCESSES_LIST" ]] ; then    # If both variables are defined then error is produced.
   echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
   exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
   NEW_PIDS_COMMAND="top -b -n1 -c | grep '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi

# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
   NEW_PIDS=$(eval "$NEW_PIDS_COMMAND")                                                                    # Violating PIDs
   LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}')                                          # Already limited PIDs
   QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')   # PIDs in queue

   for i in $QUEUE_PIDS
   do
       cpulimit -p $i -l $CPU_LIMIT -z &   # Limit new violating processes
   done
done

Skript si ulozime jako: cpulimit_daemon.sh

Ted si vysvetlime par dulezitych veci ohledne demona (pro anglicky nemluvicich). Na zacatku scriptu pod #Variables mame 4 variables (promenne).
CPU_LIMIT -> nastaveni maximalniho limitu pro jednotlivy proces v procentech
DAEMON_INTERVAL -> interval v sekundach aby demon udelal kontrolu vytizeni a upravil ji
BLACK_PROCESSES_LIST -> sem muzeme dat procesy ktere chceme limitovat, pokud tuto prmennou ponechame prazdnou (jak je to ve skritpu) vsechny procesy prekracujici limit budou upravovany
WHITE_PROCESSES_LIST -> pravy opak pro BLACK_PROCESSES_LIST, pokud sem zapiseme jakykoliv proces, danej proces nebude limitovan, jestli promennou nechame prazdnou znova vsechny procesy prekracujici limit budou demonem upravovany

Dulezite: jednu anebo obe z promennych BLACK_PROCESSES_LIST anebo WHITE_PROCESSES_LIST vzdy nechavejte prazdnou

Do promennych BLACK_PROCESSES_LIST anebo WHITE_PROCESSES_LIST muzete samozrejme zapisovat vice procesu za pouziti nasledujicich charakteru: \|
Priklad (nasledujici procesy nebudou nikdy limitovany): WHITE_PROCESSES_LIST="mysql\|firefox\|gedit"

NASTAVENI DEMONA, PRAVA A ZPOUSTENI PRI STARTU

nas skript cpulimit_daemon.sh si ted premistnime do adresare root (najdeme ho pod systemem)
po premistneni nastavime prava:

Kód: [Vybrat]
sudo chmod 700 /root/cpulimit_daemon.sh
ted si vytvorime par funkci k ovladani naseho demona:

Kód: [Vybrat]
sudo gedit /etc/init.d/cpulimit
do otevreneho editoru pak nasledne vlozime tohle:

Kód: [Vybrat]
#!/bin/sh
#
# Script to start CPU limit daemon
#
set -e
. /lib/lsb/init-functions
case "$1" in
start)
nohup /root/cpulimit_daemon.sh &
;;
stop)
ps -eo pid,args | gawk '$3=="/root/cpulimit_daemon.sh"  {print $1}' | xargs kill -9   # kill cpulimit daemon
ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9       # release cpulimited process to normal priority
;;
restart)
$0 stop
sleep 5
$0 start
;;
status)
ps -eo pid,args | gawk '$3=="/root/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'
;;
esac
exit 0

a ulozime ho (SAVE)

dalsim krokem je zmena majitele souboru, pridelime ho root-u

Kód: [Vybrat]
cd /etc/init.d/
sudo chown root:root cpulimit

nastavime prava

Kód: [Vybrat]
sudo chmod 755 cpulimit
a pridame ho aby se zpoustel pri startu:

Kód: [Vybrat]
sudo update-rc.d cpulimit defaults
provedeme restart

Kód: [Vybrat]
sudo reboot

KONTROLA STAVU, MANUALNI ZPUSTENI, VYPNUTI a RESTARTOVANI DEMONA

kontrola po restartu

Kód: [Vybrat]
sudo service cpulimit status
dve mozne odezvy: "cpulimit daemon is running" anebo "cpulimit daemon is not running".

zastaveni demona:

Kód: [Vybrat]
sudo service cpulimit stop
zpusteni demona

Kód: [Vybrat]
sudo service cpulimit start
pokud provadime nejaky zmeny v skriptu /root/cpulimit_daemon.sh napriklad zmena limitu a pod. tak je potreba restartu demona

Kód: [Vybrat]
sudo service cpulimit restart

1,2,4 -JADRO-ve PROCESORY


Cely vyse uvedeny postup je pro jednojadrovy processor. Pokud vas processor ma vice jader hodnotu CPU_LIMIT musite nasobit, nakolik se jedna o multiprocessing http://en.wikipedia.org/wiki/Symmetric_multiprocessing (http://en.wikipedia.org/wiki/Symmetric_multiprocessing)

Takze pri procesoru napriklad Intel Core-Duo hodnota CPU_LIMIT bude 40

ODSTRANENI, ODINSTALACE DEMONA A CPULIMIT PROGRAMU

zastavime demona

Kód: [Vybrat]
sudo service cpulimit stop
vymazeme demona ze startovni procedury

Kód: [Vybrat]
sudo update-rc.d -f cpulimit remove  # Remove symbolic links
sudo rm /etc/init.d/cpulimit         # Delete cpulimit boot-up script
sudo rm /root/cpulimit_daemon.sh     # Delete cpulimit daemon script

odinstalujeme cpulimit

Kód: [Vybrat]
sudo apt-get cpulimit remove
DOMOVSKA STRANKA CPULIMIT PROGRAMU

http://cpulimit.sourceforge.net/ (http://cpulimit.sourceforge.net/)


Navod prevzanej z http://ubuntuforums.org/showthread.php?t=992706 (http://ubuntuforums.org/showthread.php?t=992706) a potvrzena plna funkcnost pro Ubuntu 9.04


Název: Re: Jak udrzet procesy na uzde [cpulimit]
Přispěvatel: qUAKER 25 Srpna 2009, 16:52:43
díky za návod. Vyzkouším pro balíčkování, jestli mi to umožní na mém jednojádru zrychlit systém při práci když se kompiluje. K+
Název: Re: Jak udrzet procesy na uzde [cpulimit]
Přispěvatel: Michal_ 06 Září 2009, 09:58:50
Díky, tohle je přesně něco, po čem už delší chvíli pátrám.

Naneštěstí po příkazu "sudo service cpulimit start" mi to vypisuje: "výstup připojuji k nohup.out" a nic se neděje. Nevěděl byste co s tím?
Název: Re: Jak udrzet procesy na uzde [cpulimit]
Přispěvatel: petrakis 06 Září 2009, 10:13:20
Ten start trosicka blbnul i mne, po restartu pocitace a nasledne kontrole uvidis ze se ti deamon spustil avse funguje jako ma. (samozrejme za predpokladu ze si vse nastavil, myslim zpusteni deamonu pri startu jak to je popsano)
Název: Re: Jak udrzet procesy na uzde [cpulimit]
Přispěvatel: petrakis 06 Září 2009, 10:34:26
K pouziti cpulimit jedna poznamka z vlastni zkusenosti. V pripade ze pouzivate Photoshop pod Wine , dejte si jeho proces do WHITE LISTU aby nebyl omezovan. Photoshop pri startu (jenom pri startu) si potrebuje ucucnout trochu vice. Jelikoz to bezi pod wine, tak to skace jeste vis, a pri limitaci, se vam muze stat ze plne nabehne az po 4-te, 5-te. proste proces kdyz je limitovan, neni schopen nacitat vsechny knihovny a behem startu se zavira. Hned jak je ve WHITE LISTU, tenhle problem konci.