Limitare l'uso della cpu con cpulimit



Mi capita spesso di eseguire processi che impegnano molto la cpu. In situazioni di questo tipo il rischio è che la macchina diventi di fatto inutilizzabile fintantoché il processo che sta occupando la cpu non finisce.

Altro rischio è che la cpu si surriscaldi eccessivamente portando il kernel a segnalazioni del tipo:

Jan 21 16:34:04 gundam kernel: [353615.424063] CPU1: Core temperature above threshold, cpu clock throttled (total events = 1)
Jan 21 16:34:04 gundam kernel: [353615.424084] CPU0: Core temperature above threshold, cpu clock throttled (total events = 1)
Jan 21 16:34:04 gundam kernel: [353615.425063] CPU0: Core temperature/speed normal
Jan 21 16:34:04 gundam kernel: [353615.425069] CPU1: Core temperature/speed normal
Jan 21 16:35:29 gundam kernel: [353699.988038] [Hardware Error]: Machine check events logged

Per porre rimedio a questo problema esiste un piccolo programmino da riga di comando il cui nome dice già tutto: cpulimit.

Questo programma agisce sul processo che si vuole limitare fermandolo e riattivandolo in modo che il carico sulla cpu non superi mai la percentuale stabilita.

Se ad esempio stiamo usando ffmpeg, che è notoriamente un programma che usa la cpu in modo intenso, per limitarne l'utilizzo della cpu al 50% eseguiremo:

# cpulimit -P `which ffmpeg` -l 50
Warning: no target process found. Waiting for it...
Process 7468 detected

Come si può vedere non è necessario che il processo (identificato dal suo fullpath) sia già attivo, appena cpulimit ne individua uno inizia a limitarlo.

Il processo da limitare può essere indicato tramite il fullpath, il nome oppure il pid.

gtrev@gundam:~$ cpulimit -h
CPUlimit version 1.7
Usage: cpulimit TARGET [OPTIONS...]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
                         The -e option only works when
                         cpulimit is run with admin rights.
      -P, --path=PATH    absolute path name of the
                         executable program file
   OPTIONS
      -b  --background   run in background
      -c  --cpu=N        override the detection of CPUs on the machine.
      -l, --limit=N      percentage of cpu allowed from 1 up.
                         Usually 1 - 200, but can be higher
                         on multi-core CPUs (mandatory)
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process,
                         or if it dies
      -h, --help         display this help and exit
gtrev@gundam:~$

Per installare cpulimit in debian wheezy è sufficiente usare apt:

 # apt-get install cpulimit

Blog: 

Programmazione: 

Analizzare i log di apache



Analizzare manualmente i log di apache è un'operazione lunga e noiosa. Esistono vari strumenti che ci vengono in aiuto come ad esempio awstats.

Uno strumento meno conosciuto ma che ha il pregio per me di funzionare solo da riga di comando è goaccess.

Goaccess permette di fare analisi in real time sui log di apache e nginx, fornendo l'output direttamente a riga di comando oppure in formato html, csv o json.

Goaccess è presente nei repository di debian quindi per installarlo è sufficiente fare un :

  $ apt-get install goaccess

L'inconveniente principale è che la versione presente ad oggi nei repository di debian è la 0.5, mentre l'ultima upstream ufficiale è la 0.8.5. Se si vuole quindi essere bleeding edge si possono utilizzare i repository ufficiali di goaccess come descritto qui.

Una volta installato gli si deve spiegare come sono strutturati i log di apache. Nel mio caso ho definito un file nella mia home che si chiama .goaccessrc con il seguente contenuto:

  date_format %d/%b/%Y
  log_format %h %^[%d:%^] "%r" %s %b "%R" "%u"

A questo punto, per avere un dettaglio giornaliero possiamo usare il comando:

  zcat -f /var/log/apache2/access.log* | grep "$(date +%d/%b/%Y)" | goaccess -a -p ~/.goaccessrc

Se invece vogliamo il dettaglio mensile:

  zcat -f /var/log/apache2/access.log* | grep "$(date +/%b/%Y)" | goaccess -a -p ~/.goaccessrc

Infine se vogliamo il dettaglio in html in modo da poterlo navigare in un browser:

  zcat -f /var/log/apache2/access.log* | goaccess -a -p ~/.goaccessrc > /tmp/report.html

Blog: 

Programmazione: 

Trucchetto SSH (e nc)

Mi capita di dover connettermi a delle macchine all'interno di una lan che non hanno alcuna porta esposta verso internet. La lan ha una sola macchina esposta su internet che ha il servizio SSH attivo. Solitamente quindi si accede prima alla macchina esposta, che chiameremo A, e da questa alle successive (che chiameremo B,C,...):

 $ ssh A
 A$  ssh B

C'è però un piccolo trucco di ssh che permette di eseguire direttamente un ssh B senza apparentemente passare prima per il ssh A e prevede l'uso combinato di ssh e netcat.

Andiamo infatti a definire nel file .ssh/config la seguente entry:

1
2
3
4
5
6
7
8
9
Host A
    Hostname    1.2.3.4
    User        pippo
    IdentityFile               ~/.ssh/id_rsa
 
Host B
     User                       pippo
     HostName                   192.168.10.20
     ProxyCommand               ssh -q A nc %h 22

Alla prima riga andiamo a definire i parametri per accedere al server della lan esposto su internet, mentre alla riga 6 indichiamo che quando viene richiesta una connessione all'host B prima viene eseguita una connessione ad A che agisce da proxy verso B.

Con questo piccolo trucchetto possiamo dimenticarci che dobbiamo passare prima per A per andare a B e ci permette di fare direttamente un ssh B.

Blog: 

Programmazione: 

Pagine

Subscribe to gtrev RSS