Por que o CentOS usa metade da memória para devtmpfs ou tmpfs?

1

Eu atualizei recentemente uma máquina virtual de 12 GB para 64 GB e descobri que sem nenhum aplicativo em execução, metade da memória foi alocada. Desde o upgrade, a carga da VM é caótica e, na maioria das vezes, a VM não responde.

Não consegui encontrar htop , nem ps , processo que alocava essa memória, mas descobri na df -h de saída que algumas partições, como /tmp , /sys/fs/cgroup , /run e /dev/shm estavam usando 32G do sistema de arquivos tmpfs e /dev usando 32 GB de devtmpfs .

Eu entendo que essa memória é compartilhada e que essa é a causa do uso de memória e que novos aplicativos podem usar a memória ocupada por essas partições. Por favor me corrija se eu estiver errado. No entanto, o comando free -mh reporta cerca de 20 GB de memória disponível para novos aplicativos. O mesmo para a coluna "livre".

A df -h de saída.

Filesystem           Size  Used Avail Use% Mounted on
...
devtmpfs              32G     0   32G   0% /dev
tmpfs                 32G     0   32G   0% /dev/shm
tmpfs                 32G   49M   31G   1% /run
tmpfs                 32G     0   32G   0% /sys/fs/cgroup
tmpfs                 10G   17M   10G   1% /tmp
...

A free -mh de saída.

               total        used        free      shared  buff/cache   available
Mem:            62G         41G         21G         24M        106M         21G

A partir do px aux , o programa que usou mais memória foi de 75 MB de /usr/lib/systemd/systemd-journald . Eu não tenho a saída desse momento, nem dos comandos vmstat e top -b 1 .

Em outra máquina Cento com 128GB, notei que tmpfs usa 64GB, mas, ainda assim, a coluna "disponível" da saída free -mh indica que novas aplicações podem alocar até 123GB, mesmo que haja 59GB livre de acordo com a coluna "livre".

Este último exemplo parece correto e compreensível. Mas não consigo entender o primeiro.

Estou tendo problemas para atribuir mais de 12 GB de memória a um aplicativo java ( ES_HEAP_SIZE=12g ) e gostaria de saber se há algo que eu deva considerar para melhorar o comportamento da memória. Além disso, gostaria de entender melhor as razões por trás dessa partição tmpfs e por que ela aloca metade da memória do sistema. Existe alguma maneira de reduzir o tamanho de devtmpfs e tmpfs ? E como isso afeta o sistema?

O sistema é um Centos 7.1.1503 com a versão do kernel 3.10.0-229.el7.x86_64 . Muito obrigado antecipadamente.

Postscript : O aplicativo java trava de uma forma que eu não consigo nem fazer ps ou htop e a única solução é fazer killall -9 java . O sistema também começa a não responder bem.

atualização de 2017/01/11

Agora, mais processos estão em execução, já que mais aplicativos são executados. A saída lsof -n | grep deleted estava vazia. Eu fiz ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n que informa:

  • 143 processos com menos de 1 MB.
  • 55 processos entre 1 e 10MB que somam 221MB.
  • Apenas 5 processos acima de 10 MB, que são:
    • python com 14,89 MB
    • rsyslogd com 26 MB
    • systemd-journald com 47,83 MB
    • kibana com 78,72 MB
    • java com 13456 MB

Ainda assim, o comando free -mh relata o seguinte e não sei onde o restante da memória foi consumido.

              total        used        free      shared  buff/cache   available
Mem:            62G         54G        5.5G        478M        3.2G        7.8G

Atualização de 16/01/2017

O problema já está resolvido. Primeiro, havia questões diferentes nesta questão.

O uso de memória não estava relacionado ao tmpfs ou ao devtmpfs , mas com o aumento de memória do host vmware. Isso, junto com uma cota de 8 GB (que contradiz a atribuição de memória à VM) resultou no comportamento estranho relatado em que a carga da VM era caótica. Houve erros no dmesg mencionando vmballoon_work .

Não encontrei nenhuma informação sobre esse problema que sugerisse que poderia ser um problema do host, por isso acho que essa pergunta / resposta pode ser útil para problemas futuros. O ponto chave são essas mensagens do dmesg:

