web-dev-qa-db-fra.com

Comment interpréter la sortie de la commande 'top' de Linux?

Suite à une discussion faite ICI sur la façon dont PHP-FPM consommant de la mémoire, je viens de trouver un problème lors de la lecture de la mémoire dans la commande top. Voici une capture d'écran de mon top juste après avoir redémarré PHP-FPM. Tout est normal: environ 20 PHP-FPM processus, chacun consommant 5,5 Mo de mémoire (0,3% du total).

enter image description here

Voici l'ancien serveur juste avant le redémarrage de PHP-FPM (un jour après le redémarrage précédent). Ici, nous avons encore environ 25 PHP-FPM avec double utilisation de la mémoire (10 Mo indiquant 0,5% du total). Ainsi, la mémoire totale utilisée devrait être de 600 à 700 Mo. Alors, pourquoi une mémoire de 1,6 Go a-t-elle été utilisée?

enter image description here

27
Googlebot

TL; DR 1

Votre serveur se trouve dans une sorte de conteneur virtuozzo/openvz/ virtualization-du-jour . Essayer de donner un sens à l'utilisation de la mémoire consiste à incliner les moulins à vent.

TL; DR 2

Linux a mangé votre RAM! Mais ça va, ça le fait pour tout le monde.


La longue histoire

Décomposons-le!

Dans le Mem: section nous avons:

  • $n total: la quantité de physique RAM dans votre machine
  • $n used: la quantité de mémoire consommée par Linux, pas seulement la somme des processus.
  • $n free: Combien RAM n'est pas consommée par Linux. Cela ne tient pas compte du fait que la mémoire mise en cache et tamponnée est par essence "libre".
  • $n buffers: l'espace tampon est l'endroit où les blocs d'E/S disque ayant été lus ou en attente d'écriture sont stockés. Un tampon est une représentation RAM d'un bloc de disque unique.

Dans le Swap: section nous avons:

  • $n total: Explicite. Quantité d'espace disque disponible pour échanger des pages.
  • $n used: Explicite. Combien d'espace d'échange de disque est utilisé.
  • $n free: Herp Derp.
  • $n cache: Étroitement lié aux tampons ci-dessus. Il fait en fait partie du cache de pages et n'a lui-même aucun espace sur le disque physique. Ne vous inquiétez pas des détails de cette conversation.

La partie intéressante survient lorsque vous exécutez free -m. Vous verrez trois lignes, et tous les nombres seront en corrélation avec le haut. Je vais donner mon propre PC comme exemple:

             total       used       free     shared    buffers     cached
Mem:          8070       7747        323          0        253       5713
-/+ buffers/cache:       1780       6290
Swap:         5055          0       5055

La ligne Mem affiche le total RAM en mégaoctets ($n total en haut), combien est utilisé ($n useden haut), combien est gratuit ($n free en haut), combien est partagé (ignorez cela), et maintenant vient la bonne partie! Les colonnes buffers et cached dans free -m corrélé à, de façon prévisible, $n buffers et $n cache. Mais jetez un œil à la deuxième rangée, celle de free -m qui commence par -/+ buffers/cache:. Le calcul montre que le montant utilisé est vraiment (total) (used-buffers) -cached). Free est (total) - (theNewUsed).

Qu'est-ce que tout cela signifie? Cela signifie que --- ( Linux a mangé votre RAM! La courte histoire est que le noyau Linux engloutit RAM car il est disponible pour la mise en cache du disque. Il n'y a rien que vous puissiez faire à moins que vous ayez envie d'essayer de compiler un noyau personnalisé. Astuce Pro: Non.

Le RAM est vraiment là et gratuit pour les processus à utiliser à leur gré. C'est ce que l'on entend par le -/+ buffers/cache: ligne dans free -m. Cependant, vous êtes à l'intérieur d'un conteneur de virtualisation non hyper-visor, ce qui rend les choses un peu sordides. Vous ne pouvez tout simplement pas faire le point sur votre mémoire avec une précision d'octet à ce stade. Cependant, vous ne voyez aucun comportement terriblement inhabituel.

Garder le calme et continuer. Obtenez également un serveur physique (sauf si vous aimez les statistiques de mémoire qui ressemblent à Kreskin est votre SysAdmin).

34
Wesley

Top n'est pas le meilleur moyen de vérifier l'utilisation de la mémoire. Cependant, puisque ma question a été marqué comme doublon de cette question, je vais publier ma résolution ici.

J'ai lu sur un forum que ps_mem.py vérifiera l'utilisation de la mémoire pour vous.

Référentiel: https://github.com/pixelb/ps_mem/

Télécharger:

pip install ps_mem

Usage:

ps_mem

Production:

# ps_mem
 Private  +   Shared  =  RAM used   Program

  4.0 KiB +  15.5 KiB =  19.5 KiB   udevd
  4.0 KiB +  16.0 KiB =  20.0 KiB   mysqld_safe
  4.0 KiB +  25.5 KiB =  29.5 KiB   dbus-daemon
  4.0 KiB +  27.5 KiB =  31.5 KiB   xinetd
 60.0 KiB +  14.5 KiB =  74.5 KiB   epmd
108.0 KiB +  23.0 KiB = 131.0 KiB   init
  8.0 KiB + 135.0 KiB = 143.0 KiB   saslauthd (2)
180.0 KiB +  34.0 KiB = 214.0 KiB   check_scripts.s
796.0 KiB +  41.0 KiB = 837.0 KiB   bash
528.0 KiB + 359.0 KiB = 887.0 KiB   crond (7)
  1.2 MiB + 218.0 KiB =   1.4 MiB   sshd (2)
  1.6 MiB +  45.0 KiB =   1.6 MiB   rsyslogd
  2.0 MiB + 133.0 KiB =   2.1 MiB   beam.smp
  1.3 MiB +   2.3 MiB =   3.6 MiB   httpd (8)
 12.8 MiB + 956.0 KiB =  13.8 MiB   sendmail.sendmail (7)
 53.5 MiB + 114.0 KiB =  53.7 MiB   mysqld
317.6 MiB +   2.3 MiB = 320.0 MiB   python (6)
---------------------------------
                        398.5 MiB
=================================
1
User