Ich betreibe ein Linux-System, das viele Benutzer hat, aber manchmal tritt ein Missbrauch auf. Hier kann ein Benutzer einen einzelnen Prozess ausführen, der mehr als 80% der CPU / des Speichers beansprucht.
Gibt es eine Möglichkeit, dies zu verhindern, indem die CPU-Auslastung, die ein Prozess verbrauchen kann (beispielsweise auf 10%)? Mir ist bekannt cpulimit
, aber leider werden die von mir angewiesenen Prozesse begrenzt (z. B. einzelne Prozesse). Meine Frage ist also, wie ich das Limit auf alle laufenden Prozesse und Prozesse anwenden kann, die in Zukunft ausgeführt werden, ohne dass beispielsweise die ID / der Pfad angegeben werden muss.
centos
command-line
cpu
limit
Giovanni Mounir
quelle
quelle
cpulimit
in Verbindung mit Ihrem Suchskript. Haben Sie eine Richtlinie und empfehlen Sie die Verwendung voncpulimit
, suchen Sie dann nach über 10% und beschränken Sie sich dann auf 5% (daher werden Benutzer zur Verwendung aufgefordertcpulimit
). Stellen Sie außerdem sicher, dass Sie mehrere Prozesse erkennen können, die für einen einzelnen Benutzer mehr als 10% betragen.cpulimit
ist viel besser als nur das Beenden des Prozesses, da er später vom Benutzer neu gestartet werden kann (wie in einem Ihrer Kommentare angegeben). Vielen Dank!Antworten:
Während es ein Missbrauch für den Speicher sein kann, ist es nicht für die CPU: Wenn eine CPU im Leerlauf ist, dauert ein laufender Prozess (durch "Laufen" meine ich, dass der Prozess nicht auf E / A oder etwas anderes wartet) Standardmäßig 100% CPU-Zeit. Und es gibt keinen Grund, ein Limit durchzusetzen.
Jetzt können Sie dank Prioritäten setzen
nice
. Wenn Sie möchten, dass sie auf alle Prozesse für einen bestimmten Benutzer angewendet werden, müssen Sie nur sicherstellen, dass seine Anmeldeshell mit ausgeführt wirdnice
: Die untergeordneten Prozesse erben dennice
Wert. Dies hängt davon ab, wie sich die Benutzer anmelden. Siehe z. B. Priorisieren von SSH-Anmeldungen (nett) .Alternativ können Sie virtuelle Maschinen einrichten. In der Tat ist das Festlegen eines Limits pro Prozess wenig sinnvoll, da der Benutzer viele Prozesse starten kann, wodurch das System missbraucht wird. Bei einer virtuellen Maschine sind alle Beschränkungen für die virtuelle Maschine global.
Eine andere Lösung besteht darin,
/etc/security/limits.conf
Grenzen zu setzen . Siehe die Manpage limits.conf (5). Beispielsweise können Sie die maximale CPU-Zeit pro Anmeldung und / oder die maximale Anzahl von Prozessen pro Anmeldung festlegen. Sie können auchmaxlogins
für jeden Benutzer den Wert 1 festlegen .quelle
nett / renice
nice
ist ein großartiges Tool für einmalige Optimierungen an einem System.cpulimit
cpulimit
Wenn Sie einen CPU-intensiven Job ausführen und freie CPU-Zeit benötigen, ist dies für die Reaktionsfähigkeit eines Systems von entscheidender Bedeutung.cgroups
cgroups
Grenzen nicht nur für einen, sondern für eine Reihe von Prozessen festlegenRessourcen
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
quelle
cpu.cfs_quota_us
siehe Parameter (siehe Handbuch )sudo cgclassify -g cpu:cpulimited 2315444
Hast du dir cgroups angesehen? Es gibt einige Informationen im Arch Wiki darüber. Lesen Sie den Abschnitt darüber
cpu.shares
, es sieht so aus, als ob es das tut, was Sie brauchen, und sie können auf Benutzerebene arbeiten, so dass Sie alle Benutzerprozesse auf einmal begrenzen können.quelle
Nach Erinnerung suchen Sie
ulimit -v
. Beachten Sie, dass diesulimit
von untergeordneten Prozessen geerbt wird. Wenn Sie es also zum Zeitpunkt der Anmeldung auf die Anmeldeshell des Benutzers anwenden, gilt es für alle seine Prozesse.Wenn Ihre Benutzer alle
bash
als Login-Shell verwenden,/etc/profile
sollte die Eingabe der folgenden Zeile dazu führen, dass für alle Benutzerprozesse ein festes Limit von 1 Gigabyte (genauer gesagt eine Million Kilobyte) festgelegt ist:Die Option
H
stellt sicher, dass es sich um ein hartes Limit handelt, das heißt, der Benutzer kann es anschließend nicht mehr wiederherstellen. Natürlich kann der Benutzer den Speicher immer noch füllen, indem er ausreichend viele Prozesse gleichzeitig startet.Für andere Shells müssen Sie herausfinden, welche Initialisierungsdateien sie stattdessen lesen (und welchen anderen Befehl
ulimit
sie verwenden).Was Sie sich für die CPU wünschen, scheint für mich keinen Sinn zu ergeben. Was nützt es, wenn 90% der CPU ungenutzt bleiben, wenn nur ein Prozess ausgeführt wird? Ich denke, was Sie wirklich wollen, ist
nice
(und möglicherweiseionice
). Beachten Sie, dass, wieulimit
,nice
sind Werte , die von untergeordneten Prozessen geerbt, so dass es auf den Login - Shell bei der Anmeldung genügt die Anwendung. Ich denke, das trifft auch zuionice
, bin mir aber nicht sicher.quelle
nice
wird nett genug sein, um das zu tun? Wenn ja, können Sie mir ein Beispiel zeigen, um dies zu erreichen?Da Sie angeben, dass cpulimit in Ihrem Fall nicht praktikabel wäre, schlage ich vor, Sie betrachten nice , renice und taskset , die möglicherweise dem nahe kommen, was Sie erreichen möchten, obwohl taskset das Festlegen der CPU-Affinität eines Prozesses ermöglicht ist in Ihrem Fall möglicherweise nicht sofort hilfreich.
quelle
nice
undrenice
? Das ist schön! Ich habe mir die Handbuchseiten angesehen, aber ich glaube immer noch nicht, dass sie dabei helfen können, da Sie immer noch eine Prozess-ID festlegen müssen. Wenn Sie mir jedoch ein Beispiel geben könnten, das diese Pakete beinhaltet, um das Limit für alle laufenden Prozesse / zukünftigen Prozesse anzuwenden, wäre das fantastisch!Da haben deine Tags
centos
, können Sie verwendensystemd
.Zum Beispiel, wenn Sie den Benutzer mit folgender ID einschränken möchten
1234
:sudo systemctl edit --force user-1234.slice
Dann tippe und speichere das:
[Slice] CPUQuota=10%
Wenn sich der Benutzer das nächste Mal anmeldet, wirkt sich dies aus.
Man Seiten:
systemctl
,systemd.slice
,systemd.resource-control
...quelle
Wenn Sie die bereits gestarteten Prozesse einschränken möchten, müssen Sie dies nacheinander per PID tun. Sie können jedoch ein Batch-Skript verwenden, um dies wie das folgende zu tun:
In meinem Fall
pypdfocr
startet das gierigtesseract
.Auch in einigen Fällen, in denen Ihre CPU ziemlich gut ist, können Sie einfach Folgendes verwenden
renice
:quelle