Fórum Ubuntu CZ/SK
Ostatní => Tipy a triky pro Linux => Téma založeno: 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:
sudo apt-get install cpulimit
Demon ktereho vytvorime potrebuje take balik gawk takze ho instalujeme take:
sudo apt-get install gawk
VYTVORENI DEMONA
#!/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:
sudo chmod 700 /root/cpulimit_daemon.sh
ted si vytvorime par funkci k ovladani naseho demona:
sudo gedit /etc/init.d/cpulimit
do otevreneho editoru pak nasledne vlozime tohle:
#!/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
cd /etc/init.d/
sudo chown root:root cpulimit
nastavime prava
sudo chmod 755 cpulimit
a pridame ho aby se zpoustel pri startu:
sudo update-rc.d cpulimit defaults
provedeme restart
sudo reboot
KONTROLA STAVU, MANUALNI ZPUSTENI, VYPNUTI a RESTARTOVANI DEMONA
kontrola po restartu
sudo service cpulimit status
dve mozne odezvy: "cpulimit daemon is running" anebo "cpulimit daemon is not running".
zastaveni demona:
sudo service cpulimit stop
zpusteni demona
sudo service cpulimit start
pokud provadime nejaky zmeny v skriptu /root/cpulimit_daemon.sh napriklad zmena limitu a pod. tak je potreba restartu demona
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
sudo service cpulimit stop
vymazeme demona ze startovni procedury
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
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
-
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+
-
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?
-
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)
-
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.