Comment limiter un utilisateur entier à moins de 10% de CPU, pas seulement un processus?

10

J'utilise centos, cpanel / whm et j'ai installé cpulimit.

Le problème que je rencontre est qu'un de mes utilisateurs utilise une quantité extrême d'utilisation du processeur. Plus de 100% régulièrement et cela ralentit mon serveur.

Un autre problème est qu'ils sont un ami et non malveillant, donc je ne veux pas les suspendre.

De plus, un problème est que je ne peux pas le limiter par processus, car ce processus change à chaque seconde. C'est un processus différent à chaque fois.

J'ai essayé ce qui suit mais cela ne fonctionne pas.

cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php

Je viens de rentrer,

No process found
No process found
No process found
No process found
No process found
No process found

etc

Il y a deux choses qui utilisent cette utilisation extrême du processeur.

La première chose est que le fichier à cet endroit, index.php. L'autre est [php], quoi que cela signifie dans WHM. Mais c'est surtout index.phple problème.

Si je pouvais limiter ce index.phpfichier à cet emplacement, cela pourrait aider à atténuer ce problème.

Au fait, j'ai essayé le -Pdrapeau mais ce n'est pas disponible en option contrairement à la documentation.

cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php

Retour

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)

On dirait que je dois le faire avec le -edrapeau.

Idéalement, cependant, je voudrais limiter l'ensemble du compte utilisateur.

Et oui, je connais cloudlinux mais je ne peux pas le faire pour le moment. Jusqu'à ce que je puisse le faire, j'ai besoin d'aide pour le faire manuellement avec quelque chose qui ne nécessite pas de redémarrage du serveur.

user7783780
la source

Réponses:

1

Vous avez raison de ne pas pouvoir limiter votre ami à l'aide d'un processus (PID), Apache génère un nouveau processus (Worker) pour chaque demande qu'il reçoit, en attribuant un nouveau PID à chaque fois.

Selon le gestionnaire PHP que vous configurez WHM -> MultiPHP Manager -> PHP Handlers, Apache exécutera les scripts PHP comme lui-même ou les exécutera en tant qu'utilisateur propriétaire du fichier. Si vous utilisez suPHPcomme gestionnaire, le processus PHP sera exécuté comme par le compte propriétaire du fichier.

Si le script est exécuté par le propriétaire, vous pouvez limiter l'utilisation du processeur à un compte en l'ajoutant au /etc/security/limits.conffichier. Bien que vous ne puissiez pas l'utiliser pour limiter exactement le pourcentage de CPU, vous pouvez modifier leur valeur «sympa» afin que leurs processus aient une priorité inférieure à celle des autres processus sur le serveur. En tant que tel, les autres processus n'auront pas à attendre aussi longtemps.

Je ne l'ai jamais utilisé moi-même (j'exécute CloudLinux), mais je pense que l'entrée suivante devrait aider à résoudre le problème:

username    hard    priority    30

Cela définit la priorité maximale pour les processus exécutés par l'utilisateur à 30. D'après ce que je comprends, une priorité plus élevée signifie en fait que d'autres processus (avec une priorité plus faible) obtiennent plus de temps CPU.

Sur mon serveur exécutant cPanel, la plupart des processus ont une priorité de 20, donc en suivant la logique ci-dessus, définir la priorité pour cet utilisateur sur 30 devrait permettre à d'autres processus de s'exécuter avant ces processus.

cascer1
la source
7

Avez-vous essayé Cgroups ?


  • Installez le service sudo yum install libcgroupet démarrez-le sudo service cgconfig start.
  • Après quoi, affichez la configuration du sous-système pour les groupes de contrôle en exécutant sudo ls /cgroup

Créez un groupe de contrôle nommé limitcpu. Les lignes commençant par group créent des groupes de contrôle et définissent les paramètres de sous-système.

Exemple /etc/cgconfig.conf:

group limitcpu{

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

        }
}

Pour la limitation du processeur, il existe quelques paramètres réglables que vous pouvez utiliser pour limiter l'utilisation flagrante du processeur

Si les tâches d'un groupe de contrôle doivent pouvoir accéder à un seul processeur pendant 0,1 (10%) secondes toutes les 1 seconde, définissez cpu.cfs_quota_us sur 100000 et cpu.cfs_period_us sur 1000000.


Cgred est un service (qui démarre le service cgrulesengd) qui déplace les tâches dans des groupes de contrôle en fonction des paramètres définis dans le fichier /etc/cgrules.conf. Les entrées du fichier /etc/cgrules.conf peuvent prendre l'une de ces deux formes:

user subsystems control_group
user:command subsystems control_group

useravec un nom d'utilisateur ou un nom de groupe précédé du caractère "@". Remplacez-le subsystemspar une liste de noms de sous-systèmes séparés par des virgules, control_groupreprésente un chemin d'accès au groupe de contrôle et commandreprésente un nom de processus ou un chemin de commande complet d'un processus.

Exemple etc / cgrules.conf:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • firefoxles processus exécutés par n'importe quel utilisateur seront automatiquement ajoutés aux navigateurs cgroupet limités en cpu et sous-systèmes de mémoire.

  • memhogles processus exécutés par n'importe qui dans le admingroupe seront ajoutés au cgroup limitmemet limités en sous-système de mémoire.

    - Votre utilisateur cpuhog,, sera ajouté au 'groupccu' de cgroup et limité dans les sous-systèmes de cpu.


Dans les cas d'utilisation à l'avance, vous pouvez essayer d'utiliser un modèle à la place.

Par exemple, spécifiez le modèle suivant dans /etc/cgconfig.conf:

template users/%g/%u {
                     cpuacct{
                     }
                     cpu {
                        cpu.shares = "1000";
                     }
          }

Utilisez ensuite le modèle users /% g /% u dans la troisième ligne d'une entrée /etc/cgrules.conf, qui peut se présenter comme suit:

peter:ftp       cpu     users/%g/%u

Les %g and %uvariables utilisées ci-dessus sont automatiquement remplacées par le groupe et le nom d'utilisateur selon le propriétaire du processus ftp.

Si le processus appartient à peter du groupe adminstaff, le chemin ci-dessus est traduit en users/adminstaff/peter.

Le service cgred recherche ensuite ce répertoire, et s'il n'existe pas, cgred le crée et affecte le processus à users / adminstaff / peter / tasks.

Notez que les règles de modèle ne s'appliquent qu'aux définitions de modèles dans les fichiers de configuration, donc même si "group users / adminstaff / peter" était défini dans /etc/cgconfig.conf, il serait ignoré en faveur de "template users /% g /% u ".

Tutoriel par Digital Ocean.

Introduction aux groupes de contrôle.

Carrein
la source
0

Vous pouvez probablement essayer de configurer /etc/security/limits.conf là, vous devriez être en mesure d'ajuster la quantité de temps processeur et de mémoire qu'un utilisateur peut consommer. Pour plus de détails, voir https://linux.die.net/man/5/limits.conf

sebastienvg
la source