Por que malloc () pode retornar NULL se o Linux possui 20G de memória 'cache' como mostrado em 'top'? [fechadas]

1

Meu aplicativo retornou aleatoriamente erros OOM tentando alocar pedaços de 16M, enquanto o Linux tinha bastante memória usada pelo cache de disco (20G).

Troca desativada. Todos os limites do SO parecem bons.

Depois de limpar o cache do Linux, o erro drop_caches desapareceu.

Alguma ideia do que verificar ou se é algum comportamento esperado?

    
por nonobe 14.09.2012 / 11:45

2 respostas

2

Havia muita memória, mas provavelmente fragmentada para que você não conseguisse um pedaço contínuo de 16mb. Drop_caches terá acionado uma desfragmentação de memória para que depois haja memória contínua suficiente disponível para honrar sua requisição malloc.

(Esta questão é provavelmente mais adequada para um dos fóruns de programação.)

    
por 14.09.2012 / 12:41
2

Malloc () não aloca memória física, aloca memória virtual. Malloc () pode falhar devido à falta de memória virtual contínua ou limite de confirmação excedido.

  1. Verifique o uso de memória virtual do processo usando os comandos ps , top ou pmamp . Arquiteturas de 64 bits (amd64) têm memória virtual extremamente grande e é basicamente impossível esgotar isso, mas o processo de 32 bits seria limitado a no máximo 4 GB de memória virtual.
  2. Verifique as linhas /proc/sys/vm/overcommit_memory e Committed_AS e CommitLimit em /proc/meminfo . Se overcommit_memory for 1, exceder CommitLimit fará com que malloc () falhe.
por 14.09.2012 / 14:48

Tags