Linux quantité totale de mémoire disponible
J'essaye de trouver une bonne formule pour connaître la quantité de mémoire disponible. Je suis l'aide de la formule suivante: freeMem = MemFree + Buffers + Cached - Shmem
. Toutefois, selon cette formule de mon système embarqué est en train de perdre la mémoire. Maintenant, je me demande si j'ai une fuite de mémoire donc, j'ai activé kmemleak
dans le noyau. Selon mpatrol
, valgrind
, et coverity
je n'ai pas de fuites dans l'espace utilisateur. Est-il une fuite dans l'espace du noyau ou est ma formule? Notez que je n'ai pas de swap pour cet appareil.
MYBOX> cat /proc/meminfo
MemTotal: 2073348 kB
MemFree: 1388180 kB
Buffers: 137016 kB
Cached: 88772 kB
SwapCached: 0 kB
Active: 589124 kB
Inactive: 44380 kB
Active(anon): 410236 kB
Inactive(anon): 1992 kB
Active(file): 178888 kB
Inactive(file): 42388 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 1310716 kB
HighFree: 811828 kB
LowTotal: 762632 kB
LowFree: 576352 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 64 kB
Writeback: 0 kB
AnonPages: 407712 kB
Mapped: 26140 kB
Shmem: 4516 kB
Slab: 40408 kB
SReclaimable: 8320 kB
SUnreclaim: 32088 kB
KernelStack: 1480 kB
PageTables: 1464 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1036672 kB
Committed_AS: 660508 kB
VmallocTotal: 237344 kB
VmallocUsed: 104556 kB
VmallocChunk: 126296 kB
OriginalL'auteur atomicbaum | 2011-12-01
Vous devez vous connecter pour publier un commentaire.
Une fuite de mémoire à partir de l'espace utilisateur ne serait pas montrer de toute façon dans
/proc/meminfo
car en ce qui concerne le noyau, il est la mémoire allouée (peu importe si vous utilisez free() dans votre espace utilisateur de l'app ou pas, c'est soit alloué avec le mmap() syscall ou brk()/sbrk() et le noyau conserve une trace des pages allouées en userland, faute de quoi nous serions dans de sérieux ennuis ;).Je n'ai pas de comprendre clairement comment vous est venu votre croyance que vous êtes une fuite de mémoire? Voici un bon lien redhat/meminfo si vous ne l'avez pas lu déjà ce qui explique que chaque statistique signifie vraiment.
Yep
/proc/meminfo
permettrait de voir l'ensemble de la chose, mais vous ne pouvez pas faire une équation de ce à deviner une fuite de mémoire. D'autre part, vous pouvez détecter que de plus en plus de mémoire est utilisé, si c'est ce que vous dites. Dans ce cas, au lieu d'essayer de faire votre propre équation, vous pouvez utiliser lefree -m
commande comme expliqué ici: blog.scoutapp.com/articles/2010/01/11/.... Si vous avez encore de l'avis de la mémoire disponible va vers le bas et il n'y a définitivement quelque chose à manger plus et plus de mémoire (mais pas nécessairement une fuite de mémoire 😉Je ne sais pas pourquoi je ne regarde pas libre avant... à la Recherche à la source pour le "libre" de commande, il ressemble à la formule "kb_main_free + kb_main_buffers + kb_main_cached", et il ne saisir que les ne viennent de /proc/meminfo... (regardant sysinfo.c et gratuit.c).
Alors, êtes-vous en disant que vous avez remarqué que votre mémoire libre disponible à la baisse? Parce que de votre question, j'ai compris que vous ne pouviez pas trouver une partie de la mémoire par la somme de votre freeMem et la mémoire utilisée. Vous avez votre répondu que votre équation est correcte pour le freeMem, comment au sujet de celui que vous utilisez pour l'utilisation de la mémoire? Quels sont exactement vous remarquer?
Je m'aperçois d'un lent déclin de la mémoire avec un système assis là. Quelque chose POURRAIT être de plus en plus dans la mémoire lentement ou il pourrait juste être une petite fuite de mémoire quelque part. Je perds environ 10 mo par semaine.
OriginalL'auteur Quentin Casasnovas
Votre "mémoire" de calcul est manquer une chose - il faut ajouter
SReclaimable
(pour la remise en état du cache) à l'effet-mémoire libre.Si cela ne change pas la lenteur de la réduction efficacement sans mémoire au fil du temps, vous devriez prendre des instantanés de
/proc/meminfo
à intervalles réguliers et d'identifier la ligne montre la hausse.Si c'est le
SUnreclaim
ligne est à la hausse, vous pouvez regarder dans/proc/slabinfo
pour voir votre noyau dalle d'utilisation et d'identifier le coupable. Il est possible que c'est tout simplement une fragmentation de la mémoire que vous observez, et il finira par s'installer sur une plus longue période de temps.Il est entièrement dépendant du contexte, tout comme une grande quantité de l'espace utilisateur de la mémoire n'est pas nécessairement une bonne ou une mauvaise chose. Si vous avez besoin de la mémoire pour autre chose (et il semble que vous faites), alors vous voudrez probablement pour identifier les pourquoi de la mémoire consommée par la plaque cache - vérifier
/proc/slabinfo
comme une première étape.OriginalL'auteur caf
D'accord avec auxv - à l'aide de /proc/meminfo est probablement pas le meilleur moyen de suivi de l'utilisateur de la mémoire du processus, car il comprend la mémoire allouée par tous les processus utilisateur, rendant difficile de réduire la consommation de votre processus.
Un meilleur moyen de suivre la quantité totale de mémoire consommée par votre processus serait d'utiliser
top (1)
et de regarder VIRT (qui comprend une mémoire permutée) ou RES (qui ne comprend que la mémoire physique).Mais si vous voulez utiliser /proc/meminfo alors la formule que j'ai devrait être:
...notez que cela ne représente pas plus de données, pas de code. La plupart des MemTotal - (quantité sur la droite de l'équation) doit être l'image du noyau.
/proc/meminfo
juste ne dis rien à propos de la fuite de mémoire. Vous ne pouvez pas vraiment de deviner une fuite de mémoire avec le haut comme la perte de mémoire apparaissent en tant que régulier VIRT mem.(encore une fois pas de trou dans l'équation)Désolé, le commentaire était trop long... Mais je suis d'accord avec vous que l'OP du trou, qui est (mal) interprété comme une fuite de mémoire est surtout l'image du noyau de code et quelques autres quelques bits réservés par le noyau (expliqué sur le lien dans ma réponse).
Le système ne dispose pas de swap, mais je voudrais savoir combien de mémoire est disponible pour l'ensemble du système. Je ne suis pas sûr de ce que tu veux dire par "cela ne représente pas plus de données, pas de code". Parlez-vous des programmes chargés dans la RAM?
auxv: je vois ce que tu veux dire, mais je voudrais quand même difficile de ne pas dire impossible. Vous pouvez faire des décent progrès par le biais de statistiques, par exemple, voir: usenix.org/event/osdi08/tech/full_papers/bhatia/bhatia_html atomicbaum: je parlais du noyau binaire (vmlinux).
En indiquant votre lien, "Choptix recueille en permanence les profils de bas niveau des événements du système d'exploitation [...] à la granularité des exécutables, de procédures et d'instructions" je.e pas du tout le niveau de granularité qui
/proc/meminfo
vous donne.OriginalL'auteur er0
Pour mes systèmes, je suis en utilisant la commande suivante pour vérifier la quantité de mémoire consommée:
Ceci s'ajoute le pourcentage total d'utilisation de la mémoire de tous les processus qui sont actuellement en cours d'exécution.
OriginalL'auteur user1403360
FreeMem = MemFree + Tampons + Cache - Mappé, La mémoire cache contient les mappé partie, cette partie ont été cartographiés à l'espace utilisateur.
OriginalL'auteur Samuel
Auparavant, il était MemFree + attrapé ( ce qui est correct de nombreuses années en arrière).
Maintenant, il est MemFree + Active(fichier) + Inactifs(fichier) + SRreclaimable .
Pour plus de référence à travers le lien ci-dessous par LINUX TORVALD.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
OriginalL'auteur Arjun Jv