Mémoire utilisée sur Solaris 10

10

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 GBde 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?

Jeremy C.
la source
Veuillez ajouter une kstat zfs::arcstats:sizesortie à votre question.
jlliagre

Réponses:

12

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:

# echo ::memstat | mdb -k

Sur Solaris 10 10/09 et plus récent, cela affiche quelque chose comme ceci:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                      60569               236   16%
ZFS File Data               53270               208   14%
Anon                        41305               161   11%
Exec and libs                5891                23    2%
Page cache                   1190                 4    0%
Free (cachelist)             7006                27    2%
Free (freelist)            212607               830   56%

Total                      381838              1491

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:

# kstat zfs::arcstats:size
module: zfs                             instance: 0
name:   arcstats                        class:    misc
        size                            273469024

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.

# prstat -Z
PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
   741 noaccess  129M  113M sleep   59    0   0:00:35 1,4% java/18
   973 root     5148K  832K run     29    0   0:00:00 0,4% script/1
   972 root     5072K  900K sleep   59    0   0:00:00 0,2% script/1
   998 root     7148K 2812K cpu0    49    0   0:00:00 0,1% prstat/1
   974 root     3456K  968K sleep   49    0   0:00:00 0,1% ksh/1
     5 root        0K    0K sleep   99  -20   0:00:01 0,1% zpool-rpool/37
   241 root     5400K 1608K sleep   59    0   0:00:00 0,0% VBoxService/5
    77 root     7620K 2356K sleep   59    0   0:00:00 0,0% devfsadm/7
   969 root     3372K  936K sleep   59    0   0:00:00 0,0% script/1
   126 root     9664K 2844K sleep   59    0   0:00:00 0,0% nscd/31
   480 root     9420K 2036K sleep   59    0   0:00:00 0,0% sendmail/1
    11 root     9164K 7860K sleep   59    0   0:00:29 0,0% svc.configd/17
     1 root     2504K 1432K sleep   59    0   0:00:00 0,0% init/1
   413 root       15M 9644K sleep   59    0   0:00:00 0,0% fmd/19
   377 root     6536K 2848K sleep   59    0   0:00:02 0,0% inetd/4
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
     0       48  177M  185M    12%   0:01:24 2,5% global

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.

jlliagre
la source
Merci aussi pour votre réponse, le résultat de la commande n'est pas vraiment détaillé, mais il faut voir ce qui utilise la RAM.
Jeremy C.
Pouvez-vous ajouter sa sortie en mettant à jour votre question? Soit dit en passant, la réponse que vous avez acceptée est en fait légèrement incorrecte car les pages non mappées sont signalées comme RAM libre par Solaris, et non comme utilisées, ce qui est le problème dont vous vous plaignez.
jlliagre
Question modifiée avec le résultat de la commande. Vous avez raison, mes questions ne sont pas totalement répondues. Au moins, nous pouvons voir que la mémoire libre est la même avec top et vmstat qu'avec :: memstat . Mais existe-t-il un sens pour détailler ce qui est utilisé par chaque processus?
Jeremy C.
Quelle mise à jour Solaris 10 utilisez-vous (cat / etc / release) et utilisez-vous ZFS?
jlliagre
c'est Solaris 10 5/09, et oui j'utilise ZFS
Jeremy C.
4

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.

David Schwartz
la source
Merci pour cette réponse bien expliquée. Je comprends maintenant pourquoi tous mes serveurs Solaris ont plus ou moins 90% de RAM utilisée.
Jeremy C.