Was bestimmte Prozesse nach CPU - % - Linux
Ich habe Folgendes problem: einige Prozesse werden dynamisch generiert, haben eine Tendenz zu Essen, 100% der CPU. Ich würde gerne begrenzen alle den Prozess, die bestimmte Kriterien (z.B. Prozess-Namen), um eine bestimmte Menge an CPU-Prozentsatz.
Dem spezifischen problem, das ich zu lösen versuche ist die Nutzung folding@home-worker-Prozesse. Die beste Lösung, die ich denken konnte ist ein perl-Skript, das periodisch ausgeführt und verwendet die cpulimit-Dienstprogramm zu beschränken und die Prozesse (wenn Sie an mehr details interessiert ist, überprüfen Sie diese blog-post). Es funktioniert, aber es ist ein hack :/
Irgendwelche Ideen? Ich möchte die Behandlung der Prozesse zu den OS 🙂
Nochmals vielen Dank für die Anregungen, aber wir sind immer noch fehlt der Punkt 🙂
Den "Verlangsamung" - Lösung ist im wesentlichen, was die "cpulimit" - Dienstprogramm. Ich muss immer noch darauf achten, über welche Prozesse zu verlangsamen, töten die "Verlangsamung", nachdem das worker-Prozess abgeschlossen ist und starten Sie das neue für die neuen Arbeitsprozesse. Es ist genau das, was ich mit dem Perl-script und einem cron-job.
Das Hauptproblem ist, dass ich nicht vorher wissen, welche Prozesse zu begrenzen. Sie sind dynamisch generiert.
Vielleicht gibt es einen Weg zu beschränken, die alle Prozesse eines Benutzers zu einem bestimmten Betrag der Prozentsatz der CPU? Ich habe bereits ein Benutzer für die Ausführung des folding@home-Arbeitsplätze, in der Hoffnung, dass ich noch einschränken könnte ihn mit " /etc/security/limits.conf-Datei. Aber das nächste, was ich bekommen konnte gibt es die Gesamt-CPU-Zeit pro user...
Wäre es cool, wenn etwas dabei zu haben, die es Ihnen ermöglicht zu sagen:
"Die Summe aller CPU % Benutzung dieser user Prozesse nicht mehr als 50%". Und dann lassen Sie die Prozesse kämpfen, dass 50% der CPU in Bezug auf Ihre Prioritäten...
Jungs, danke für Eure Vorschläge, aber es geht nicht darum, Prioritäten zu setzen - ich will zur Begrenzung der CPU -%, selbst wenn es viel CPU-Zeit zur Verfügung. Die Prozesse sind bereits niedrige Priorität, so dass Sie nicht verursachen keine performance-Probleme.
Ich würde nur gerne verhindern, dass die CPU läuft auf 100%, die für längere Zeit...
- Warum ist es eine schlechte Sache? Wenn Sie richtig sind niced, sollte Sie nicht stören andere Prozesse. Sie werden nur (in der Tat) erhalten Sie alle übrig gebliebenen Zyklen...
- Das Lesen der blog-post, es scheint, wie er will, die CPUs haben einige Zeit im Leerlauf, so dass Sie nicht so heiß laufen. Das ist, warum ich aufgehört SETI@Home - meine CPUs waren nicht dauerhafte sehr lange, weil Sie heiß gelaufen die ganze Zeit.
- Ja, ich habe noch nie eine CPU ausfallen wegen überhitzung trotz Laufenden SETI@Home. Und ich habe nie etwas schicker als die retail-HSF-Einheiten, die mit kam mein Prozessoren.
- Vielleicht ist er in einer shared hosting-Umgebung und will Gas seine CPU-Zeit, damit sein Konto nicht "gesperrt"
- Wenn seine Prozesse richtig niced, er sollte nicht Auswirkungen auf andere performance. Seine Prozesse werden nur CPU, wenn es nicht in Gebrauch ist anderswo.
- Ich kenne die Antwort nicht, aber vielleicht kann man sich den WEIN Implementierung von SetInformationJobObject Windows-API
- Sie können mit cgroups um dies zu erreichen.
- Haben Sie versucht, alle Lösungen?
- unix.stackexchange.com/questions/151883/...
- Machen es zu einem systemd service dann
systemctl set-property seti.service CPUQuota=50%
, Dass 50% der insgesamt alle CPUs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte ein etwas ähnliches Problem mit
gzip
.Angenommen, wir wollen, verringern Sie die CPU in einem
gzip
Prozess:Optionen:
sleep
nützlich, wie diecpulimit
manchmal nicht abholen der neuengzip
Prozess sofort--limit 10
Grenzengzip
CPU-Auslastung um 10%-z
automatisch schließtcpulimit
wenngzip
Prozess abgeschlossenWeitere option ist die Ausführung des
cpulimit
daemon.Ich kann mich nicht erinnern und glaube auch nicht, dass es etwas war, wie dies in der unix-scheduler. Sie müssen ein kleines Programm, welches steuert, die anderen Prozess-und tut das folgende:
das Verhältnis tR/tP steuert die cpu-Last.
Hier ist ein kleines proof-of-concept. "gebucht" ist das Programm, welches verwendet Ihre cpu-Zeit und die, die Sie sein wollen verlangsamte, indem Sie "Verlangsamung":
ok, das script braucht etwas mehr Arbeit (zum Beispiel, um sich um sein INTR-upted und lassen die kontrollierten Prozess fortsetzen, falls er angehalten wurde, in diesem moment), aber Sie erhalten den Punkt. Ich würde auch schreiben, dass die kleine script in C oder ähnlich und berechnen Sie das cpu-Verhältnis von comand-line-argument....
hinsichtlich
cpulimit
Befehl funktioniert in dieser Weise. Es überwacht die Prozesse, die Sie definiert. Wenn ein Prozess verbraucht mehr als das limit, es unterbricht den Prozess. -- Sie können den source-code in Github.Ich glaube, in Linux gibt es keine Lösung für gap-die cpu-Auslastung, aber es ist ein akzeptabler Weise zu begrenzen Prozess auf eine bestimmte CPU-Auslastung: http://ubuntuforums.org/showthread.php?t=992706
Fall, dass Sie entfernen Sie die info, hier ist wieder
PAKETE INSTALLIEREN
Installieren cpulimit-Paket.
Code:
sudo apt-get install cpulimit
Install gawk-Paket.
Code:
sudo apt-get install gawk
ERSTELLEN CPULIMIT-DAEMON-DATEI
Open text-editor mit root-rechten und speichern Balg-daemon-Skript text in neue Datei /usr/bin/cpulimit_daemon.sh
Code:
CPU_LIMIT
Ändern Sie diese Variablen in einem Skript, wenn man möchte, weglassen, CPU-Auslastung für jeden Prozess zu jedem anderen Prozentsatz als 20%. Bitte Lesen Sie "bei Verwendung von SMP-computer" Kapitel Balg, wenn Sie die SMP-Rechner (mehr als 1 CPU oder eine CPU mit mehr als 1 Kern).
DAEMON_INTERVAL
Ändern Sie diese Variablen in einem Skript wenn Sie gerne mehr/weniger regelmäßigen überprüfung. Intervall wird in Sekunden angegeben und ist standardmäßig auf 3 Sekunden.
BLACK_PROCESS_LIST und WHITE_PROCESSES_LIST
Variable BLACK_PROCESSES_LIST Grenzen nur für die angegebenen Prozesse. Wenn die variable leer ist (Standard) alle gegen Prozesse sind begrenzt.
Variable WHITE_PROCESSES_LIST beschränkt alle Prozesse, ausser die Prozesse definiert, die in dieser variable. Wenn die variable leer ist (Standard) alle gegen Prozesse sind begrenzt.
Eine oder beide der Variablen BLACK_PROCESSES_LIST und WHITE_PROCESSES_LIST muss leer sein - es ist nicht logisch, dass beide Variablen sind definiert.
Können Sie mehrere Prozesse in einem dieser beiden Variablen mit Trennzeichen "|" (ohne Anführungszeichen) ein. Beispiel: wenn Sie möchten, um cpulimit alle Prozesse außer mysql, firefox und gedit Prozesse variable setzen: WHITE_PROCESSES_LIST="mysql|firefox|gedit",
VERFAHREN, UM AUTOMATISCH START-DAEMON BEIM BOOTEN
Set-Datei Berechtigungen für root-user:
Code:
sudo chmod 755 /usr/bin/cpulimit_daemon.sh
Open text-editor mit root-rechten und speichern Balg-Skript, um die neue Datei /etc/init.d/cpulimit
Code:
Code:
Code:
Fügen Sie das Skript, um boot-up-Verfahren die Verzeichnisse:
Code:
sudo update-rc.d cpulimit defaults
Neustart zu überprüfen, wenn das script startet cpulimit-daemon beim Booten:
Code:
sudo reboot
MANUELL ÜBERPRÜFEN, STOPPEN, STARTEN UND NEUSTARTEN DAEMON
Hinweis: Daemon und Dienst in dieser übung hat die gleiche Bedeutung.
Hinweis: Für Benutzer mit vor Ubuntu 8.10 (z.B. Ubuntu 8.04 LTS) statt der Leistung Befehl "sudo /etc/init.d/cpulimit-status/starten/stoppen/neu starten" - syntax oder installieren sysvconfig Paket mit dem Befehl: sudo apt-get install sysvconfig
Prüfen, ob cpulimit-Dienst ausgeführt wird
Der Check-Befehl gibt: "cpulimit-daemon ausgeführt wird," wenn der Dienst ausgeführt wird, oder "cpulimit-daemon läuft nicht", wenn Dienst nicht ausgeführt wird.
Code:
Start cpulimit service
Sie können manuell starten cpulimit-daemon gestartet wird weglassen CPU-Verbrauch.
Code:
Stop cpulimit service
Stop-Befehl beendet cpulimit-daemon (also kein neuer Prozess wird begrenzt sein) und setzt auch auf alle vorhandenen begrenzte Prozesse haben vollen Zugriff auf die CPU, so wie es war, bevor cpulimit nicht ausgeführt wurde.
Code:
Neu starten cpulimit service
Wenn Sie einige Variablen, die Einstellungen in /usr/bin/cpulimit_daemon.sh wie CPU_LIMIT, DAEMON_INTERVAL, BLACK_PROCESSES_LIST oder WHITE_PROCESSES_LIST, dann nach dem ändern der Einstellungen müssen Sie den Dienst neu starten.
Code:
Ohne daemon
1. stop cpulimit-daemon (sudo service cpulimit stop)
2. führen CPU-intensive Aufgaben in den hintergrund
3. Befehl ausführen: oben und lassen für %CPU-Spalte
Ergebnis %CPU ist wahrscheinlich mehr als 20% für jeden Prozess.
Mit daemon aktiviert
1. start cpulimit-daemon (sudo service cpulimit start)
2. führen Sie die gleichen CPU-intensive Aufgaben in den hintergrund
3. Befehl ausführen: oben und lassen für %CPU-Spalte
Ergebnis %CPU sollten maximal 20% für jeden Prozess.
Hinweis: vergessen Sie nicht am Anfang %CPU kann auch mehr sein, dann 20%, weil der daemon zu fangen, zu verletzen Prozess im Intervall von 3 Sekunden (eingestellt im script standardmäßig)
Ich getestet habe diesen code auf Intel-dual-core-CPU computer - das verhält sich wie SMP-computer. Vergessen Sie nicht, dass top-Befehl und auch cpulimit standardmäßig verhält sich in Irix-Modus, wo nur 20% bedeutet, dass 20% von einer CPU. Wenn es zwei CPUs (dual core) dann total %CPU 200%. In top-Befehl Irix-Modus kann deaktiviert werden, mit dem Befehl, den ich (mit der Taste +i beim top-Befehl ausgeführt wird) und Solaris-Modus eingeschaltet ist, wo die Gesamtzahl der CPU-Menge wird geteilt durch die Anzahl der CPUs, so %der CPU dann nicht mehr 100% auf eine beliebige Anzahl von CPU-computer. Lesen Sie bitte mehr info über die top-Kommando in top-man-Seite (Suche nach ich-Befehl). Bitte Lesen Sie auch mehr darüber, wie cpulimit ist Betrieb auf SMP-computer im cpulimit offiziellen Seite.
Aber wie funktioniert cpulimit-daemon arbeitet auf einem SMP-computer? Immer im Irix-mode. Also, wenn Sie möchten, verbringen 20% der CPU-Leistung auf 2-CPU-computer, 40% sollte verwendet werden, für CPU_LIMIT variable in cpulimit-daemon-Skript.
Wenn Sie möchten, um loszuwerden, cpulimit-daemon können Sie bereinigen Ihr system durch entfernen cpulimit-daemon und deinstallation von Programm cpulimit.
Stop-daemon cpulimit
Code:
sudo service cpulimit stop # Stoppen cpulimit-daemon und alle cpulimited Prozesse
Entfernen daemon von boot-up-Verfahren
Code:
sudo update-rc.d -f cpulimit remove # Entfernen von symbolischen links
Löschen, boot-up-Verfahren
Code:
sudo rm /etc/init.d/cpulimit # Löschen cpulimit boot-up-Skript
Löschen cpulimit-daemon
Code:
sudo rm /usr/bin/cpulimit_daemon.sh # Löschen cpulimit-daemon-Skript
Deinstallieren Programm cpulimit
Code:
sudo apt-get remove cpulimit
Deinstallieren gawk-Programm
Wenn Sie nicht brauchen, dieses Programm für alle anderen Skript können Sie mit der Fernbedienung.
Code:
sudo apt-get remove gawk
HINWEIS ÜBER DIE AUTOREN
Ich gerade geschrieben habe daemon für cpulimit (bash-Skripte, oben). Ich bin nicht der Autor von cpulimit-Projekt. Wenn Sie mehr Informationen über cpulimit-Programm, Lesen Sie bitte die offizielle cpulimit web-Seite: http://cpulimit.sourceforge.net/.
Grüße,
Abcuser
bash -c "help ulimit"
top
würde es sagen, es war nicht laufen, wenn es war, aber sonst war es der job. Vielen Dank!Warum beschränken Sie den Anteil der CPU, wenn Sie können einfach passen Sie die Priorität des Prozesses mit renice? Mit renice, und die Einstellung einer niedrigen Priorität ermöglicht, den Prozess noch zu 100% der Prozessor, wenn es verfügbar ist, aber andere Prozesse mit höherer Priorität bekommen, wird der Prozess, wenn er Sie braucht, fast ohne merkliche Verzögerung.
Ich hatte ein ähnliches problem, und die anderen Lösungen in dem thread nicht eingegangen wird, es überhaupt nicht. Meine Lösung funktioniert für mich jetzt, aber es ist nicht optimal, vor allem für die Fälle, in denen der Prozess ist im Besitz von root.
Mein workaround für jetzt ist, zu versuchen sehr hart, um sicherzustellen, dass ich habe keine lang andauernde Prozesse, die im Besitz von root (wie die Sicherung erfolgen nur als Benutzer)
Ich habe gerade installiert die hardware-sensoren-applet für gnome, und legen Sie Alarme für hohe und niedrige Temperaturen an der CPU, und richten Sie dann die folgenden Befehle für die einzelnen alarm:
niedrig gezielt:
hoch:
Die gute Nachricht ist, dass mein computer nicht mehr überhitzt und stürzt ab. Der Nachteil ist, dass terminal-Prozesse getrennt vom terminal, wenn Sie gestoppt und nicht wieder bekommen, wenn Sie das CONT-signal. Die andere Sache ist, dass, wenn es ein interaktives Programm, das verursacht die überhitzung (wie eine bestimmte web-browser-plugin!) dann frieren Sie in der Mitte von dem, was ich mache, während er darauf wartet, dass die CPU, um sich abzukühlen. Es wäre schöner, wenn die CPU-Skalierung kümmern dies auf globaler Ebene, aber das problem ist, dass ich nur noch zwei wählbare Einstellungen auf meiner CPU und der langsamen Einstellung ist nicht langsam genug, um eine überhitzung zu vermeiden.
Nur zu re-iterieren hier, das hat nichts zu tun mit der Prozess-Priorität, re-nicing,und offensichtlich nichts zu tun mit dem stoppen von jobs, die für eine lange Zeit laufen. Dies hat zu tun mit der Verhinderung der CPU-Auslastung vom Aufenthalt auf 100% zu lange, denn die hardware ist nicht in der Lage zu zerstreuen, die Wärme schnell genug, wenn bei voller Kapazität laufen (Leerlauf CPU erzeugt weniger Wärme als ein voll beladener CPU).
Einige andere naheliegende Möglichkeiten, die helfen könnten, sind:
Senken Sie die CPU-Geschwindigkeit insgesamt im BIOS
Ersetzen Sie den Kühlkörper oder re-wenden Sie das Thermo-gel, um zu sehen, ob das hilft
Reinigen Sie den Kühlkörper mit etwas Druckluft
Ersetzen Sie den CPU-Lüfter
[Bearbeiten]
Hinweis: keine überhitzung mehr bei 100% CPU, wenn ich deaktivieren, variable fan speed im bios (asus p5q pro turbo). Mit der CPU voll geladen, jedes core-tops aus bei 49 celcius.
Hatte ich auch die Notwendigkeit zur Begrenzung der CPU-Zeit für bestimmte Prozesse. Cpulimit ist ein gutes Werkzeug, aber ich musste immer manuell herauszufinden, die PID und manuell starten cpulimit, also wollte ich etwas bequemer.
Kam ich mit diesem bash-Skript:
In diesem Beispiel wird die cpu-Zeit der einzelnen gnome-terminal-Instanz zu 5% und die cpu-Zeit der einzelnen system-journal Instanz zu 5% als gut.
Nutzte ich ein weiteres Skript, das ich erstellt namens termsql in diesem Beispiel zum extrahieren der PID . Sie können es hier erhalten:
https://gitorious.org/termsql/termsql/source/master:
-e
flag z.B.cpulimit -e [process_name] -l 5
Mithilfe von cgroups' cpu.Aktien tut nichts, was eine schön Wert nichts zu tun. Es klingt wie Sie wollen eigentlich drosseln die Prozesse, die kann definitiv getan werden.
Müssen Sie ein Skript verwenden, oder zwei und/oder zu Bearbeiten /etc/cgconfig.conf Parameter zu definieren, die Sie wollen.
Speziell, Sie möchten Bearbeiten Sie die Werte cpu.cfs_period_us und cpu.cfs_quota_us. Dann wird der Prozess ausgeführt werden für cpu.cfs_quota_us Mikrosekunden pro cpu.cfs_period_us Mikrosekunden.
Beispiel:
Wenn cpu.cfs_period_us = 50000 und cpu.cfs_quota_us = 10000 dann den Prozess, erhalten Sie 20% CPU-Zeit, maximale, egal was sonst Los ist.
In diesem screenshot habe ich den Vorgang 2% CPU-Zeit:
Soweit das Verfahren betroffen ist, es läuft zu 100%.
Einstellungen cpu.Aktien auf der anderen Seite kann und wird immer noch 100% der CPU-Leerlaufzeit.
In diesem ähnliches Beispiel habe ich den Prozess cpu.Aktien = 100 (1024):
Wie Sie sehen können, der Prozess ist immer noch aufwendig, alle CPU-Leerlaufzeit.
Referenzen:
http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html
http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups.html
Sehe ich mindestens zwei Optionen:
PS + GREP + SCHÖNE
Begrenzen Sie die Menge der cpu-Zeit mit cgroups. Wird das OS-handle resource management ebenso wie Fragen Sie das für Sie in Frage.
Hier ist ein wiki mit Beispielen: https://wiki.archlinux.org/index.php/Cgroups
Da die Prozesse schon laufen, als eine separate Benutzer-Begrenzung aller Prozess aus, der Benutzer sollte die einfachste Lösung sein.
Den schön Befehl wird wahrscheinlich helfen.
Diese kann getan werden, mit setrlimit(2) (insbesondere durch die Einstellung RLIMIT_CPU parameter).
bash -c "help ulimit"
. Es nutzt setrlimitWerfen einige Schlaf-Anrufe dort sollte die Kraft, die der Prozess die CPU für eine bestimmte Zeit. Wenn Sie schlafen 30 Sekunden, mal eine minute, Ihr Prozess sollte nicht mehr als 50% CPU-Auslastung während dieser minute.
Könnte man nach unten skalieren der CPU-Frequenz. Dann müssen Sie nicht sorgen zu machen über die einzelnen Prozesse. Wenn Sie brauchen mehr cpu ' s skalieren Sie die Frequenz wieder nach oben.
Ich nicht wirklich sehen, warum Sie wollen zur Begrenzung der CPU-Zeit... Schränken Sie die gesamte Last auf die Maschine und die Last wird bestimmt durch die IO-Operationen meistens .
Ex: wenn ich eine while(1){} Schleife, wird es die gesamte Last auf 1.0, aber wenn diese Schleife wird einige Datenträger schreibt die Auslastung springt auf 2.0... 4.0. Und das ist, was das töten Ihrer Maschine, nicht die CPU-Auslastung. Die CPU-Auslastung kann leicht gehandhabt werden, indem nice/renice.
Sowieso, könnten Sie ein Skript, das eine 'kill -SIGSTOP PID' für eine bestimmte PID, wenn die Last zu hoch wird, und kill -SIGCONT, wenn alles wieder normal... Die PID ist, kann bestimmt werden durch Verwendung der "px aux" - Befehl, weil ich sehe, dass es zeigt die CPU-Nutzung, und Sie sollten in der Lage sein, um die Liste zu Sortieren über die Spalte. Ich denke, das die ganze Sache getan werden könnte, in der bash...