Comment empêcher autant d'exemples d'apt-check en cours d'exécution?

18

J'ai un serveur Ubuntu 12.04 qui vient de planter pour une cause très évidente: plus de 30 apt-checkprocessus consommant toute la mémoire, le tueur OOM intervient, tuant des services vitaux. Je ne sais pas d'où apt-checkviennent les processus, mais je suppose que mes plugins Nagios / Icinga check_aptpourraient l'utiliser, ainsi que la byobuligne d'état pourrait vouloir afficher sa sortie. Je suppose que quelque chose s'est enfermé et que tous les processus attendaient, tout en gardant de la mémoire.

Comment puis-je empêcher d'avoir autant d'instances apt-checksur le système? Cela n'a pas de sens pour moi et il devrait juste se fermer dès qu'il ne peut pas obtenir un verrou de lecture sur la base de données dpkg.

Il semble que je ne sois pas le seul à avoir des ennuis ici. Toutes les suggestions apt-checksont assez négatives:

entrez la description de l'image ici

(navigateur propre, non connecté, pas de recherche personnalisée)

gertvdijk
la source

Réponses:

8

Certains plongent dans apt-checkm'a donné ces indices pour être un script très brut qui doit être corrigé. Avec tout le respect que je dois à ses auteurs, il échoue sur mes serveurs. Voici mes pensées:

  • apt-check == /usr/lib/update-notifier/apt_check.py
  • force nicelevel 19 pour lui-même
  • aucun délai d'expiration défini pour les actions

La combinaison des deux derniers lui permet de s'entasser indéfiniment en spirale vers le bas. Si le système est utilisé à d'autres fins avec une priorité plus élevée, la quantité de processus augmentera simplement et il n'y a pas de fin, car il apt-checkn'aura jamais de priorité sur lui. Les problèmes ne s'aggraveront que lorsque le tueur OOM décidera de tuer les processus vitaux de votre système.

Si l'un de ces deux aspects du comportement était différent, cela ne permettrait pas au système de se retrouver dans un tel état de rupture, c'est mon hypothèse.

Bien que les chaînesapt-check aient raison sur le fait que les processus parents sont également responsables de cela, je pense que les points ci-dessous sont des défauts et doivent être signalés comme un bogue pour être traités correctement:

  • il devrait faire allusion au tueur OOM pour se faire tuer en premier
  • il ne doit pas définir le code nicelevel en dur
  • il devrait se fermer s'il faut un temps déraisonnable pour obtenir des informations

En fait, il semble que le tueur Linux OOM fasse une heuristique à ce sujet. Les processus agréés obtiendront un score accru et les processus de longue durée seront diminués. ( source - merci à Ulrich Dangel de l' avoir signalé )

Solution possible que je peux proposer:

  • cache les résultats après le traitement
  • cache de sortie si moins de N secondes sans charger toutes les bibliothèques Python-APT pour chaque --helpappel simple (pair ).
  • rendre le nicelevel configurable - Permettez-moi de changer / désactiver cela, s'il vous plaît! Je crois que le mettre à 0 aidera réellement
  • faire augmenter le score de tueur OOM
gertvdijk
la source
Je pense que vous avez raté la plus grande chose à faire: utiliser un fichier de verrouillage et ne pas autoriser l'exécution de plusieurs instances à la fois.
derobert
@derobert C'est un script que n'importe quel utilisateur peut exécuter, sans privilèges spécifiques sur Ubuntu, pas un démon. Ou puis-je utiliser /var/run/ /tmppour ce fichier de verrouillage lisible / inscriptible en toute sécurité? Gros trou là-bas: ajoutez un fichier de verrouillage et l'administrateur ne sera pas informé des mises à jour du système!
gertvdijk
Quel que soit le lancement automatique (entraînant l'exécution de plus de 30 copies), il faut effectuer le verrouillage. Ou il pourrait le faire lui-même, par utilisateur. Quoi qu'il en soit, c'est un bug qui doit être résolu.
derobert
Nagios / Icinga semble éviter l'écueil. Au moins, il avait un délai d'attente de 10 secondes et a averti s'il était dépassé. (Bien que je ne trouve pas comment configurer le délai d'attente - je préfère plus longtemps). C'est Byobu sur Debian qui a causé le problème pour moi; sur Ubuntu, il est censé être corrigé .
sourcejedi
4

Vous devez savoir quel processus génère apt-check. vous pouvez utiliser quelque chose comme ps pour obtenir l'arborescence des processus.

ps -A --forest

Si apt-check n'a pas de parents, cela pourrait être un problème avec apt-check lui-même et pas un programme en particulier. si tel est le cas, j'essaierais de déboguer apt-check.

cordes
la source
Merci. M'a donné quelques idées à approfondir. Cependant, cela m'a amené à croire que c'est un problème de apt-checkvraiment - voir ma propre réponse .
gertvdijk
Si cela consomme de la mémoire et du temps CPU, ce n'est pas un zombie.
Gilles 'SO- arrête d'être méchant'
@Gilles bon point.
cordes
0

Base écrite sur Ubuntu 12.04

J'ai le même problème et j'ai découvert que c'est à cause de byobu, si je lance juste apt-get updatene pas utiliser byobu, il n'y aura pas de check-aptprocessus. En outre, il se rapporte à l' update-notifieremballage, quand j'ai enlevé ces paquets (mise à jour-notifer-commune, mise à jour-notificateur), en utilisant byobuet exécuter apt-get update, il a couru une autre commande , mais tout à fait la même mémoire en utilisant: apt-get -s -o Debug::NoLocking=true upgrade.

D'autres choses peuvent fonctionner apt-get update(mais ne fonctionnent probablement pas check-apt)

  • passer l'argument à check_aptpour mettre à jour / mettre à niveau le paquet.
  • s'il est configuré, /etc/cron.daily/aptpeut également mettre à jour la liste des packages (voir https://help.ubuntu.com/lts/serverguide/automatic-updates.html ), mais il ne s'exécute qu'une fois par jour et ne devrait pas poser de problème.

Sur un bureau, il peut y avoir plus de choses impliquées.

Conclude: byobuintercepte l'événement lorsque vous exécutez apt-get updateet déclenchez ces check-aptprocessus, reconfigurez la barre d'état de byobupour résoudre ce problème.

HVNSweeting
la source