Come impostare il limite della cpu per un determinato processo in modo permanente. Cpulimit e nice non funzionano


12

Ci sono molte domande simili, ma nessuna mi aiuta con il mio problema.

Ho Ubuntu 11.10 sul server (è la versione desktop). Ho un sito web in esecuzione su di esso. C'è un processo che è molto importante, ma non deve essere eseguito con priorità alta. Voglio limitare in modo permanente l'utilizzo della CPU per il processo , non per l'utente. Questo processo è gestito dalla funzione exec (è la funzione php, non il processo di sistema).

Quindi vedo 2 opzioni: 1. Aggiungi qualche tipo di limite ogni volta che viene eseguita la funzione. 2. Limitare l'utilizzo della cpu in modo permanente per questo processo.

Ho provato a usare "nice" e cpulimit, ma nulla sembra funzionare. Nice non ha alcun effetto e cpulimit (con -e) dice: "nessun processo target trovato".

Sono piuttosto un principiante, quindi per favore presumi che non so quasi nulla.


Puoi per favore dirci cosa hai provato. i cgroups possono farlo per te.
Pantera

Per quanto riguarda la configurazione, è possibile eseguire il cgsnapshot -sper recuperare le informazioni senza scrivere manualmente il file di configurazione, quest'ultimo non è raccomandato.
Mingliang Liu,

Vuoi effettivamente limitare il processo, ovvero assicurarti che non superi mai un determinato periodo di tempo?
Ken Sharp,

Ho usato questo metodo e ha funzionato per me .. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

Risposte:


19

In assenza dei dettagli richiesti ...

Ecco come utilizzo i cgroup su Ubuntu.

Durante questo post, dovrai cambiare la variabile "$ USER" per l'utente che esegue il processo

Ho aggiunto informazioni per la memoria e questa sarà una FAQ, se non ti serve non usarla.

1) Installa cgroup-bin

sudo apt-get install cgroup-bin

2) Riavvia. cgroups ora si trova in/sys/fs/cgroup

3) Crea un cgroup per il tuo utente (il proprietario del processo)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) Il tuo utente può gestire le risorse. Per impostazione predefinita, gli utenti ottengono 1024 unità di CPU (condivisioni), quindi per limitare a circa il 10% di CPU, la memoria è in byte ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Inizia il processo (cambia exec in cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Configurazione

Supponendo che i cgroups stiano lavorando per te;)

Modifica /etc/cgconfig.conf, aggiungi nel tuo cgroup personalizzato

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

Aggiungi nel tuo cgroup. Cambia di nuovo $ USER con il nome utente proprietario del processo.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

Puoi anche specificare gruppi gid=$GROUP, /etc/cgconfig.conf è ben commentato.

Ora esegui di nuovo il tuo processo con cgexec -g cpu:$USER command <options>

Puoi vedere il tuo processo (tramite PID) in /sys/fs/cgroup/cpu/$USER/tasks

Esempio

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi sleep 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / task

1499

Per ulteriori informazioni consultare: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
Sono riuscito a finire la parte 1. Funziona, ma è necessario aggiungere informazioni che il processo è limitato solo mentre altri processi richiedono CPU / memoria. Non è ovvio - e mi ci vuole molto per capire (dato che sono un principiante). Comprendo correttamente che "Configurazione" consente di salvare le impostazioni anche dopo il riavvio?
Rafal

1
Sono contento che tu l'abbia risolto. C'è un po 'di una curva di apprendimento =) Sì, la configurazione è mantenere le impostazioni durante l'avvio.
Pantera

Quando uso cgroup dalla riga di comando funziona benissimo. Ma quando eseguo lo stesso comando dalla funzione exec in php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); non funziona. L'unica differenza è che dalla riga di comando uso file che sono in cartella in cui mi trovo e da php utilizzo un percorso lungo per quei file. Hai idea di quale possa essere un problema? Uso lo stesso utente in entrambi i casi
Rafal

1
@Rafal: il tuo primo commento non è corretto, la memoria dovrebbe essere limitata anche se nessun altro processo sta occupando molta memoria.
Flimm,

1
@Flimm Durante il test di questa soluzione erano in esecuzione solo 2 processi: apache e processo che dovrebbero essere limitati. Quando nessuna connessione ad Apache era attiva o c'era solo una connessione ad Apache, quel processo limitato occupava il 100% della CPU. Si è limitato solo quando sono state attivate diverse connessioni ad Apache (l'ho fatto rinnovando molto il sito Web dal browser Web). Quindi forse è stato il caso di nessun altro processo in esecuzione.
Rafal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.