Memoria usada en Solaris 10

10

Una pregunta más sobre la memoria en Solaris 10.

Una parte superior me muestra que tengo 672 MB de memoria 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 muestra lo mismo:

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

Pero cuando hago un tamaño prstat -a -s me sale esto:

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%

y como puede ver, la suma de los valores RSS no alcanza los 15 GB de memoria, e incluso si le agrego valores SWAP.

Entonces mi pregunta es: ¿qué comando creo?

Si top y vmstat me dan un buen resultado, ¿dónde están mis 15 GB de memoria usada? Si no, ¿por qué me muestran eso?

Editar: el resultado para el 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

Edición 2:

Ok, ahora puedo ver la memoria utilizada por el caché ARC.
Pero con algunas pruebas nuevas, ahora tengo:

2066 MB used( prstat -Z y echo :: memstat | mdb -k result)
1193 MB free( resultado superior )
8859 MB ARC cache( kstat zfs :: arcstats: resultado de tamaño )

Lo que nos da más o menos 12 GBmemoria, mientras que mi sistema tiene 16 GB.
Tal vez me perdí algo más, pero ¿dónde están los otros 4 GB?

Jeremy C.
fuente
Agregue kstat zfs::arcstats:sizeresultados a su pregunta.
jlliagre

Respuestas:

12

Es probable que ZFS esté utilizando la mayor parte de su memoria como caché ARC. Si desea saber cómo se usa su RAM, ejecute este comando como root:

# echo ::memstat | mdb -k

En Solaris 10 10/09 y versiones posteriores, esto muestra algo como esto:

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

Como puede ver, hay una línea que indica la cantidad de RAM que se usa para almacenar en caché los datos del archivo ZFS. Desafortunadamente, está ejecutando una versión anterior de Solaris 10, por lo que memstat no muestra esta estadística ZFS por separado. Se incluye con la memoria utilizada del Kernel, lo cual es confuso. Un núcleo no debe usar 13 GB de RAM en circunstancias normales.

De todos modos, todavía hay una manera de mostrar el tamaño completo de ARC en su servidor.

Solo ejecuta este comando:

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

Muestra que en mi máquina, 273 MB de RAM se utilizan actualmente para manejar el caché ZFS ARC. memstat muestra que de estos 273 MB, se utilizan 208 MB como caché de archivos. Hasta estos 208 MB de RAM podrían liberarse automáticamente bajo demanda si las aplicaciones lo necesitan.

Ahora veamos el uso de memoria de procesos. Si usa la opción -Z con prstat, muestra un resumen por zona bajo las estadísticas por proceso. Aquí la zona global (y única) está utilizando 185 MB de RAM. Esto debería (aproximadamente) coincidir con la suma de todos los procesos de la columna 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

Estos 185 MB corresponden a la suma de dos líneas en la salida de memstat: "Anon", que es la RAM utilizada por las aplicaciones para almacenar datos y "Exec y libs", que son las aplicaciones y el código de sus bibliotecas.

jlliagre
fuente
Gracias por su respuesta también, el resultado del comando no es realmente detallado, pero es necesario ver qué está usando RAM.
Jeremy C.
¿Puedes agregar su salida actualizando tu pregunta? Por cierto, la respuesta que aceptó es en realidad un poco incorrecta, ya que Solaris informa que las páginas no asignadas son RAM libre, no como se usa, que es el problema del que se queja.
jlliagre
Pregunta editada con el resultado del comando. Tienes razón, mis preguntas no están totalmente respondidas. Al menos podemos ver que la memoria libre es la misma con top y vmstat que con :: memstat . Pero, ¿hay un significado para detallar lo que se usa en cada proceso?
Jeremy C.
¿Qué actualización de Solaris 10 está utilizando (cat / etc / release) y está utilizando ZFS?
jlliagre
es Solaris 10 5/09, y sí, uso ZFS
Jeremy C.
4

La memoria está llena de páginas sin asignar de datos leídos del disco. Se guarda en la memoria porque esos archivos pueden leerse nuevamente y mantener los datos en la memoria guarda una lectura de disco. La memoria libre se desperdicia para siempre, por lo que la computadora intenta conservar la menor cantidad posible.

Por ejemplo, supongamos que ejecuta un programa. El programa termina. El programa todavía está en la memoria, pero esas páginas de memoria no son utilizadas por ningún proceso ya que el programa no se está ejecutando. Si el sistema no está bajo presión de memoria, las páginas se mantienen en la memoria. Si el programa se ejecuta nuevamente, esto ahorrará el esfuerzo de liberarlo solo para tener que asignar más memoria para el programa y luego volver a leerlo. Y si las páginas son necesarias para otra cosa, sigue siendo una victoria para el sistema porque es más fácil mover una página de memoria directamente de uso a otra que liberarla solo para que se vuelva a usar.

La memoria no es un recurso ahorrable. Si deja 1GB gratis durante una hora, todo lo que podría haber hecho con esos datos se perderá para siempre.

David Schwartz
fuente
Gracias por esta respuesta bien explicada. Ahora entiendo por qué todos mis servidores Solaris tienen más o menos 90% de RAM utilizada.
Jeremy C.