Wie kann man einen gesamten Benutzer auf weniger als 10 % der CPU beschränken, nicht nur einen Prozess?

Wie kann man einen gesamten Benutzer auf weniger als 10 % der CPU beschränken, nicht nur einen Prozess?

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.phpist 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 -PFlagge 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 suPHPHandler 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.confDatei 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 libcgroupund starten Sie ihn sudo service cgconfig start.
  • Anschließend können Sie die Subsystemkonfiguration für die Kontrollgruppen anzeigen, indem Siesudo 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 userdies ein Benutzer- oder Gruppenname ist, dem das Zeichen „@“ vorangestellt ist. Ersetzen Sie es subsystemsdurch eine kommagetrennte Liste von Subsystemnamen, control_groupstellt einen Pfad zur Kontrollgruppe dar und commandsteht 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/
  • firefoxVon Benutzern ausgeführte Prozesse werden automatisch zu den Browsern hinzugefügt cgroupund in den CPU- und Speichersubsystemen eingeschränkt.

  • memhogProzesse, die von jemandem in der adminGruppe ausgeführt werden, werden der Kontrollgruppe hinzugefügt limitmemund im Speichersubsystem eingeschränkt.

    – Ihr Benutzer cpuhogwird 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 %uoben 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.

Tutorial von Digital Ocean.

Einführung in Kontrollgruppen.

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

verwandte Informationen