web-dev-qa-db-fra.com

Mémoire utilisée sur Solaris 10

Une autre question sur la mémoire sur Solaris 10.

A haut 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

A 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 un Prapstat -a -s -s -s -s -s Je reçois 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 constater, la somme des valeurs RSS n'atteint pas 15 Go de mémoire et même si j'ajoute des valeurs d'échange.

Donc, ma question est: quelle commande est-ce que je crois?

Si top et vmstat me donnent le bon résultat, où mes 15 Go ont été utilisés de la mémoire? Sinon, pourquoi me montre-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

Edit 2:

OK, je peux maintenant voir la mémoire utilisée par arc cache.
[.____] mais avec de nouveaux tests, j'ai maintenant:

2066 MB used (PRSTAT -Z et ECHO :: MEMSTAT | MDB -K Résultat)
[.____] 1193 MB free (haut résultat)
[.____] 8859 MB ARC cache (kstat zfs :: arcstats: taille résultat)

Qui nous donnent plus ou moins 12 GB de mémoire, tandis que mon système a 16 GB.
Peut-être que j'ai manqué autre chose, mais où sont l'autre 4 GB?

10
Jeremy C.

ZFS utilise probablement la plupart de votre mémoire cache ARC. Si vous voulez savoir comment votre RAM est utilisé, exécutez cette commande en tant que root:

# echo ::memstat | mdb -k

Cette affiche quelque chose comme sur Solaris 10 10/09 et plus récente, celle-ci:

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, il y a une ligne indiquant la quantité de RAM est utilisé pour les données de fichiers ZFS de cache. Malheureusement, vous exécutez une version de Solaris 10 plus si memstat ne montre pas cette statistique ZFS séparément. Il est inclus dans la mémoire du noyau utilisé qui est source de confusion. noyau A ne doit pas utiliser 13 Go de RAM dans des circonstances normales.

Quoi qu'il en soit, il y a toujours un moyen d'afficher la taille complète ARC sur votre serveur.

Il suffit de lancer cette commande:

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

Elle montre que, sur ma machine, 273 Mo de RAM sont actuellement utilisés pour gérer le cache ARC ZFS. Memstat montre que de ces 273 Mo, 208 Mo sont utilisés comme cache de fichiers. Jusqu'à ces 208 MB de RAM pourrait être libéré automatiquement à la demande devrait avoir besoin d'applications.

Maintenant, regardons les processus de la mémoire. Si vous utilisez l'option -Z avec prstat, il présente un résumé par zone sous statistiques par processus. Ici, la zone globale (et seulement) utilise 185 Mo de RAM. Cela devrait (environ) correspondent à la somme de la colonne 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

Celles-ci correspondent 185 Mo à la somme de deux lignes dans la production memstat: " Anon " qui est RAM utilisés par les applications pour stocker des données et le code " Exec et libs " qui est les applications et leurs bibliothèques.

12
jlliagre

La mémoire est remplie de pages non éteintes de données lues à partir du disque. Il est maintenu en mémoire car ces fichiers peuvent être lus à nouveau et garder les données en mémoire enregistre un disque en lecture. La mémoire libre est perdue pour toujours. L'ordinateur essaie donc de garder aussi peu de choses que possible.

Par exemple, disons 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 ne fonctionne pas. Si le système n'est pas sous pression de mémoire, les pages sont conservées en mémoire. Si le programme s'écoule à nouveau, cela permettra d'économiser les efforts consistant à ne pas être libres d'avoir à allouer plus de mémoire pour le programme, puis à la lire à nouveau. Et si les pages sont nécessaires pour autre chose, il s'agit toujours d'une victoire pour le système car il est plus facile de déplacer une page de mémoire directement à partir de l'utilisation à une autre que de le rendre libre pour le rendre libre.

La mémoire n'est pas une ressource stable. Si vous laissez 1 Go gratuit pendant une heure, tout ce que vous auriez pu faire avec ces données est perdue pour toujours.

4
David Schwartz