Comment limiter l'utilisation des ressources pour économiser CPU + RAM pour un certain processus?

25

J'ai un serveur de développement sur lequel sshdcesse parfois de fonctionner car la machine manque de RAM. Oui, nous manquons de mémoire et la mise à niveau n'est pas un choix possible pour le moment. Ce que je veux faire, c'est dire à la machine: "Faites ce que vous voulez, mais laissez de côté 20 Mo et du CPU sshd!".

Comment cela peut-il être fait?

phunehehe
la source
Sshd ne devrait pas exploser comme ça, c'est normalement un démon qui se comporte très bien. Assurez-vous qu'il est mis à jour au plus récent / meilleur. Qu'en faites-vous? Acheminez-vous des données massives?
Marcin
2
@Marcin Je ne pense pas que je fais quoi que ce soit de gros, l'édition de texte. Même s'il sshdse comporte bien, je pense qu'il serait bloqué s'il n'y avait pas assez de CPU / RAM à utiliser, n'est-ce pas?
phunehehe
Lorsque Linux manque de mémoire, il commence à tuer les processus de récupération de mémoire. Vous voyez peut-être OOM en action (tueur de mémoire). Je ne sais pas pourquoi cela déciderait de tuer votre sshd de manière cohérente. Avez-vous déjà vu sshd fuir (augmenter de taille) horriblement avant qu'il explose, ou cela fonctionne-t-il bien un moment et est-il mort le lendemain?
Marcin
@Marcin a des chances que s'il est OOM, le système est tellement enlisé qu'il ne peut tout simplement pas répondre, ce n'est pas un problème sshd mais un problème avec sa charge. Malheureusement, je ne connais pas la réponse à cela.
xenoterracide
@phunehehe êtes-vous sûr que le problème n'est pas lié à la mémoire de ssh et que votre chargement ne passe pas par le toit? est-ce que sshd donne des erreurs? quelle est la charge sur la boite? et ce qui fait que le système manque de mémoire.
xenoterracide

Réponses:

9

Vous pouvez probablement réaliser quelque chose comme ça en utilisant des groupes de contrôle avec le contrôleur de ressources mémoire .

Je suppose que vous mettriez toutes vos tâches consommatrices de ressources dans un nombre limité (CPU et RAM) cgroup, et que vous laisseriez sshd"à l'extérieur" afin qu'il ne soit pas restreint.

(L'ajout de plus de swap, même sous la forme d'un fichier de swap, peut être une bonne option cependant.)

Tapis
la source
J'hésite encore, ça n'a pas l'air facile (gâté par Ubuntu).
phunehehe
oh ce n'est certainement pas facile :-) L'ajout de swap est de loin plus facile.
Mat
@phunehehe bienvenue à être administrateur Sys, ce n'est pas facile. Mais maintenant, vous devez apprendre à ne pas faire de choses faciles.
xenoterracide
6

Oh mais les cgroups sont faciles :) Installez le paquet libcgroup. Créez un /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Démarrez le cgconfigprocessus qui créera la hiérarchie, les groupes de contrôle et définira les limites. Si cela réussit, vous avez deux groupes de contrôle, qui ont tous deux 50% du processeur alloué et 1 Go de mémoire disponible (je ne sais pas quelle est votre quantité réelle de mémoire disponible; en supposant que ce soit 2 Go dans cet exemple). Maintenant, il vous suffit de déplacer toutes les tâches (c'est-à-dire tous les processus en cours d'exécution sur le système) du groupe racine vers le groupe de contrôle nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Ensuite, il vous suffit d'obtenir le PID du sshdprocessus et de le déplacer dans le fichier de tâches sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, vous avez terminé. Vous pouvez maintenant être assuré que sshd aura toujours 50% du CPU et 1G de mémoire.

mart1n
la source
1

Utilisez renicepour obtenir une priorité plus élevée sshdou vérifier la comptabilité. (acct) -> avec cela, vous pouvez définir des ressources pour les utilisateurs, exécutez donc sshd avec s

MSpike
la source
J'ajouterais ioniceà cela aussi, et commencerais probablement sshd avec nice sans le retravailler plus tard.
xenoterracide
1

Une solution plus générale au problème de l'utilisation des ressources d'application consiste à exécuter vos applications dans un conteneur à l'aide de Docker . Vous pouvez ensuite exécuter des conteneurs avec des limites d'utilisation du processeur et de la mémoire similaires à cgroups.

docker run -c=10 -m=1g my-container
Sean Fujiwara
la source