Como descubro o que está consumindo memória?

1

Eu desenvolvo um sistema (baseado em x86_64) que roda o Linux (Ubuntu 14.04.3) e tem várias partes de hardware customizado conectado. Eu escrevi drivers e software de controle para o hardware personalizado.

Depois de executar testes durante um longo período de tempo (vários dias) neste sistema, notei que a quantidade de memória livre (como mostrado por cat /proc/meminfo e o comando free ) estava em constante declínio. A quantidade de memória usada pelos meus processos de espaço do usuário estava bem dentro do razoável. Limpei o cache de páginas, mas teve pouco efeito sobre a quantidade de memória livre.

Eu reiniciei o sistema e, em seguida, escrevi um script para executar um teste simples em um loop 500 vezes, limpar o cache de páginas e, em seguida, gravar a saída de /proc/meminfo em um arquivo. Em seguida, executei esse script durante vários dias para coletar alguns pontos de dados. Depois de analisar os dados resultantes, percebi que a quantidade de memória livre (MemFree, MemAvailable também) diminuía de forma linear, enquanto as outras categorias permaneciam praticamente estáveis. Eu coletei dados demais para postar aqui, mas aqui estão os primeiros e os últimos pontos de dados:

                       _Run 1_     _Run 650_
MemTotal:              65738276    65738276
MemFree:               65182220    30881420
MemAvailable:          65124632    30824008
Buffers:                   2292        2064
Cached:                  101204      100816
SwapCached:                   0           0
Active:                  174772      195008
Inactive:                 82924       82444
Active(anon):            154304      174712
Inactive(anon):           66624       66628
Active(file):             20468       20296
Inactive(file):           16300       15816
Unevictable:                  0           0
Mlocked:                      0           0
SwapTotal:             66978812    66978812
SwapFree:              66978812    66978812
Dirty:                      188         184
Writeback:                    0           0
AnonPages:               154296      180848
Mapped:                   99760       99360
Shmem:                    66672       66676
Slab:                     46836       48352
SReclaimable:             17000       18008
SUnreclaim:               29836       30344
KernelStack:               4176        4128
PageTables:                7244        6680
NFS_Unstable:                 0           0
Bounce:                       0           0
WritebackTmp:                 0           0
CommitLimit:           99847948    99847948
Committed_AS:            433008      417576
VmallocTotal:       34359738367 34359738367
VmallocUsed:            1886988     1886956
VmallocChunk:       34357817344 34357817344
HardwareCorrupted:            0           0
AnonHugePages:           106496      126976
CmaTotal:                     0           0
CmaFree:                      0           0
HugePages_Total:              0           0
HugePages_Free:               0           0
HugePages_Rsvd:               0           0
HugePages_Surp:               0           0
Hugepagesize:              2048        2048
DirectMap4k:              93872       93872
DirectMap2M:            1894400     1894400
DirectMap1G:           67108864    67108864

Observe que um pouco mais da metade dos 64GB de memória do sistema é consumido de alguma forma, embora não pareça haver um aumento significativo em nenhuma outra categoria.

Aqui estão algumas das coisas que fiz para tentar descobrir o problema:

  • Eu imediatamente suspeitei de um vazamento de memória do kernel provavelmente causado por um dos meus drivers, então eu auditei todo o meu código de driver. Não encontrei nenhum problema óbvio.
  • Eu também habilitei o verificador de kmemleak do kernel e reran o script de teste mencionado anteriormente. Não encontrou nenhum vazamento.
  • Mais recentemente, ativei o recurso de depuração page_owner do kernel e reran meu script durante a coleta saída periódica. Depois de classificar e depois de analisar as saídas, vejo alguns deltas (pelo meu cálculo, o delta total é de 10.872 páginas ou ~ 42MB), mas nada perto dos ~ 30 GB consumidos.

Estou completamente perplexo e rapidamente sem ideias.

Alguém tem alguma idéia sobre o que está acontecendo e / ou sugestões de como descobrir isso?

    
por Dave 25.01.2017 / 19:29

0 respostas