PDA

View Full Version : Comando *NIX per poter settare la percentuale di processore per un processo


SimonJ
22-03-2007, 19:47
Salve a tutti,
dopo una ricerca in internet e tra il man di freeBSD alla voce nice, renice ed affini, non sono stato in grado di trovare il comando che mi interessa.
In pratica vorrei assegnare ad un determinato processo al massimo XX percentuale di processore.
Come posso fare?

In attesa di un vostro aiuto, un saluto.

Simone

jimmazzo
24-03-2007, 15:24
Cerchi "renice" ?
Dai un'occhiata quì http://www.opengroup.org/onlinepubs/007908799/xcu/renice.html .

Se guardi anche il man del comando noti che impostando un valore basso aumenta la priorità del processo.
I valori dovrebbero essere compresi tra -20 e (+) 20 ; ma da come leggo su una guida cartacea solo l'amministratore (root) può impostare valori i negativi.

Ciao.

Edit: Ho toppato :D , leggendo di fretta non avevo notato che avevi già controllato "renice" .

darkbasic
24-03-2007, 16:12
solo l'amministratore (root) può impostare valori i negativi
...e questo è uno dei motivi per i quali usare kernel patchati con kolivas :cool:

jimmazzo
24-03-2007, 17:33
...e questo è uno dei motivi per i quali usare kernel patchati con kolivas :cool:

Non la conoscevo, ho letto le varie migliorie che apporta da vari siti e sembra davvero un' ottima patch per rendere veloce un sistema multimediale (ho letto anche che non migliora molto le prestazioni nei sistemi smp, ma io ho un vecchio athlon-xp e quindi andrebbe benone).

La usi da molto questa patch? Il sistema oltre ad essere performante è anche stabile?

Grazie della dritta Darkbasic, credo che la proverò ;)

darkbasic
24-03-2007, 17:45
La usi da molto questa patch?
No, soltanto da pochi mesi.

Il sistema oltre ad essere performante è anche stabile?
Stabilissimo, inoltre con schedtool e SCHED_IDLEPRIO posso ricompilare il kernel e giocare a quake4 senza cali di framerate, oppure con SCHED_ISO posso settare una priorità molto alta ad amarok (senza bisogno dei privilegi di root) per continuare a sentire la musica senza il benchè minimo salto dell'audio mentre codifico un xvid etc.. etc.. :cool:

Grazie della dritta Darkbasic, credo che la proverò ;)
Ti consiglio di provarla, non te ne pentirari ;)

SimonJ
25-03-2007, 18:17
Vi ringrazio per i suggerimenti e per i post.

Mi interesserebbe tale comando per poter realizzare la seguente cosa: studiando con un portatile in biblioteca avrei la necessità di eseguire dei processi limitando il "consumo" di cpu per evitare che la temperatura aumenti con una conseguente aumento della velocità delle ventole, evitando così disturbo agli altri utenti.


Simone

ilsensine
26-03-2007, 07:56
Vi ringrazio per i suggerimenti e per i post.

Mi interesserebbe tale comando per poter realizzare la seguente cosa: studiando con un portatile in biblioteca avrei la necessità di eseguire dei processi limitando il "consumo" di cpu per evitare che la temperatura aumenti con una conseguente aumento della velocità delle ventole, evitando così disturbo agli altri utenti.

Non c'è un vero e proprio modo per limitare la percentuale di processore. renice non va bene, in quanto anche se imposti una priorità "idle", il processo otterrebbe tutte le risorse di processore se non ci sono altri processi in esecuzione. Neanche ulimit viene in aiuto, in quanto consente di impostare solo il tempo massimo di processore (esautiro il quale, il processo viene ucciso). Quindi la soluzione ideale sarebbe modificare il sorgente del programma.
Una possibile alternativa - molto hackish - è eseguire uno script che arresta e riavvia il processo ciclicamente:

#!/bin/bash

PROCNAME="nome del tuo processo"

PID=`pidof $PROCNAME`

if [ "$PID" == "" ]; then
echo Processo $PROCNAME non in esecuzione
exit
fi

while kill -0 $PID; do
sleep 1
kill -STOP $PID
sleep 1
kill -CONT $PID
done

echo Processo $PROCNAME terminato.

Questo script lascia in esecuzione il processo per un secondo, poi lo arresta per un secondo, ecc. Variando i valori degli sleep, puoi ottenere il consumo di processore desiderato.
Con sleep puoi solo impostare una granularità nell'ordine del secondo, accettabile solo per alcuni processi eseguiti in background. Per processi interattivi, devi sostituire la sleep con qualcosa in grado di "dormire" con granularità inferiori; se hai una minima conoscenza di c puoi farti ad esempio un programma "msleep".

