Quanta RAM o kernel usa?

43

Esta questão é motivada por meu choque quando descobri que o kernel do Mac OS X usa 750MB de RAM .

Eu uso o Linux há 20 anos e sempre "soube" que o uso da RAM do kernel é diminuído pelo X (é verdade? isso já foi verdade?).

Então, depois de algum googling, eu tentei slabtop , o que me disse:

Active / Total Size (% used)       : 68112.73K / 72009.73K (94.6%)

Isso significa que meu kernel está usando ~ 72MB de RAM agora?

(Dado que top reporta o RSS de Xorg como 17M, o kernel agora supera o X, e não o contrário).

Qual é o uso "normal" de RAM do kernel (intervalo) para um laptop?

Por que o MacOS usa uma quantidade de memória maior do que o Linux?

PS. Nenhuma resposta aqui abordou a última pergunta, então, por favor, veja as perguntas relacionadas:

por sds 23.10.2013 / 16:53

3 respostas

35

O kernel é um pouco impróprio. O kernel do Linux é composto de vários processos / threads + os módulos ( lsmod ), então, para obter uma imagem completa, é necessário observar a esfera inteira e não apenas um único componente.

Aliás, o meu mostra slabtop :

 Active / Total Size (% used)       : 173428.30K / 204497.61K (84.8%)

A página man do slabtop também dizia:

The slabtop statistic header is tracking how many bytes of slabs are being used and it not a measure of physical memory. The 'Slab' field in the /proc/meminfo file is tracking information about used slab physical memory.

Eliminar caches

Soltando meus caches como @derobert sugerido nos comentários sob sua pergunta faz o seguinte para mim:

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$

 Active / Total Size (% used)       : 61858.78K / 90524.77K (68.3%)

O envio de um 3 faz o seguinte: pagecache, dentries e inodes gratuitos. Eu discuto isto mais neste U & Q Q & A intitulado: Existem maneiras ou ferramentas para despejar o cache de memória e buffer? ". Então, 110MB do meu espaço estava sendo usado apenas mantendo as informações sobre o pagecache, dentries e inodes.

Informações adicionais

Então, quanto RAM meu kernel está usando?

Esta foto é um pouco mais nebulosa para mim, mas aqui estão as coisas que "eu acho" que conhecemos.

Slab

Podemos obter um instantâneo do uso do Slab usando essa técnica. Essencialmente, podemos extrair essa informação de /proc/meminfo .

$ grep Slab /proc/meminfo
Slab:             100728 kB

Módulos

Além disso, podemos obter um valor de tamanho para os módulos do Kernel (não está claro se o tamanho deles está no disco ou na RAM), puxando esses valores de /proc/modules :

$ awk '{print $1 " " $2 }' /proc/modules | head -5
cpufreq_powersave 1154
tcp_lp 2111
aesni_intel 12131
cryptd 7111
aes_x86_64 7758

Slabinfo

Muitos dos detalhes sobre o SLAB estão acessíveis nesta estrutura proc, /proc/slabinfo :

$ less /proc/slabinfo | head -5
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_ffff8801f2b30000      0      0    320   25    2 : tunables    0    0    0 : slabdata      0      0      0
fuse_request         100    125    632   25    4 : tunables    0    0    0 : slabdata      5      5      0
fuse_inode            21     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0

Dmesg

Quando o seu sistema inicializa, há uma linha que relata o uso da memória do kernel do Linux logo após o carregamento.

$ dmesg |grep Memory:
[    0.000000] Memory: 7970012k/9371648k available (4557k kernel code, 1192276k absent, 209360k reserved, 7251k data, 948k init)

Referências

por 23.10.2013 / 17:03
7

Que tal isso:

Active / Total Size (% used)       : 4709.24K / 5062.03K

Isso é uma máquina recém-inicializada, muito pequena, rodando sem cabeça com um kernel normal. Por isso, não requer muito.

Como derobert sugere, o kernel fará uso da memória disponível para cache e isso é muito do que você vê em slabtop . Além do cache de arquivos, isso tem a ver com a memória compartilhável dos processos do espaço do usuário que não está mais em uso. O kernel deixa lá até que o mesmo material seja requerido novamente, ou então algo ativamente precisa de RAM, caso em que é esquecido. Uma analogia seria tirar um livro de uma prateleira e colocá-lo aberto para ler em uma mesa: quando você terminar de ler, você pode deixar o livro aberto sobre a mesa, caso precise vê-lo novamente.

    
por 23.10.2013 / 17:12
4

Neste servidor de 512 GB de RAM executando o Solaris, o kernel usa 25 GB:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    3210102             25078    5%
Anon                     15266226            119267   23%
Exec and libs               41457               323    0%
Page cache                3539331             27651    5%
Free (cachelist)         13799571            107809   21%
Free (freelist)          30093164            235102   46%

Total                    65949851            515233
Physical                 65927406            515057

Esse menor tem mais da metade de sua RAM usada pelo kernel:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    2149699             16794   52%
Anon                       517016              4039   13%
Exec and libs               15420               120    0%
Page cache                  21840               170    1%
Free (cachelist)             8768                68    0%
Free (freelist)           1404862             10975   34%

Total                     4117605             32168
Physical                  4096002             32000

Nada para se preocupar, RAM não utilizada é desperdício de RAM de qualquer maneira.

    
por 23.10.2013 / 23:10