web-dev-qa-db-fra.com

Comment définir la limite de CPU pour un processus donné de manière permanente. Cpulimit et Nice ne fonctionnent pas

Il y a beaucoup de questions similaires mais aucune ne m'aide à résoudre mon problème.

J'ai Ubuntu 11.10 sur le serveur (c'est la version de bureau). J'ai un site web en cours d'exécution dessus. Il existe un processus très important, mais il n'est pas nécessaire de l'exécuter avec une priorité élevée. Je veux limiter de manière permanente l'utilisation du processeur pour le processus, pas pour l'utilisateur. Ce processus est exécuté par la fonction exec (c'est une fonction php, pas un processus système).

Je vois donc 2 options: 1. Ajouter une sorte de limite à chaque exécution de la fonction. 2. Limitez l'utilisation de l'unité centrale de manière permanente pour ce processus.

J'ai essayé d'utiliser "Nice" et cpulimit, mais rien ne semble fonctionner. Nice n'a aucun effet et cpulimit (avec -e) dit: "aucun processus cible trouvé".

Je suis un débutant, alors supposez que je ne sache presque rien.

12
Rafal

En l'absence de détails demandés ...

Voici comment j'utilise cgroups sur Ubuntu.

Tout au long de cet article, vous devrez remplacer la variable "$ USER" par l'utilisateur qui exécute le processus

J'ai ajouté des informations sur la mémoire, ainsi que sur une FAQ, si vous n'en avez pas besoin, ne les utilisez pas.

1) Installez cgroup-bin

Sudo apt-get install cgroup-bin

2) redémarrez. cgroups est maintenant situé à /sys/fs/cgroup

3) Créez un groupe de contrôle pour votre utilisateur (le propriétaire du processus)

# Change $USER to the system user running your process.
Sudo cgcreate -a $USER -g memory,cpu:$USER

4) Votre utilisateur peut gérer les ressources. Par défaut, les utilisateurs obtiennent 1024 unités cpu (partages), de sorte que la mémoire est limitée à environ 10% cpu ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Démarrer votre processus (change exec en cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Configuration

En supposant que les groupes fonctionnent pour vous;)

Editez /etc/cgconfig.conf, ajoutez votre groupe de contrôle personnalisé

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
Sudo -e /etc/cgconfig.conf

Ajoutez dans votre cgroup. Remplacez à nouveau $ USER par le nom d’utilisateur propriétaire du processus.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

Vous pouvez également spécifier les groupes gid=$GROUP, /etc/cgconfig.conf est bien commenté.

Maintenant, exécutez à nouveau votre processus avec cgexec -g cpu:$USER command <options>

Vous pouvez voir votre processus (par PID) dans /sys/fs/cgroup/cpu/$USER/tasks

Exemple

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi dormir 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat/sys/fs/cgroup/cpu/bodhi/tasks

1499

Pour plus d'informations, voir: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/

19
Panther