Ich verwende CentOS, CPanel/WHM und habe CPULimit installiert.
Mein Problem ist, dass einer meiner Benutzer die CPU extrem stark beansprucht. Konstant über 100 % und das verlangsamt meinen Server.
Ein weiteres Problem ist, dass es sich um Freunde handelt und sie nicht böswillig sind. Deshalb möchte ich sie nicht sperren.
Ein weiteres Problem ist, dass ich es nicht pro Prozess einschränken kann, da sich dieser Prozess jede Sekunde ändert. Es ist jedes Mal ein anderer Prozess.
Ich habe Folgendes versucht, aber es funktioniert nicht.
cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php
Ich bekomme gerade zurück,
No process found
No process found
No process found
No process found
No process found
No process found
usw
Es gibt zwei Dinge, die diese extreme CPU-Auslastung verursachen.
Das Erste ist die Datei an diesem Ort index.php
. Das Andere ist [php], was auch immer das in WHM bedeutet. Aber hauptsächlich index.php
ist das das Problem.
Wenn ich die Datei an diesem Speicherort beschränken könnte index.php
, könnte das Problem möglicherweise behoben werden.
Übrigens habe ich die -P
Flagge ausprobiert, aber sie ist, anders als in der Dokumentation angegeben, nicht als Option verfügbar.
cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php
kehrt zurück
cpulimit: invalid option -- 'P'
Usage: cpulimit [OPTIONS...] TARGET
OPTIONS
-l, --limit=N percentage of cpu allowed from 0 to 1600 (required)
-v, --verbose show control statistics
-z, --lazy exit if there is no target process, or if it dies
-i, --include-children limit also the children processes
-h, --help display this help and exit
TARGET must be exactly one of these:
-p, --pid=N pid of the process (implies -z)
-e, --exe=FILE name of the executable program file or path name
COMMAND [ARGS] run this command and limit it (implies -z)
Sieht also so aus, als müsste ich es mit der Flagge machen -e
.
Idealerweise würde ich jedoch gerne das gesamte Benutzerkonto beschränken.
Und ja, ich kenne mich mit Cloudlinux aus, aber das kann ich momentan nicht. Bis ich das kann, brauche ich Hilfe, um es manuell mit etwas zu tun, das keinen Serverneustart erfordert.
Antwort1
Sie haben Recht, dass Sie Ihren Freund nicht mithilfe eines Prozesses (PID) einschränken können. Apache erzeugt für jede empfangene Anfrage einen neuen Prozess (Worker) und weist jedes Mal eine neue PID zu.
Je nachdem, welchen PHP-Handler Sie einrichten WHM -> MultiPHP Manager -> PHP Handlers
, führt Apache PHP-Skripte entweder als eigener Benutzer oder als der Benutzer aus, dem die Datei gehört. Wenn Sie den suPHP
Handler als verwenden, wird der PHP-Prozess als Benutzer ausgeführt, dem die Datei gehört.
Wenn das Skript vom Eigentümer ausgeführt wird, können Sie die CPU-Auslastung eines Kontos begrenzen, indem Sie es der /etc/security/limits.conf
Datei hinzufügen. Sie können damit zwar den CPU-Prozentsatz nicht genau begrenzen, aber Sie können den „Nice“-Wert ändern, sodass die Prozesse des Skripts eine niedrigere Priorität erhalten als andere Prozesse auf dem Server. Dadurch müssen andere Prozesse nicht so lange warten.
Ich habe das selbst noch nie benutzt (ich verwende CloudLinux), aber ich glaube, der folgende EintragsollenHilfe zum Problem:
username hard priority 30
Dadurch wird die maximale Priorität für vom Benutzer ausgeführte Prozesse auf 30 gesetzt. So wie ich es verstehe, bedeutet eine höhere Priorität tatsächlich, dass andere Prozesse (mit niedrigerer Priorität) mehr CPU-Zeit erhalten.
Auf meinem Server, auf dem cPanel läuft, haben die meisten Prozesse eine Priorität von 20. Wenn Sie also der obigen Logik folgen, sollte das Festlegen der Priorität für diesen Benutzer auf 30 es anderen Prozessen ermöglichen, vor diesen Prozessen ausgeführt zu werden.
Antwort2
Hast du es versuchtC-Gruppen?
- Installieren Sie den Dienst
sudo yum install libcgroup
und starten Sie ihnsudo service cgconfig start
. - Anschließend können Sie die Subsystemkonfiguration für die Kontrollgruppen anzeigen, indem Sie
sudo ls /cgroup
Erstellen Sie eine Kontrollgruppe mit dem Namen limitcpu
. Zeilen, die mit „group“ beginnen, erstellen Kontrollgruppen und legen Subsystemparameter fest.
Beispiel /etc/cgconfig.conf:
group limitcpu{
cpu {
cpu.shares = 200;
# cpu.cfs_period_us
# cpu.cfs_quota_us
}
memory {
}
}
Zur CPU-Begrenzung gibt es ein paareinstellbare Parametermit denen Sie die offensichtliche CPU-Auslastung begrenzen können
Wenn Aufgaben in einer Kontrollgruppe in jeder Sekunde 0,1 (10 %) Sekunden lang auf eine einzelne CPU zugreifen können sollen, setzen Sie cpu.cfs_quota_us auf 100000 und cpu.cfs_period_us auf 1000000.
Cgred ist ein Dienst (der den Dienst cgrulesengd startet), der Aufgaben gemäß den in der Datei /etc/cgrules.conf festgelegten Parametern in Kontrollgruppen verschiebt. Einträge in der Datei /etc/cgrules.conf können eine dieser beiden Formen annehmen:
user subsystems control_group
user:command subsystems control_group
Wobei user
dies ein Benutzer- oder Gruppenname ist, dem das Zeichen „@“ vorangestellt ist. Ersetzen Sie es subsystems
durch eine kommagetrennte Liste von Subsystemnamen, control_group
stellt einen Pfad zur Kontrollgruppe dar und command
steht für einen Prozessnamen oder einen vollständigen Befehlspfad eines Prozesses.
Beispiel etc/cgrules.conf:
*:firefox cpu,memory browsers/
@admin:memhog memory limitmem/
cpuhog cpu limitcpu/
firefox
Von Benutzern ausgeführte Prozesse werden automatisch zu den Browsern hinzugefügtcgroup
und in den CPU- und Speichersubsystemen eingeschränkt.memhog
Prozesse, die von jemandem in deradmin
Gruppe ausgeführt werden, werden der Kontrollgruppe hinzugefügtlimitmem
und im Speichersubsystem eingeschränkt.– Ihr Benutzer
cpuhog
wird zur Kontrollgruppe „limitcpu“ hinzugefügt und in den CPU-Subsystemen eingeschränkt.
In fortgeschrittenen Anwendungsfällen können Sie stattdessen versuchen, eine Vorlage zu verwenden.
Geben Sie beispielsweise die folgende Vorlage in /etc/cgconfig.conf an:
template users/%g/%u {
cpuacct{
}
cpu {
cpu.shares = "1000";
}
}
Verwenden Sie dann die Vorlage users/%g/%u in der dritten Zeile eines /etc/cgrules.conf-Eintrags, der wie folgt aussehen kann:
peter:ftp cpu users/%g/%u
Die %g and %u
oben verwendeten Variablen werden je nach Eigentümer des FTP-Prozesses automatisch durch Gruppen- und Benutzernamen ersetzt.
Wenn der Prozess Peter aus der Gruppe „Adminstaff“ gehört, wird der obige Pfad in übersetzt users/adminstaff/peter
.
Anschließend sucht der cgred-Dienst nach diesem Verzeichnis und falls es nicht existiert, erstellt cgred es und weist den Prozess users/adminstaff/peter/tasks zu.
Beachten Sie, dass Vorlagenregeln nur für Definitionen von Vorlagen in Konfigurationsdateien gelten. Selbst wenn also „group users/adminstaff/peter“ in /etc/cgconfig.conf definiert wäre, würde es zugunsten von „template users/%g/%u“ ignoriert.
Antwort3
Sie können wahrscheinlich versuchen, /etc/security/limits.conf einzurichten. Dort sollten Sie einstellen können, wie viel CPU-Zeit und Speicher ein Benutzer verbrauchen kann. Weitere Informationen finden Sie unterhttps://linux.die.net/man/5/limits.conf