Encore une question sur la mémoire sous Solaris 10.
Un top me montre que j'ai 672 Mo de mémoire libre:
130 processes: 126 sleeping, 2 zombie, 2 on cpu
CPU states: 95.1% idle, 3.9% user, 1.0% kernel, 0.0% iowait, 0.0% swap
Memory: 16G phys mem, 672M free mem, 2048M total swap, 2023M free swap
Un vmstat me montre la même chose:
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr rm s0 s1 s2 in sy cs us sy id
0 0 0 564744 687896 3 13 0 0 0 0 0 0 0 0 0 354 667 752 1 1 98
Mais quand je fais une taille prstat -a -s j'obtiens ceci:
NPROC USERNAME SWAP RSS MEMORY TIME CPU
45 orbixadm 1449M 1592M 9.7% 4:46:53 0.4%
48 root 146M 160M 1.0% 8:09:49 1.2%
3 user1 46M 204M 1.2% 0:00:45 0.0%
9 webservd 46M 14M 0.1% 0:00:00 0.0%
5 ctxsrvr 28M 32M 0.2% 4:54:51 0.0%
11 user2 23M 34M 0.2% 0:00:37 0.2%
4 user3 4840K 11M 0.1% 0:00:01 0.0%
1 smmsp 1456K 4552K 0.0% 0:00:24 0.0%
2 daemon 2128K 6224K 0.0% 0:06:32 0.0%
1 user4 1232K 3608K 0.0% 0:00:00 0.0%
1 nagios 376K 2472K 0.0% 0:15:18 0.0%
et comme vous pouvez le voir, la somme des valeurs RSS n'atteint pas 15 Go de mémoire, et même si j'y ajoute des valeurs SWAP.
Donc ma question est: quelle commande est-ce que je crois?
Si top et vmstat me donnent le bon résultat, où sont mes 15 Go de mémoire utilisée? Sinon, pourquoi me montrent-ils cela?
Edit: le résultat de la commande: % echo ::memstat | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1687138 13180 82%
Anon 137110 1071 7%
Exec and libs 47107 368 2%
Page cache 95277 744 5%
Free (cachelist) 22248 173 1%
Free (freelist) 69592 543 3%
Total 2058472 16081
Physical 2055442 16058
Modifier 2:
Ok, maintenant je peux voir la mémoire utilisée par le cache ARC.
Mais avec de nouveaux tests, j'ai maintenant:
2066 MB used
(résultat prstat -Z et echo :: memstat | mdb -k )
1193 MB free
( résultat supérieur )
8859 MB ARC cache
( kstat zfs :: arcstats: résultat de taille )
Ce qui nous donne plus ou moins 12 GB
de mémoire, alors que mon système en a 16 GB
.
Peut-être que j'ai raté quelque chose d'autre, mais où sont les autres 4 GB
?
la source
kstat zfs::arcstats:size
sortie à votre question.Réponses:
ZFS utilise probablement la majeure partie de votre mémoire comme cache ARC. Si vous souhaitez savoir comment votre RAM est utilisée, exécutez cette commande en tant que root:
Sur Solaris 10 10/09 et plus récent, cela affiche quelque chose comme ceci:
Comme vous le voyez, une ligne indique la quantité de RAM utilisée pour mettre en cache les données du fichier ZFS. Malheureusement, vous exécutez une ancienne version de Solaris 10, donc memstat n'affiche pas cette statistique ZFS séparément. Il est inclus avec la mémoire utilisée par le noyau, ce qui prête à confusion. Un noyau ne devrait pas utiliser 13 Go de RAM dans des circonstances normales.
Quoi qu'il en soit, il existe toujours un moyen d'afficher la taille ARC complète sur votre serveur.
Exécutez simplement cette commande:
Cela montre que sur ma machine, 273 Mo de RAM sont actuellement utilisés pour gérer le cache ZFS ARC. memstat montre que sur ces 273 Mo, 208 Mo sont utilisés comme cache de fichiers. Jusqu'à ces 208 Mo de RAM pourraient être libérés automatiquement à la demande si les applications en avaient besoin.
Voyons maintenant l'utilisation de la mémoire des processus. Si vous utilisez l'option -Z avec prstat, elle affiche un résumé par zone sous les statistiques par processus. Ici, la zone globale (et unique) utilise 185 Mo de RAM. Cela devrait (approximativement) correspondre à la somme de la colonne rss de tous les processus.
Ces 185 Mo correspondent à la somme de deux lignes en sortie memstat: "Anon" qui est la RAM utilisée par les applications pour stocker les données et "Exec and libs" qui est les applications et leur code de bibliothèques.
la source
La mémoire est remplie de pages de données non mappées lues sur le disque. Il est conservé en mémoire car ces fichiers peuvent être relus et la conservation des données en mémoire permet d'économiser une lecture sur le disque. La mémoire libre est à jamais gaspillée, donc l'ordinateur essaie d'en garder le moins possible.
Par exemple, supposons que vous exécutez un programme. Le programme se termine. Le programme est toujours en mémoire, mais ces pages de mémoire ne sont utilisées par aucun processus car le programme n'est pas en cours d'exécution. Si le système n'est pas sous pression mémoire, les pages sont conservées en mémoire. Si le programme s'exécute à nouveau, cela économisera l'effort de le libérer juste pour avoir à allouer plus de mémoire pour le programme, puis le relire. Et si les pages sont nécessaires pour autre chose, c'est toujours une victoire pour le système car il est plus facile de déplacer une page de mémoire directement d'une utilisation à une autre que de la libérer pour la réutiliser.
La mémoire n'est pas une ressource enregistrable. Si vous laissez 1 Go gratuit pendant une heure, tout ce que vous auriez pu faire avec ces données est définitivement perdu.
la source