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

27

Suite à une discussion ICI sur la PHP-FPMconsommation de mémoire, je viens de découvrir un problème de lecture de la mémoire dans la topcommande. Voici une capture d'écran de mon topjuste après le redémarrage PHP-FPM. Tout est normal: environ 20 PHP-FPMprocessus, chacun consommant 5,5 Mo de mémoire (0,3% du total).

entrez la description de l'image ici

Voici l'ancien serveur juste avant le redémarrage de PHP-FPM(un jour après le redémarrage précédent). Ici, nous en avons encore environ 25 PHP-FPMavec une 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?

entrez la description de l'image ici

Googlebot
la source
@ephemient non ce n'est pas le cas ici. J'ai vérifié toutes ces choses. Il s'agit d'un élément lié à PHP-FPM, et la mémoire sera libérée en redémarrant PHP-FPM uniquement. Quoi qu'il en soit, les valeurs de Mem et de buffer / cache in freesont identiques.
Googlebot
6
On dirait que vous exécutez une "VM" Virtuozzo. Tous les paris sont désactivés en ce qui concerne la comptabilité de la mémoire.
womble
Cher womble et éphémère: j'ai volé vos deux réponses! cackles
Wesley

Réponses:

34

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 la Mem:section, nous avons:

  • $n total: la quantité de RAM physique dans votre machine
  • $n used: la quantité de mémoire consommée par Linux, pas seulement la somme des processus.
  • $n free: Quelle quantité de 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 seul bloc de disque.

Dans la Swap:section, nous avons:

  • $n total: Auto-explicatif. Quantité d'espace disque disponible pour échanger des pages.
  • $n used: Auto-explicatif. 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 courez 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 montre la RAM totale en mégaoctets ( $n totalen haut), combien est utilisée ( $n useden haut), combien est gratuite ( $n freeen haut), combien est partagée (ignorez cela), et maintenant vient la bonne partie! Les colonnes bufferset sont cacheden free -mcorrélation avec, comme on pouvait le prévoir, $n bufferset $n cache. Mais jetez un oeil à la deuxième rangée free -mqui 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 la RAM car il est disponible pour la mise en cache du disque. Vous ne pouvez rien y faire à moins d'avoir envie de compiler un noyau personnalisé. Conseil de pro: ne le faites pas.

La RAM est vraiment là et gratuite pour les processus à utiliser à leur guise. C'est ce que l'on entend par la -/+ buffers/cache:rangée 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).

Wesley
la source
La quantité utilisée n'est-elle pas ((used-buffers) -cached)?
mac
1

Top n'est pas le meilleur moyen de vérifier l'utilisation de la mémoire. Cependant, comme ma question a été marquée comme un double 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

Sortie:

# 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
=================================
Utilisateur
la source