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 GB
memória, enquanto meu sistema possui 16 GB
.
Talvez eu tenha perdido outra coisa, mas onde estão as outras 4 GB
?
fonte
kstat zfs::arcstats:size
saída à sua pergunta.Respostas:
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:
No Solaris 10 10/09 e mais recente, isso exibe algo como isto:
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:
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.
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.
fonte
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.
fonte