Memória usada no Solaris 10

10

Mais uma pergunta sobre memória no Solaris 10.

Um topo mostra-me que tenho 672 MB de memória livre:

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

Um vmstat mostra-me o mesmo:

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

Mas quando eu faço um prstat -a -s size eu vejo isso:

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, como você pode ver, a soma dos valores de RSS não chega a 15 GB de memória, e mesmo se eu adicionar valores de SWAP a ele.

Então, minha pergunta é: em qual comando eu acredito?

Se top e vmstat me derem o bom resultado, onde estão meus 15 GB de memória usada? Se não, por que eles me mostram isso?

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

Editar 2:

Ok, agora eu posso ver a memória usada pelo cache do ARC.
Mas com alguns novos testes, agora eu tenho:

2066 MB used ( prstat -Z e echo :: memstat | mdb -k resultado) 1193 MB free ( topo resultado) 8859 MB ARC cache ( kstat zfs :: arcstats: tamanho resultado)

Que nos dão mais ou menos 12 GB de memória, enquanto meu sistema tem 16 GB .
Talvez eu tenha perdido alguma outra coisa, mas onde estão os outros 4 GB ?

    
por Jeremy C. 15.03.2012 / 15:40

2 respostas

12

O ZFS provavelmente está usando a maior parte da sua memória como cache do ARC. Se você quiser saber como sua RAM é usada, execute este comando como root:

# echo ::memstat | mdb -k

No Solaris 10 10/09 e mais recente, isso exibe algo assim:

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 você pode ver, há uma linha informando quanto da RAM é usada para armazenar em cache os dados do arquivo ZFS. Infelizmente, você está executando uma versão anterior do Solaris 10, então o memstat não mostra essa estatística do ZFS separadamente. Está incluído na memória usada do Kernel, que é confusa. Um kernel não deve usar 13 GB de RAM em circunstâncias normais.

De qualquer forma, ainda existe uma maneira de exibir o tamanho total do ARC no seu servidor.

Basta executar este comando:

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

Isso mostra que na minha máquina, 273 MB de RAM são usados atualmente para lidar com o cache do ZFS ARC. O memstat mostra que, desses 273 MB, 208 MB são usados como cache de arquivos. Até esses 208 MB de RAM podem ser liberados automaticamente sob demanda, caso os aplicativos precisem.

Agora vamos ver o uso da memória dos processos. Se você usar a opção -Z com prstat, ele mostrará um resumo por zona sob as estatísticas por processo. Aqui a zona global (e única) está usando 185 MB de RAM. Isso deve (aproximadamente) corresponder à soma de todos os processos da coluna 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

Esses 185 MB correspondem à soma de duas linhas na saída do memstat: "Anon", que é a RAM usada pelos aplicativos para armazenar dados e "Exec and libs", que são os aplicativos e seu código de bibliotecas.

    
por 15.03.2012 / 21:54
4

A memória é preenchida com páginas não mapeadas de dados lidos do disco. É mantido na memória porque esses arquivos podem ser lidos novamente e manter os dados na memória salvam uma leitura de disco. A memória livre é sempre desperdiçada, por isso o computador tenta manter o mínimo possível.

Por exemplo, digamos que você execute um programa. O programa termina. O programa ainda está na memória, mas essas páginas de memória não são usadas por nenhum processo desde que o programa não está em execução. Se o sistema não estiver sob pressão de memória, as páginas são mantidas na memória. Se o programa for executado novamente, isso poupará o esforço de torná-lo livre apenas para ter que alocar mais memória para o programa e, em seguida, lê-lo novamente. E se as páginas são necessárias para outra coisa, ainda é uma vitória para o sistema, porque é mais fácil mover uma página de memória diretamente do uso para outra do que torná-la livre apenas para usá-la novamente.

A memória não é um recurso salvável. Se você deixar 1 GB grátis por uma hora, tudo o que você poderia ter feito com esses dados será perdido para sempre.

    
por 15.03.2012 / 18:46