web-dev-qa-db-fra.com

Comment limiter un service SystemD pour "jouer sympa" avec la CPU?

J'ai un service SystemD (un coureur CI) qui a tendance à faire tourner le système avec des emplois à forte intensité de CPU. J'ai attrapé la moyenne de la charge volante sur 100 maintenant et je veux mettre un terme à ce non-sens.

Rien d'autre sur le système n'est limité de quelque manière que ce soit, donc l'accord est que je veux que tout le reste continuait comme il fonctionnerait maintenant, soit comme suit:

  • (a) chaque processus fonctionnant comme utilisateur unique que les travaux CI fonctionnent comme ou
  • (b) tout processus enfant instancié par le démon de service SystemD

... jouer au deuxième violon pour tout le reste sur le système. En fait, je voudrais qu'ils aient quelque chose comme un plafond absolu de 90%, même lorsque rien d'autre sur le système n'a besoin des 10% restants des cycles du processeur, mais si quelque chose d'autre demande à tous les temps de la CPU, je voudrais qu'ils obtiennent autant que ils veulent d'abord.

Quelle est la meilleure façon de configurer cela? Je suis en train d'exécuter Arch Linux sur EC2 et des cgroupes sont disponibles (y compris CGManager) mais ne les utilisez jamais.

8
Caleb

Tout d'abord, la plupart de ce qui se propose à la recherche sur le Web a été obsolète. Par exemple, cgmanager n'est plus pris en charge sur les nouvelles versions SystemD. Ne suivez pas 99% de ce qui se présente dans des serches Web jusqu'à l'aide de cuplimit, Nice, cgset ou d'autres outils pour cet emploi. Ils ne travailleront pas du tout comme annoncé (comme dans le cas des outils de gestion Cgroup qui s'attendent à créer votre propre hiérarchie) ou ne feront pas le travail sans recourir à de nombreux hacks (comme dans le cas d'utilisation " Nice 'niveaux à gérer des groupes entiers de processus).

La bonne nouvelle est que, avec ces dépréciations (et poursuivre le traditionnel monstre pieuvre tout dévorant modus operandi de SystemD) a La configuration par défaut est en place pour tout sur le système et le modifier pour SystemD Services est trivial. Il suffit d'ajouter une configuration de superposition au service que vous souhaitez limiter:

$ Sudo systemctl edit <servicename>

Ajouter une section avec tout Valeurs de contrôle des ressources Vous souhaitez remplacer. Dans mon cas, je suis venu avec ceci:

[Service]
CPUWeight=20
CPUQuota=85%
IOWeight=20
MemorySwapMax=0

Ces valeurs ne sont pas toutes nécessaires, mais les deux premières répondent à la question posée:

  • CPUWeight par défaut sur 100 pour tous les processus du système. La définition d'une faible valeur permet toujours à traiter l'utilisation de la CPU si rien d'autre ne maintient efficacement au système sensible à d'autres tâches tout en ralentissant beaucoup les résultats. Ceci est un entier de poids arbitraire.
  • CPUQuota est une limite absolue sur la quantité de processeur de la CPU, même si rien d'autre ne se passe. Ceci est une valeur de pourcentage. Dans mon cas, il n'était pas vraiment nécessaire de définir cela pour résoudre le problème de la collecte de ressources. J'ai fini par le mettre de toute façon pour maintenir la température de la CPU lorsque de nombreuses tâches CI s'accumulent.
  • IOWeight est beaucoup identique à CPUWeight, dans ce cas utilisé pour garder les disques libres pour les tâches du système et les conserver uniquement avec les emplois CI lorsque rien d'autre ne se passe.
  • MemorySwapMax N'importe pas de la question, dans mon cas, j'ai fini par y ajouter parce que le rayon Traver (povray) exécuté dans certains emplois CI semble penser en utilisant plus de 30 concerts d'échange d'échange en plus des 30 gigs de 3+ de RAM dans ce système est une bonne idée juste parce qu'il est là. Il fonctionne plus vite si vous ne le laissez pas l'utiliser du tout. Ceci est probablement Quelque chose de mieux configuré dans Povray, mais de cette façon, je n'ai pas à contrôler ce qui se passe à l'intérieur des emplois CI et que vous ne devez pas désactiver le swap du système.

Enfin, ces valeurs peuvent être modifiées à la volée sans redémarrer des services en exécutant systemctl daemon-reload. Ceci est assez pratique pour regarder l'effet des changements tout de suite.

11
Caleb