Festlegen des CPU-Grenzwerts für einen bestimmten Prozess. Cpulimit und nett funktionieren nicht


12

Es gibt viele ähnliche Fragen, aber keine hilft mir bei meinem Problem.

Ich habe Ubuntu 11.10 auf dem Server (es ist Desktop-Version). Ich habe eine laufende Website. Es gibt einen Prozess, der sehr wichtig ist, aber nicht mit hoher Priorität ausgeführt werden muss. Ich möchte dauerhaft CPU - Auslastung begrenzen für Prozess , nicht für Benutzer. Dieser Prozess wird von der exec-Funktion ausgeführt (es ist eine PHP-Funktion, kein Systemprozess).

Ich sehe also 2 Optionen: 1. Füge bei jeder Ausführung einer Funktion eine Art Limit hinzu. 2. Beschränken Sie die CPU-Auslastung für diesen Prozess dauerhaft.

Ich habe versucht, "nice" und cpulimit zu verwenden, aber nichts scheint zu funktionieren. Nice hat keine Wirkung und cpulimit (mit -e) sagt: "no target process found".

Ich bin ein ziemlicher Anfänger, also nehmen Sie bitte an, dass ich fast nichts weiß.


Können Sie uns bitte sagen, was Sie versucht haben. cgroups kann dies für Sie tun.
Panther

In Bezug auf die Konfiguration können Sie das Programm ausführen cgsnapshot -s, um die Informationen abzurufen, ohne die Konfigurationsdatei manuell zu schreiben. Letzteres wird nicht empfohlen.
Mingliang Liu

Möchten Sie den Prozess tatsächlich drosseln, dh sicherstellen, dass er niemals eine festgelegte Zeitspanne überschreitet?
Ken Sharp

Ich habe diese Methode angewendet und sie hat bei mir funktioniert
Mustafa Salman

Antworten:


19

In Ermangelung der angeforderten Details ...

Hier ist, wie ich cgroups auf Ubuntu verwende.

In diesem Beitrag müssen Sie die Variable "$ USER" an den Benutzer anpassen, der den Prozess ausführt

Ich habe Informationen für den Speicher hinzugefügt, außerdem wird dies eine FAQ sein. Wenn Sie sie nicht benötigen, verwenden Sie sie nicht.

1) Installieren cgroup-bin

sudo apt-get install cgroup-bin

2) Neustart. cgroups befindet sich jetzt unter/sys/fs/cgroup

3) Machen Sie eine cgroup für Ihren Benutzer (der Eigentümer des Prozesses)

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

4) Ihr Benutzer kann Ressourcen verwalten. Standardmäßig erhalten Benutzer 1024 CPU-Einheiten (Freigaben). Um die CPU-Auslastung auf ca. 10% zu begrenzen, wird der Speicher in Byte angegeben.

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

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

5) Starte deinen Prozess (ändere exec auf 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> &

Aufbau

Vorausgesetzt, Gruppen arbeiten für Sie;)

Bearbeiten Sie /etc/cgconfig.conf, fügen Sie in Ihrer benutzerdefinierten Gruppe hinzu

# Graphical
gksudo gedit /etc/cgconfig.conf

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

Fügen Sie in Ihrer Gruppe hinzu. Ändern Sie erneut $ USER in den Benutzernamen, dem der Prozess gehört.

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;
    }
}

Sie können auch Gruppen angeben gid=$GROUP. /Etc/cgconfig.conf ist gut kommentiert.

Führen Sie nun Ihren Prozess erneut mit aus cgexec -g cpu:$USER command <options>

Sie können Ihren Prozess (nach PID) in sehen /sys/fs/cgroup/cpu/$USER/tasks

Beispiel

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

[1] 1499

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

1499

Weitere Informationen finden Sie unter: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
Ich habe es geschafft, Teil 1 zu beenden. Es funktioniert, aber Sie sollten Informationen hinzufügen, dass der Prozess nur begrenzt ist, während ein anderer Prozess CPU / Speicher benötigt. Es ist nicht offensichtlich - und ich brauche lange, um es herauszufinden (als Anfänger). Verstehe ich richtig, dass "Konfiguration" Einstellungen auch nach einem Neustart speichern soll?
Rafal

1
Ich bin froh, dass du es in Ordnung gebracht hast. Es gibt eine gewisse Lernkurve =) Ja, die Konfiguration soll die Einstellungen beim Booten beibehalten.
Panther

Wenn ich cgroup von der Kommandozeile verwende, funktioniert es einwandfrei. Aber wenn ich den gleichen Befehl von der exec-Funktion in PHP aus ausführe: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"), funktioniert das nicht. Der einzige Unterschied besteht darin, dass ich von der Befehlszeile aus Dateien verwende, die sich in befinden Ordner Ich bin in und von PHP Ich benutze langen Pfad zu diesen Dateien. Irgendeine Idee, was ein Problem sein kann. Ich benutze den gleichen Benutzer in beiden Fällen.
Rafal

1
@Rafal: Ich weiß nicht, dass Ihr erster Kommentar korrekt ist. Der Speicher sollte begrenzt sein, auch wenn keine anderen Prozesse viel Speicher beanspruchen .
Flimm

1
@Flimm Beim Testen dieser Lösung wurden nur zwei Prozesse ausgeführt - Apache und ein Prozess, der eingeschränkt werden sollte. Wenn keine Apache-Verbindung bestand oder nur eine Verbindung zu Apache bestand, wurde für diesen eingeschränkten Prozess 100% der CPU benötigt. Es wurde nur dann eingeschränkt, wenn mehrere Verbindungen zu Apache hergestellt wurden (ich habe dies getan, indem ich die Website viel vom Webbrowser aus aktualisiert habe). Vielleicht lief kein anderer Prozess.
Rafal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.