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

12

Il existe de nombreuses 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 y a un processus qui est très important, mais qui n'a pas besoin d'être exécuté en haute priorité. Je veux limiter définitivement l'utilisation du processeur pour le processus , pas pour l'utilisateur. Ce processus est exécuté par la fonction exec (c'est la fonction php, pas le processus système).

Je vois donc 2 options: 1. Ajoutez une sorte de limite chaque fois que la fonction est exécutée. 2. Limitez définitivement l'utilisation du processeur 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 sais presque rien.

Rafal
la source
Pouvez-vous nous dire ce que vous avez essayé. cgroups peut le faire pour vous.
Panther
Quant à la configuration, vous pouvez exécuter le cgsnapshot -spour récupérer les informations sans écrire le fichier de configuration manuellement, ce dernier n'est pas recommandé.
Mingliang Liu
Voulez-vous réellement limiter le processus, c'est-à-dire vous assurer qu'il ne dépasse jamais une durée définie?
Ken Sharp
J'ai utilisé cette méthode et cela a fonctionné pour moi .. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

Réponses:

19

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

Voici comment j'utilise cgroups sur ubuntu.

Tout au long de cette publication, vous devrez remplacer la variable "$ USER" par l'utilisateur exécutant le processus

J'ai ajouté des informations sur la mémoire et cela va être une FAQ, si vous n'en avez pas besoin, ne l'utilisez pas.

1) Installer 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 de CPU (partages), donc pour limiter à environ 10% de CPU, la mémoire est en octets ...

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

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

5) Démarrez votre processus (changez 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 de discussion fonctionnent pour vous;)

Modifier /etc/cgconfig.conf, ajouter votre groupe de contrôle personnalisé

# Graphical
gksudo gedit /etc/cgconfig.conf

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

Ajoutez votre groupe de contrôle. 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 des 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 sleep 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/

Panthère
la source
2
J'ai réussi à terminer la partie 1. Cela fonctionne, mais vous devez ajouter des informations sur le fait que le processus est limité uniquement tandis que d'autres processus nécessitent un processeur / mémoire. Ce n'est pas évident - et cela me prend du temps à comprendre (comme je suis débutant). Dois-je bien comprendre que "Configuration" consiste à enregistrer les paramètres même après le redémarrage?
Rafal
1
Je suis heureux que tu l'aie résolu. Il y a un peu de courbe d'apprentissage =) Oui, la configuration consiste à conserver les paramètres pendant le démarrage.
Panther
Lorsque j'utilise cgroup à partir de la ligne de commande, cela fonctionne bien. Mais lorsque j'exécute la même commande à partir de la fonction exec dans php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); cela ne fonctionne pas. La seule différence est qu'à partir de la ligne de commande j'utilise des fichiers qui sont dans dossier dans lequel et depuis php j'utilise un long chemin vers ces fichiers. Une idée de ce qui peut être un problème? J'utilise le même utilisateur dans les deux cas.
Rafal
1
@Rafal: Je ne pense pas que votre premier commentaire soit correct, la mémoire devrait être limitée même si aucun autre processus n'occupe beaucoup de mémoire.
Flimm
1
@Flimm Seulement 2 processus étaient en cours d'exécution lorsque je testais cette solution - apache et processus qui devraient être limités. Lorsqu'aucune connexion Apache n'était active ou qu'il n'y avait qu'une seule connexion à Apache, ce processus limité prenait 100% du processeur. Il n'a été limité qu'une fois que plusieurs connexions à Apache ont été établies (j'ai fait cela en rafraîchissant beaucoup le site Web à partir du navigateur Web). Alors peut-être qu'il n'y avait aucun autre processus en cours d'exécution.
Rafal