web-dev-qa-db-fra.com

Manière générale de surveiller TOUTES les utilisations de la mémoire

J'ai Kubuntu 16.04 et j'utilise ZFS.

Comme vous pouvez le voir sur superutilisateur , je viens de parcourir un long chemin pour retrouver les endroits où ma mémoire disparaissait.

Il s’est avéré que c’était l’ARC de ZFS qui le mangeait sans apparaître nulle part dans les outils/fichiers autres que son propre fichier spécial /proc/spl/kstat/zfs/arcstats

Existe-t-il un moyen générique de connaître la quantité de mémoire utilisée par le noyau et, si possible, par quels modules du noyau?

Exemple:

free -h me montrait ceci:

              total        used        free      shared  buff/cache   available                                           
Mem:            31G         19G        1.8G        406M         10G        5.2G                                           
Swap:          8.0G          0B        8.0G 

Donc, 19 Go en cours d'utilisation. Mais TOP ne m'a montré que 8 Go de mémoire utilisée. Alors je suis allé à la recherche de l'autre 11GB. 6GB s'est avéré être une dalle visible dans /proc/memstat et avec nmon. Mais il manquait encore 5 Go.

Finalement, j'ai trouvé qu'il avait été consommé par l'ARC de ZFS. Mais il ne figurait que dans son propre fichier d’informations spécial. /proc/spl/kstat/zfs/arcstats

Ni /proc/memstat, ni top, htop, nmon, free ou atop ne peuvent me dire qui utilise ces 5 Go.

Existe-t-il un fichier/outil permettant de visualiser la mémoire utilisée par ces modules spéciaux , sans connaître ni comprendre ces modules? Ou dois-je rendre compte de chaque module existant si je veux écrire un outil de surveillance qui puisse me le dire?

De mon point de vue, les informations de mémoire sous Linux sont un véritable gâchis. Douze des nombres qui ne totalisent pas la mémoire totale. Je parie que free calcule le paramètre "en cours d'utilisation" en soustrayant le total/free/cache/buffers.

J'aimerais avoir/écrire un outil/une information où je peux voir

Total memory: 32GB
  in use: 19GB
    processes: 8GB
    slab: 5GB
    mapper: 1Gb
    kernel modules: 5Gb
       kernel: 0.3GB
       spl: 4.7GB
  cache: 6GB
  buffers: 2GB
  free: 5GB
Additional stats:
  Active memory: 8.3GB
    Active(anon): 7.1GB
    Active(file): 1.2GB
  Inactive memory: 2.4GB
  ...

Vous savez, où chaque sous-section ajoute sa section parente et chaque octet de mémoire est comptabilisé;)

Un tel outil est-il donc possible sous Linux? Est-ce qu'il existe déjà?

Mise à jour 1

L'outil smem, comme suggéré ci-dessous, présente en effet une colonne "Mémoire dynamique du noyau" qui totalise jusqu'à 100% de la mémoire et représente l'ARC. Cependant selon cette réponse

BTW: J'ai déjà vérifié les sources smem, c'est fondamentalement le cas (memtotal - userspace - free - cache).

Donc, ceci n’est possible qu’en soustrayant simplement tous les chiffres connus de/proc/memstat et en étiquetant ce qui manque comme "mémoire dynamique du noyau non cachée". et espérons vraiment que le noyau Linux a plus à offrir que cela.

5
Torge

Vous pouvez essayer smem pendant au moins une bonne partie de ce que vous recherchez.

Il est disponible dans le référentiel Univers et peut être installé avec _Sudo apt-get install smem_

Un certain nombre de commutateurs utiles sont décrits dans la page de manuel _man smem_.

Quelques exemples sont les suivants: Remarque J'utilise le commutateur -t pour les totaux dans tous les exemples pour des raisons de concision. vous pouvez l'omettre si vous voulez une sortie plus détaillée.

_PSS is the interesting column in these examples as it takes shared memory into account.
Unlike RSS it's meaningful to add it up.
_

À l'échelle du système

_me@zippy-64bit:~$ smem -tw
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory        989656     860076     129580 
userspace memory             936032     180020     756012 
free memory                 5692716    5692716          0 
----------------------------------------------------------
                            7618404    6732812     885592 
_

Par utilisateur

_me@zippy-64bit:~$ smem -tu
User     Count     Swap      USS      PSS      RSS 
me          67        0   861452   898915  1245592 
---------------------------------------------------
            67        0   861452   898915  1245592
_

Il convient également de noter smemcap pour la capture de données en vue d'une analyse ultérieure avec smem et smemstat , qui indique l'utilisation de la mémoire physique en tenant compte de la mémoire partagée. L'outil peut signaler un instantané actuel de l'utilisation de la mémoire ou vider périodiquement les modifications apportées à la mémoire.

Il y a aussi une liste au bas de la page de paquets similaires.

Sources:

Alternative 1: Vous pouvez également envisager d’analyser la sortie de _cat /proc/meminfo_ ou si vous le souhaitez à la page _less /proc/meminfo_

La plupart des informations ici sont utilisées par les commandes free, top et ps. En fait, le résultat de la commande free est similaire en apparence au contenu et à la structure de/proc/meminfo. Mais en regardant directement dans/proc/meminfo, de nombreux autres détails sont révélés, notamment:

_$ cat /proc/meminfo | grep "Slab"
Slab:             267680 kB
_

Source alternative: https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-proc-topfiles.html

Alternative 2: Si vous êtes vraiment déterminé à mieux analyser le noyau RAM, vous pourriez lancer votre propre kstat. Bien que kstat semble être une commande Solaris uniquement. Le lien ci-dessus vous mènera aux sources d'une tentative de code source ouvert kstat modifiée pour la dernière fois en 2013 (à compter de cette édition.) Un programmeur C intelligent pourrait peut-être modifier le code dans son but spécifique.

Alternative 2 source:

6
Elder Geek