Não é possível alocar memória disponível (nem metade!) na instância do AWS EC2

4

Eu tenho duas instâncias do AWS EC2 um pouco diferentes do mesmo tipo com uma enorme quantidade de memória ( c4.8xlarge com 60 GB de RAM). Uma dessas instâncias é apenas uma cópia que foi iniciada a partir de uma imagem de backup (AMI) e o problema não pode ser reproduzido nela.

Parei todos os serviços, exceto os do sistema, então a maior parte da memória é gratuita:

> free -m
              total        used        free      shared  buff/cache   available
Mem:          60382         201       59545           9         635       59695
Swap:             0           0           0

Não é possível alocar até metade da memória disponível usando o utilitário stress :

> sudo stress --vm 1 --vm-keep --vm-bytes 30G
stress: info: [40005] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [40006] (494) hogvm malloc failed: Cannot allocate memory
...

E aqui está uma saída de memtester :

> sudo memtester 60000
memtester version 4.3.0 (64-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 60000MB (62914560000 bytes)
got  29811MB (31259688960 bytes), trying mlock ...locked.
Loop 1:
  Stuck Address       : ok
  ...

Não há restrições de memória de ulimit ativadas. Eu tenho o mesmo problema nas cópias desse servidor. Mas está tudo bem no servidor restaurado da imagem antiga:

> stress --vm 1 --vm-keep --vm-bytes 58G
stress: info: [14516] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd


> sudo memtester 59000
memtester version 4.3.0 (64-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 59000MB (61865984000 bytes)
got  59000MB (61865984000 bytes), trying mlock ...locked.
...

O que posso fazer para descobrir o problema?

    
por Leonid Shvechikov 18.04.2018 / 01:54

1 resposta

4

Parece que alguém definiu o valor vm.overcommit_memory para 2 na nova imagem.

link :

2   -   Don't overcommit. The total address space commit
        for the system is not permitted to exceed swap + a
        configurable amount (default is 50%) of physical RAM.
        Depending on the amount you use, in most situations
        this means a process will not be killed while accessing
        pages but will receive errors on memory allocation as
        appropriate.

Para corrigir o problema - ative vm.overcommit_memory (configurando-o como 0) ou ajuste vm.overcommit_ratio ou faça uma troca de 30Gb.

Não sei realmente como resolver esses problemas estranhos, mas provavelmente faria o seguinte:

  • Leia todos os documentos do kernel relacionados ao gerenciamento de memória.
  • Compare os parâmetros vm.* sysctl nos dois servidores.
  • Inspecione as mensagens do dmesg em busca de erros de hardware / sistema.
  • Construa o kernel com uma informação de depuração, conecte um depurador, configure um ponto de interrupção em algum lugar perto do myscall mmap e veja o que está acontecendo.
por 18.04.2018 / 11:10