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.
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:
man smem
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: