Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Jak udrzet procesy na uzde [cpulimit]  (Přečteno 4133 krát)

petrakis

  • Stálý člen
  • **
  • Příspěvků: 513
Jak udrzet procesy na uzde [cpulimit]
« kdy: 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 , 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

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/


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


Znalosti ⇛ Linux: Pokročilý ┃ Programování: Pokročilý ┃ Angličtina: Pokročilý
Systém: Ubuntu 10.04 32-bit (en_US.utf8)
Specifikace⇛ Intel Core 2 E8400 3.00GHz │ RAM 3072 MiB │ DG31PR INTEL - Intel DG31PR Grafické karty: nVidia NV44 [GeForce 6200 TurboCache(TM)] [10DE:161] Sítě: Ethernet: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10EC:8168]

qUAKER

  • Host
Re: Jak udrzet procesy na uzde [cpulimit]
« Odpověď #1 kdy: 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+

Michal_

  • Návštěvník
  • Příspěvků: 25
Re: Jak udrzet procesy na uzde [cpulimit]
« Odpověď #2 kdy: 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?

petrakis

  • Stálý člen
  • **
  • Příspěvků: 513
Re: Jak udrzet procesy na uzde [cpulimit]
« Odpověď #3 kdy: 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)
Znalosti ⇛ Linux: Pokročilý ┃ Programování: Pokročilý ┃ Angličtina: Pokročilý
Systém: Ubuntu 10.04 32-bit (en_US.utf8)
Specifikace⇛ Intel Core 2 E8400 3.00GHz │ RAM 3072 MiB │ DG31PR INTEL - Intel DG31PR Grafické karty: nVidia NV44 [GeForce 6200 TurboCache(TM)] [10DE:161] Sítě: Ethernet: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10EC:8168]

petrakis

  • Stálý člen
  • **
  • Příspěvků: 513
Re: Jak udrzet procesy na uzde [cpulimit]
« Odpověď #4 kdy: 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.
Znalosti ⇛ Linux: Pokročilý ┃ Programování: Pokročilý ┃ Angličtina: Pokročilý
Systém: Ubuntu 10.04 32-bit (en_US.utf8)
Specifikace⇛ Intel Core 2 E8400 3.00GHz │ RAM 3072 MiB │ DG31PR INTEL - Intel DG31PR Grafické karty: nVidia NV44 [GeForce 6200 TurboCache(TM)] [10DE:161] Sítě: Ethernet: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10EC:8168]

 

Provoz zaštiťuje spolek OpenAlt.