L'exécution d'une commande renvoie «Impossible d'allouer de la mémoire» sur le serveur Ubuntu

16

J'utilise Ubuntu 14.04. Récemment, lorsque je me connecte via SSH avec mon utilisateur disposant des privilèges sudo, chaque commande que j'exécute entraîne une erreur «Impossible d'allouer de la mémoire». En voici quelques-unes que j'ai essayées sur ma console

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

Même si j'essaye, sudo reboot nowj'obtiens l'erreur ci-dessus, donc je ne sais pas quoi d'autre je peux essayer de déverrouiller mon instance. L'hôte est DigitalOcean si cela importe.

Edit: Par la réponse / suggestion donnée ici est la sortie de "gratuit"

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory
Dave
la source

Réponses:

12

Solution

Comme il est indiqué dans les messages d'erreur, votre machine est à court de mémoire. Cela peut être dû à un certain nombre de raisons, mais en gros, quelque chose consomme toute votre mémoire et n'en laisse aucune pour une utilisation même basique des commandes.

Je vous suggère de redémarrer votre droplet (allez simplement dans le panneau de configuration de votre client et sélectionnez "Redémarrer"), sshpuis exécutez topou htop. Gardez un œil sur l'utilisation de la mémoire et voyez quel processus utilise toute la mémoire. De là, essayez soit

  1. Suppression / suppression du programme / processus défectueux

    AVERTISSEMENT : veuillez d'abord rechercher si le processus est un processus système essentiel! Si un processus système cause des problèmes de mémoire, ne vous contentez pas de le tuer, faites des recherches sur lui et sur les moyens spécifiques de le gérer.
  2. Modification de la configuration de ce programme / processus afin qu'il ne consomme pas toute votre mémoire.

Suggestions pour éviter que le problème ne se reproduise

  • Une bonne chose à faire est d' ajouter de la mémoire d'échange , car elle alloue plus de mémoire si vous manquez.
  • Chaque fois que vous installez des programmes, assurez-vous de les configurer correctement afin qu'ils ne fonctionnent pas de manière inattendue (comme manger de la mémoire)
  • Après chaque fois que vous ajoutez un package ou que quelque chose de nouveau est configuré, vérifiez avec htopou toppour voir la quantité de mémoire que vous utilisez avec les programmes actuels. Si vous remarquez que vous utilisez presque tout cela, essayez d'en éliminer certains en parcourant et en supprimant les programmes / processus inutiles.
  • S'il y a quelque chose qui démarre automatiquement (à part les processus système, bien sûr!) Que vous ne reconnaissez pas ou que vous souhaitez démarrer automatiquement, supprimez-le! Mais faites toujours vos recherches sur ce qu'est un processus avant de le tuer / le supprimer, car cela pourrait être essentiel pour les procédures de démarrage ou les fonctions système, etc.
L'intrus
la source
7

Pour sortir de cette condition sans redémarrer, vous pouvez déclencher le tueur OOM manuellement comme suit:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

Référence

Luke F
la source
Avez-vous une documentation prenant en charge ces commandes? Pourquoi pas juste sudo sysctl -w vm.oom_kill_allocating_task=1ou en permanence/etc/sysctl.conf .
Pablo Bianchi
1
Ne semble pas que cela ferait une différence, le système n'atteint pas une condition de MOO réelle si cela se produit au repos car aucun processus n'essaie d'allouer de la mémoire et aucun processus supplémentaire ne peut être démarré. Et semi-indépendant, mais vous ne pourrez pas utiliser sudo ou sysctl une fois dans cet état.
Luke F
Cela a fonctionné pour moi. Je ne sais pas comment, je m'en fiche. Je ne pouvais même pas courir sudo rebootavant de lancer ça. Merci!
boulder_ruby
0

Pour compléter la réponse acceptée, il y a une chose supplémentaire à considérer: votre système peut manquer de descripteurs de fichiers ou même de tampons de socket et avoir encore beaucoup de mémoire tout en donnant la même erreur. Cela est particulièrement vrai si l'hébergement partagé impose des limites de cette nature. Sur les systèmes OpenVZ, regardez le contenu de

# cat / proc / user_beancounters

Cela vous donnera dans la colonne la plus à droite les premiers dépassements. Si cela est vrai, passez à un package d'hébergement plus grand ou traquez le coupable le plus probable: la base de données mysql ou mariadb qui peut, en présence d'une application PHP défectueuse, fuir le fichier des centaines de secondes.

Cela peut également se produire si votre serveur Web a ouvert ssh à Internet et accepte les identifiants de connexion par nom d'utilisateur / mot de passe: même si vous exécutez fail2ban, vous avez peut-être attiré une interruption de dictionnaire distribuée qui consomme également beaucoup de ressources.

aquaherd
la source