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

10

Ich verwende Centos, cpanel / whm und habe cpulimit installiert.

Das Problem, das ich habe, ist, dass einer meiner Benutzer extrem viel CPU-Auslastung verwendet. Über 100% konsistent und es verlangsamt meinen Server.

Ein weiteres Problem ist, dass sie Freunde sind und nicht bösartig, also möchte ich sie nicht suspendieren.

Ein weiteres Problem ist, dass ich es nicht prozessbegrenzen 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 komme 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 verwenden.

Das erste ist die Datei an diesem Ort index.php. Andere ist [php], was auch immer das in WHM bedeutet. Aber hauptsächlich index.phpist das das Problem.

Wenn ich diese index.phpDatei an diesem Speicherort einschränken könnte, könnte dies dazu beitragen, dieses Problem zu beheben.

Übrigens habe ich das -PFlag ausprobiert, aber das ist im Gegensatz zur Dokumentation 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)

Es sieht also so aus, als müsste ich es mit der -eFlagge machen.

Im Idealfall möchte ich jedoch das gesamte Benutzerkonto einschränken.

Und ja, ich weiß über Cloudlinux Bescheid, aber das kann ich momentan nicht. Bis ich das kann, brauche ich Hilfe, um es manuell mit etwas zu tun, das keinen Neustart des Servers erfordert.

user7783780
quelle

Antworten:

1

Sie haben Recht, dass Sie Ihren Freund nicht durch einen Prozess (PID) einschränken können. Apache erzeugt für jede empfangene Anfrage einen neuen Prozess (Worker) und weist jedes Mal eine neue PID zu.

Abhängig davon, in welchem ​​PHP-Handler Sie eingerichtet haben WHM -> MultiPHP Manager -> PHP Handlers, führt Apache entweder PHP-Skripte als sich selbst oder als den Benutzer aus, dem die Datei gehört. Wenn Sie suPHPals Handler verwenden, wird der PHP-Prozess wie von dem Konto ausgeführt, dem die Datei gehört.

Wenn das Skript vom Eigentümer ausgeführt wird, können Sie die CPU-Nutzung auf ein Konto beschränken, indem Sie es der /etc/security/limits.confDatei hinzufügen . Sie können dies zwar nicht verwenden, um den CPU-Prozentsatz genau zu begrenzen, aber Sie können ihren "netten" Wert so ändern, dass ihre Prozesse eine niedrigere Priorität haben als andere Prozesse auf dem Server. Daher müssen andere Prozesse nicht so lange warten.

Ich habe dies selbst nie verwendet (ich verwende CloudLinux), aber ich glaube, der folgende Eintrag sollte bei dem Problem helfen:

username    hard    priority    30

Dies setzt die maximale Priorität für vom Benutzer ausgeführte Prozesse auf 30. Soweit ich weiß, bedeutet eine höhere Priorität tatsächlich, dass andere Prozesse (mit einer niedrigeren Priorität) mehr CPU-Zeit erhalten.

Auf meinem Server, auf dem cPanel ausgeführt wird, haben die meisten Prozesse eine Priorität von 20. Wenn Sie also gemäß der obigen Logik die Priorität für diesen Benutzer auf 30 setzen, sollten andere Prozesse vor diesen Prozessen ausgeführt werden können.

cascer1
quelle
7

Haben Sie Cgroups ausprobiert ?


  • Installieren Sie den Dienst sudo yum install libcgroupund starten Sie ihn sudo service cgconfig start.
  • Anschließend wird die Subsystemkonfiguration für die cgroups durch Ausführen angezeigt sudo ls /cgroup

Erstellen Sie eine cgroup mit dem Namen limitcpu. Zeilen, die mit group beginnen, erstellen cgroups und legen Subsystemparameter fest.

Beispiel /etc/cgconfig.conf:

group limitcpu{

        cpu {
                cpu.shares = 200;
                # cpu.cfs_period_us
                # cpu.cfs_quota_us
        }
        memory {

        }
}

Für die CPU-Begrenzung gibt es einige einstellbare Parameter , mit denen Sie die offensichtliche CPU-Auslastung begrenzen können

Wenn Aufgaben in einer cgroup für 0,1 (10%) Sekunden pro 1 Sekunde 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 cgroups 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 userein Benutzername oder ein Gruppenname mit dem Zeichen "@" vorangestellt ist. Durch subsystemseine durch Kommas getrennte Liste von Subsystemnamen ersetzen , control_groupstellt einen Pfad zur cgroup 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 jedem Benutzer ausgeführte Prozesse werden automatisch zu den Browsern hinzugefügt cgroupund in CPU- und Speichersubsystemen eingeschränkt.

  • memhogProzesse, die von einem adminbeliebigen Mitglied der Gruppe ausgeführt werden, werden der cgroup hinzugefügt limitmemund im Speichersubsystem eingeschränkt.

    - Ihr Benutzer cpuhogwird zur Gruppe 'limitcpu' hinzugefügt und in CPU-Subsystemen eingeschränkt.


In früheren 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 Eintrags /etc/cgrules.conf, die wie folgt aussehen kann:

peter:ftp       cpu     users/%g/%u

Die %g and %uoben verwendeten Variablen werden abhängig vom Eigentümer des FTP-Prozesses automatisch durch Gruppen- und Benutzernamen ersetzt.

Wenn der Prozess zu Peter aus der Adminstaff-Gruppe gehört, wird der obige Pfad in übersetzt users/adminstaff/peter.

Der cgred-Dienst sucht dann nach diesem Verzeichnis. Wenn es nicht vorhanden ist, erstellt cgred es und weist den Prozess den Benutzern / adminstaff / peter /asks zu.

Beachten Sie, dass Vorlagenregeln nur für Definitionen von Vorlagen in Konfigurationsdateien gelten. Selbst wenn "Gruppenbenutzer / adminstaff / peter" in /etc/cgconfig.conf definiert wurde, wird dies zugunsten von "Vorlagenbenutzer /% g /%" ignoriert u ".

Tutorial von Digital Ocean.

Einführung in Kontrollgruppen.

Carrein
quelle
0

Sie können wahrscheinlich versuchen, /etc/security/limits.conf dort einzurichten. Sie sollten in der Lage sein, anzupassen, wie viel CPU-Zeit und Speicher ein Benutzer verbrauchen kann. Weitere Informationen finden Sie unter https://linux.die.net/man/5/limits.conf

sebastienvg
quelle