CPU: 6 PID: 10033 Comm: kworker/6:0 Not tainted 3.10.0-229.el7.x86_64 #1
Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 09/17/2015
Workqueue: events_freezable **vmballoon_work** [vmw_balloon]
task: ffff88001d4ead80 ti: ffff880b9bad8000 task.ti: ffff880b9bad8000
RIP: 0010:[<ffffffff812edd71>]  [<ffffffff812edd71>] __list_del_entry+0x31/0xd0
RSP: 0000:ffff880b9badbd68  EFLAGS: 00010246
RAX: ffffffffa032f3c0 RBX: ffffea0000000003 RCX: dead000000200200
RDX: ffffea001107ffe0 RSI: ffff88103fd969f0 RDI: ffffea0011040020
RBP: ffff880b9badbd68 R08: ffffea0011040020 R09: ffff88103fb94000
R10: 0000000000000020 R11: 0000000000000002 R12: ffff88103ff9d0d0
R13: 0000000000000002 R14: ffffff8000000001 R15: 0000000000000002
FS:  0000000000000000(0000) GS:ffff88103fd80000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 00000000016ba024 CR3: 0000000267e1c000 CR4: 00000000000407e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Stack:
 ffff880b9badbd80 ffffffff812ede1d ffffffffa032f3c0 ffff880b9badbdb0
 ffffffffa032d04e ffffffffa032f4c0 ffff880155bd4180 ffff88103fd92ec0
 ffff88103fd97300 ffff880b9badbe18 ffffffffa032d388 ffffffffa032f4c8
Call Trace:
 [<ffffffff812ede1d>] list_del+0xd/0x30
 [<ffffffffa032d04e>] vmballoon_pop+0x4e/0x90 [vmw_balloon]
 [<ffffffffa032d388>] vmballoon_work+0xe8/0x720 [vmw_balloon]
 [<ffffffff8108f1db>] process_one_work+0x17b/0x470
 [<ffffffff8108ffbb>] worker_thread+0x11b/0x400
 [<ffffffff8108fea0>] ? rescuer_thread+0x400/0x400
 [<ffffffff8109739f>] kthread+0xcf/0xe0
 [<ffffffff810972d0>] ? kthread_create_on_node+0x140/0x140
 [<ffffffff8161497c>] ret_from_fork+0x7c/0xb0
 [<ffffffff810972d0>] ? kthread_create_on_node+0x140/0x140

Eu quero agradecer a Rui F Ribeiro por sua resposta sobre o tmpfs e% código%. Mudei o título de Por que o CentOS usa metade da memória para devtmpfs ou tmpfs? para Onde está meu CentOS Máquina Virtual usando metade da memória? e adicionou algumas tags.

    
por Carlos Vega 10.01.2018 / 17:25

1 resposta

2

Seus sistemas de arquivos devtmpfs e tmpfs não estão usando, na realidade, gigabytes de memória; eles podem potencialmente crescer para 32 GB, no entanto, esse tamanho é apenas o limite superior de seu crescimento. Esse limite superior também é configurável e não é o que eles usam; eles só comem a parte da RAM onde eles têm conteúdo.

Se você olhar para a direita no seu df:% /dev está usando menos de 1M e, portanto, aparece como 0, /dev/shm a mesma coisa, /sys/fs/cgroup da mesma situação,
/tmp está usando 17 MB, /run está usando 49 MB.

Portanto, seus sistemas de arquivos combinados devtmpfs, tmpfs estão usando menos de 70MB de sua RAM. (megabytes, lembre-se)

O que quer que esteja comendo sua memória RAM certamente não são aqueles sistemas de arquivos.

Como eu disse, você pode alterar seus valores limites superiores se isso o incomoda, no entanto, no momento, eu me concentraria em quanto RAM seus parâmetros da JVM estão configurados para usar.

Por fim, conforme o feedback do OP, houve problemas com o ballooning de memória do host do vmware e houve erros no dmesg mencionando o vmballoon_work.

Isso, junto com uma cota de 8 GB no hypervisor da VM, resultou no comportamento estranho relatado no qual a carga da VM era caótica, então, de fato, foi confirmado que não eram esses sistemas de arquivos os culpados.

    
por 10.01.2018 / 18:31