Memória usada no Solaris 10

10

Mais uma pergunta sobre a memória no Solaris 10.

Uma parte superior mostra 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 me mostra 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 tamanho prstat -a -s , recebo o seguinte:

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 atinge 15 GB de memória e mesmo se eu adicionar valores SWAP a ele.

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

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

Edit: 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

Edição 2:

Ok, agora 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 result)
1193 MB free( resultado principal )
8859 MB ARC cache( kstat zfs :: arcstats: size result)

O que nos dá mais ou menos 12 GBmemória, enquanto meu sistema possui 16 GB.
Talvez eu tenha perdido outra coisa, mas onde estão as outras 4 GB?

Jeremy C.
fonte
Por favor, adicione a kstat zfs::arcstats:sizesaída à sua pergunta.
Jlliagre 21/03/12

Respostas:

12

O ZFS provavelmente está usando a maior parte da sua memória como cache 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 como isto:

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

De qualquer forma, ainda há uma maneira de exibir o tamanho completo 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, atualmente, 273 MB de RAM são usados ​​para manipular 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 analisar o uso da memória dos processos. Se você usar a opção -Z com prstat, ela mostrará um resumo por zona nas estatísticas por processo. Aqui, a região 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 é o código dos aplicativos e de suas bibliotecas.

jlliagre
fonte
Obrigado pela sua resposta também, o resultado do comando não é realmente detalhado, mas é necessário ver o que está usando a RAM.
Jeremy C.
Você pode adicionar sua saída atualizando sua pergunta? A propósito, a resposta que você aceitou é realmente um pouco incorreta, pois as páginas não mapeadas são relatadas como RAM livre pelo Solaris, e não como usado, que é o problema do qual você está reclamando.
Jlliagre
Pergunta editada com o resultado do comando. Você está certo, minhas perguntas não são totalmente respondidas. Pelo menos podemos ver que a memória livre é a mesma com top e vmstat do que com :: memstat . Mas existe um significado para detalhar o que é usado por cada processo?
Jeremy C.
Qual atualização do Solaris 10 você está usando (cat / etc / release) e está usando o ZFS?
jlliagre
é Solaris 10 5/09, e sim eu usar ZFS
Jeremy C.
4

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

Por exemplo, digamos que você execute um programa. O programa termina. O programa ainda está na memória, mas essas páginas da memória não são usadas por nenhum processo, pois o programa não está sendo executado. Se o sistema não estiver sob pressão de memória, as páginas serão mantidas na memória. Se o programa for executado novamente, isso poupará o esforço de liberá-lo 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 de uso para outro do que liberá-lo apenas para usá-lo novamente.

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

David Schwartz
fonte
Obrigado por esta resposta bem explicada. Agora entendo por que todos os meus servidores Solaris têm mais ou menos 90% de RAM usada.
Jeremy C.