Psycotic
26-03-2007, 16:24
che mi dite rigurdo cpulimit? Lo usato poco quindi nn ne conosco la stabilita' . Lo usavo x giocare a scacchi perche' il gioco usava troppo cpu e mi partiva il ventolone a manetta e in ufficio nn era il massimo

darkbasic
26-03-2007, 16:43
eseguire uno script che arresta e riavvia il processo ciclicamente

Ho fatto una cosa molto simile per evitare un surriscaldamento eccessivo, ma devo dire che per limitare l'utilizzo della cpu non mi sembra una soluzione ottimale, anche se non mi viene in mente nient'altro...

#!/bin/sh
> ~/ALARM
soglia=58
quit="false"
while [ $quit != "true" ]; do
sleep 10
temp=`cat /proc/acpi/thermal_zone/THRM/temperature | awk '{ print $2 }'`
if [ $temp -ge $soglia ]; then
processo=`ps aux | sort -rk 3 | sed -n -e 2p`
pid=`echo $processo | awk '{ print $2 }'`
echo $processo >> ~/ALARM
echo -e "Date: "`date`" Temp: "$temp" Uptime: "`uptime | awk '{ print $3 }'` >> ~/ALARM; echo -e "\a"
kill -19 $pid
sleep 5
temp=`cat /proc/acpi/thermal_zone/THRM/temperature | awk '{ print $2 }'`
if [ $temp -ge $soglia ]; then
quit="true"
echo "ATTENZIONE: la temperatura (ora pari a "$temp" °C) non accenna a diminuire. Shutdown in corso..." >> ~/ALARM
ps aux >> ~/ALARM
echo -e "\n\n\n" >> ~/ALARM
else
echo -e "La temperatura si è stabilizzata a "$temp" °C. Il processo verrà messo nuovamente in esecuzione...\n\n" >> ~/ALARM
kill -18 $pid
fi
fi
done
shutdown -h now

ilsensine
26-03-2007, 16:47
che mi dite rigurdo cpulimit? Lo usato poco quindi nn ne conosco la stabilita' . Lo usavo x giocare a scacchi perche' il gioco usava troppo cpu e mi partiva il ventolone a manetta e in ufficio nn era il massimo
Non so se è compatibile con freeBSD...

marco.r
26-03-2007, 17:29
Salve a tutti,
dopo una ricerca in internet e tra il man di freeBSD alla voce nice, renice ed affini, non sono stato in grado di trovare il comando che mi interessa.
In pratica vorrei assegnare ad un determinato processo al massimo XX percentuale di processore.
Come posso fare?

In attesa di un vostro aiuto, un saluto.

Simone
Non mi risulta sia possibile farlo in FreeBSD.
Se e' un problema di ventole, potresti aggirare il problema forzando la cpu ad una frequenza bassa. Per prima cosa verifica le frequenze supportate dal tuo processore:

sysctl dev.cpu.0.freq_levels

ti ritorna qualcosa tipo:

dev.cpu.0.freq_levels: 1743/-1 1525/-1 1307/-1 1089/-1 871/-1 653/-1 435/-1 217/-1


Poi prendi una bassa e la imposti:

sysctl dev.cpu.0.freq=435

Per funzionare devi pero' fermare eventuali servizi come powerd o power_profile

linuxianoxcaso
26-03-2007, 18:03
Stabilissimo, inoltre con schedtool e SCHED_IDLEPRIO posso ricompilare il kernel e giocare a quake4 senza cali di framerate, oppure con SCHED_ISO posso settare una priorità molto alta ad amarok (senza bisogno dei privilegi di root) per continuare a sentire la musica senza il benchè minimo salto dell'audio mentre codifico un xvid etc.. etc.. :cool:



in che modo setti la priorità di un processo con SCHED_ISO ?
mi potresti fare un esempio grazie :D
spesso con amarok salta il suono e ora sono curioso di provare questo pachset per non avere più di questi problemi :D

darkbasic
26-03-2007, 18:06
schedtool -I -e applicazione
per SCHED_ISO

schedtool -D -e applicazione
per SCHED_IDLEPRIO

linuxianoxcaso
26-03-2007, 18:12
schedtool -I -e applicazione
per SCHED_ISO

schedtool -D -e applicazione
per SCHED_IDLEPRIO

grazie mille :D
quindi il primo è per la priorità alta ed il secondo per bassa priorità vero ?

darkbasic
26-03-2007, 18:35

SimonJ
26-03-2007, 23:11
Mi complimento con voi per le vostre conoscenze.
Per caso su Mac OSX è possibile? Oppure sono presenti sempre queste limitazioni?