Discrepância entre a memória usada relatada e a soma do uso da memória do aplicativo

4

Estou executando um sistema de desktop que sofre bastante de falta de memória, isso me levou a investigar o que causa o problema em primeiro lugar.

O problema é que não há um único processo que consuma a memória, mas o sistema não mostra como disponível. Além do mais, o sistema troca, então parece que a pressão da memória é real. O que é intrigante, é que o uso vai para o normal (~ 1GB usado) depois que eu sair e voltar novamente, então parece uma interação estranha entre o userland e o kernel e não um vazamento de memória.

Resumindo:

  • memória relatada como usada por free , exceto cache / buffers: 3173960 kB
  • soma de USS de todas as aplicações: 2413952 kB
  • Tamanho da PLACA: 158968 kB
  • zram (após a compactação): 75992 kB

Isso dá, 3173960-2413952-158968-75992 = 525048 kB uso de memória não contabilizado.

O que eu estou sentindo falta ou sem contar?

Soma do uso de memória dos aplicativos:

# smem -t | sed -n '1p;$p'
  PID User     Command                         Swap      USS      PSS      RSS 
  108 6                                      244524  2413952  2461340  2648488

Uso de memória conforme relatado por free :

# free -k
             total       used       free     shared    buffers     cached
Mem:       4051956    3449748     602208          0      26548     249240
-/+ buffers/cache:    3173960     877996
Swap:      4051952     242592    3809360

Estatística de memória geral:

# cat /proc/meminfo 
MemTotal:        4051956 kB
MemFree:          612260 kB
Buffers:           26636 kB
Cached:           249304 kB
SwapCached:       107892 kB
Active:          1774004 kB
Inactive:         885268 kB
Active(anon):    1712484 kB
Inactive(anon):   710788 kB
Active(file):      61520 kB
Inactive(file):   174480 kB
Unevictable:        9332 kB
Mlocked:            9332 kB
SwapTotal:       4051952 kB
SwapFree:        3809368 kB
Dirty:                40 kB
Writeback:             0 kB
AnonPages:       2343292 kB
Mapped:            95288 kB
Shmem:             36396 kB
Slab:             158968 kB
SReclaimable:      53900 kB
SUnreclaim:       105068 kB
KernelStack:        3528 kB
PageTables:        43600 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6077928 kB
Committed_AS:    4013288 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      139852 kB
VmallocChunk:   34359570976 kB
HardwareCorrupted:     0 kB
AnonHugePages:    641024 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     2310848 kB
DirectMap2M:     1882112 kB

As trocas estão em zram :

# cat /proc/swaps 
Filename                                Type            Size    Used    Priority
/dev/zram0                              partition       2025976 121252  100
/dev/zram1                              partition       2025976 121324  100

# awk ' { print $0 / 1024; sum+=$0 } END { print "sum:" sum/1024 } ' /sys/block/zram*/compr_data_size
37962.4
38030.1
sum:75992.5
    
por Hubert Kario 19.01.2013 / 20:20

3 respostas

1

O problema

4 GB de RAM (memória física) e que você tenha 2 dispositivos zram de no máximo 2.025.976 kB (aproximadamente 2 GB cada). zram está usando a memória disponível, eu não sei exatamente o interno mas qualquer que seja o mecanismo eu posso imaginar claramente um cenário onde a página do Linux (= colocar alguma memória da RAM para zram) para obter mais espaço livre mas então o uso do zram na memória está crescendo, por isso, sairia mais, o que resultaria em um aumento adicional do uso do zram, e assim por diante, até que o zram esteja consumindo toda a sua memória física.

Eu acho que existe um limite em qualquer sistema sob o qual o paging out não enfatize o kernel ao ponto que eu descrevo acima, para que o zram melhore o desempenho.

Insights

Quando o seu sistema deseja trocar 100 MB, o que acontece é que ele coloca 100 MB no zram. Vamos dizer que é comprimido para 50% menos, então 50 MB. Isso significa que seu sistema queria liberar 100 MB, mas apenas 50 MB foram liberados. Agora o Linux é esperto quando tem paginado um pedaço de memória (então coloque-os na troca) mas precisa deles novamente, ele pode fazer alguma "otimização", ele pode voltar a esta memória, mas também manter na troca. , portanto, se rapidamente depois de precisar excluir essa parte da memória, poderá evitar uma gravação exagerada no arquivo de troca. Portanto, no seu caso, pode ser que o Linux mantenha os 100 MB em zram e os coloque de volta na RAM normal, para que o sistema consuma 150 MB por algum tempo. Se isso for repetido para um programa maior com dados menos compactáveis, isso pode rapidamente se tornar um pesadelo, imagine um pedaço de RAM de 300 MB que seria paginado e use 120 MB em cada zram swap. Significa que o Linux queria liberar 300 MB da RAM para outros propósitos, mas liberou apenas (300-120-120 = 60) 60 MB, então poderia tentar imprimir mais páginas, e assim por diante, com o problema que você tem 2 zram que podem usar até 2 GB de RAM cada, comendo toda a sua memória.

Conclusão e solução

Então a porcaria do zram? Não, de forma alguma, o problema é que você configurou o zram para ter um tamanho total de exatamente sua RAM física e esse é o problema. Você não deve configurar o zram para usar mais de 25% IMHO de sua RAM física, o que significa que você teria que confiar ainda em uma solução de troca de disco rígido quando o zram swap estiver cheio.

Uma solução simples seria reduzir o zram para manipular cada 500 MB no máximo e incluir um arquivo de permuta de aproximadamente 2-3 GB, para permitir que o kernel libere páginas realmente não utilizadas do zram para esse arquivo de troca. O arquivo de swap não usa a RAM e reduz a pressão sobre ela.

Algumas informações sobre como definir o tamanho do seu disco zram .

    
por 01.03.2013 / 23:51
0

Descobri que smem não vê a memória usada, mas apenas no modo "sistema":

# smem -tw
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory       1200240     379444     820796 
userspace memory            2101184     136800    1964384 
free memory                  750532     750532          0 
----------------------------------------------------------
                            4051956    1266776    2785180 
# free -k
             total       used       free     shared    buffers     cached
Mem:       4051956    3298200     753756          0      31664     425552
-/+ buffers/cache:    2840984    1210972
Swap:      4051952     237368    3814584

que fornece uma diferença (quase nenhuma) de cerca de 55MiB entre a memória não utilizada em cache entre free e smem .

    
por 21.01.2013 / 20:43
0

O comando free -tm também mostra o uso da troca por arquivos suportados via tmpfs. Se você puder esvaziar a pasta /tmp , o uso de memória de smem -t -k deverá ser semelhante a free -tm .

    
por 02.02.2016 / 15:30