Memoria utilizzata su Solaris 10


10

Un'altra domanda sulla memoria su Solaris 10.

Un top mi mostra che ho 672 MB di memoria libera:

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 mi mostra lo stesso:

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

Ma quando faccio una dimensione di prstat -a -s ottengo questo:

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%

e come puoi vedere, la somma dei valori RSS non raggiunge i 15 GB di memoria, e anche se aggiungo valori SWAP ad esso.

Quindi la mia domanda è: quale comando credo?

Se top e vmstat mi danno il buon risultato, dove sono i miei 15 GB di memoria utilizzata? In caso contrario, perché me lo mostrano?

Modifica: il risultato per il comando: % 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

Modifica 2:

Ok, ora posso vedere la memoria utilizzata dalla cache ARC.
Ma con alcuni nuovi test, ora ho:

2066 MB used( prstat -Z ed echo :: memstat | risultato mdb -k )
1193 MB free( risultato migliore )
8859 MB ARC cache( kstat zfs :: arcstats: risultato dimensione )

Che ci danno più o meno 12 GBmemoria, mentre il mio sistema ha 16 GB.
Forse ho perso qualcos'altro, ma dove sono gli altri 4 GB?


Aggiungi un kstat zfs::arcstats:sizeoutput alla tua domanda.
jlliagre,

Risposte:


12

ZFS sta probabilmente utilizzando la maggior parte della memoria come cache ARC. Se vuoi sapere come viene utilizzata la tua RAM, esegui questo comando come root:

# echo ::memstat | mdb -k

Su Solaris 10 10/09 e versioni successive, viene visualizzato qualcosa del genere:

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

Come vedi, c'è una riga che indica la quantità di RAM utilizzata per memorizzare nella cache i dati del file ZFS. Sfortunatamente, stai eseguendo una versione precedente di Solaris 10, quindi memstat non mostra questa statistica ZFS separatamente. È incluso con la memoria utilizzata dal kernel che è confusa. Un kernel non dovrebbe usare 13 GB di RAM in circostanze normali.

Ad ogni modo, c'è ancora un modo per visualizzare l'intera dimensione ARC sul tuo server.

Basta eseguire questo comando:

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

Mostra che sulla mia macchina, 273 MB di RAM sono attualmente utilizzati per gestire la cache ARC ZFS. memstat mostra che da questi 273 MB, 208 MB vengono utilizzati come cache dei file. Fino a questi 208 MB di RAM potrebbero essere rilasciati automaticamente su richiesta qualora le applicazioni ne avessero bisogno.

Ora diamo un'occhiata all'utilizzo della memoria dei processi. Se si utilizza l'opzione -Z con prstat, viene visualizzato un riepilogo per zona nelle statistiche per processo. Qui la zona globale (e unica) utilizza 185 MB di RAM. Questo dovrebbe (approssimativamente) corrispondere alla somma di tutti i processi nella colonna rss.

# 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

Questi 185 MB corrispondono alla somma di due righe nell'output memstat: "Anon" che è la RAM utilizzata dalle applicazioni per archiviare i dati e "Exec e libs" che è il codice delle applicazioni e delle loro librerie.


Grazie anche per la tua risposta, il risultato del comando non è molto dettagliato, ma è necessario vedere cosa sta usando la RAM.
Jeremy C.

Puoi aggiungere il suo output aggiornando la tua domanda? A proposito, la risposta che hai accettato è in realtà leggermente errata in quanto le pagine non mappate vengono segnalate come RAM libera da Solaris, non come quella utilizzata, qual è il problema di cui ti stai lamentando.
jlliagre,

Domanda modificata con il risultato del comando. Hai ragione, le mie domande non hanno una risposta completa. Almeno possiamo vedere che la memoria libera è la stessa con top e vmstat che con :: memstat . Ma c'è un significato per dettagliare ciò che viene utilizzato da ciascun processo?
Jeremy C.

Quale aggiornamento di Solaris 10 stai usando (cat / etc / release) e stai usando ZFS?
jlliagre,

è Solaris 10 5/09 e sì uso ZFS
Jeremy C.

4

La memoria è piena di pagine non mappate di dati letti dal disco. È tenuto in memoria perché quei file possono essere letti di nuovo e mantenendo i dati in memoria si salva una lettura del disco. La memoria libera viene sprecata per sempre, quindi il computer cerca di mantenerne il meno possibile.

Ad esempio, supponiamo di eseguire un programma. Il programma termina. Il programma è ancora in memoria, ma quelle pagine di memoria non vengono utilizzate da alcun processo poiché il programma non è in esecuzione. Se il sistema non è sotto pressione della memoria, le pagine vengono mantenute in memoria. Se il programma viene eseguito di nuovo, ciò risparmierà lo sforzo di renderlo gratuito solo per allocare più memoria per il programma e quindi rileggerlo nuovamente. E se le pagine sono necessarie per qualcos'altro, è comunque una vittoria per il sistema perché è più facile spostare una pagina di memoria direttamente dall'uso a un'altra piuttosto che renderla libera solo per riutilizzarla.

La memoria non è una risorsa salvabile. Se lasci 1 GB gratuito per un'ora, tutto ciò che avresti potuto fare con quei dati andrà perso per sempre.


Grazie per questa risposta ben spiegata. Ora capisco perché tutti i miei server Solaris hanno più o meno il 90% di RAM utilizzata.
Jeremy C.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.