Que proporção de memória usa o kernel do Linux da RAM instalada?

1

Estou desenvolvendo um cluster de computação e estou tentando determinar a quantidade máxima de RAM que posso dar a um único processo. Em uma máquina com 16GB de memória RAM, a resposta é que eu posso alocar (e tocar) 15680MB antes do killer de memória ser invocado (overcommit_memory = 2, overcommit_ratio = 0).

Isso pode parecer meio razoável em uma distribuição linux comum, mas eu compilei meu próprio kernel mínimo (v 3.16), e meu aplicativo de teste está rodando como sbin / init - ou seja, não há mais nada na memória.

Se eu simular uma máquina com apenas 512MB de memória RAM para comparação, posso alocar 468MB, uma sobrecarga de apenas 44MB, o que parece muito razoável.

Então, por que há muito mais memória do kernel na máquina de 16GB?

Ao ler os documentos do kernel, parece que alguns por cento da memória estão reservados para o kernel para "segurança", que pode ser ajustado por / proc / sys / vm /. Mas eu descobri que alterar admin_reserve_kbytes e user_reserve_kbytes não faz nenhuma diferença quando o invasor OOM é invocado.

Existe algo mais que cresce proporcionalmente à quantidade de RAM instalada?

    
por Al Ro 28.04.2015 / 06:08

2 respostas

1

Um artigo bastante antigo (2006) discute parte da sobrecarga do kernel que aumenta com o tamanho da memória: link

A partir dele:

page struct (controla a alocação de páginas): 1.37% Tabelas de página: 0,5%

Enquanto isso, minha máquina de teste de 16GB mostra uma sobrecarga total de 4,3%

cerca de 2% ainda não foi contabilizado. Assim, a questão ainda não está completamente respondida e a resposta é baseada em um kernel muito antigo. Mas este é o mais próximo de longe que eu cheguei a responder a pergunta.

    
por 22.05.2015 / 05:46
1

A resposta curta à sua pergunta é o máximo possível , uma vez que fornece aos processos o que eles podem usar. A alternativa é deixar a memória livre, o que é um desperdício. Uma máquina com 16 GB não pode usar hoje 12 GB para poder usar 20 GB amanhã. Qualquer memória que não tenha sido usada neste segundo é um potencial para economizar E / S e outros esforços que estão perdidos para sempre - você não pode economizar memória para mais tarde.

Se você está pensando, "mas eu preciso da minha memória livre agora para que eu possa usá-lo mais tarde", limpe essa bobagem da sua mente. Você pode usá-lo agora e usá-lo mais tarde. Não há compensações para fazer aqui. De fato, se você está usando agora, você pode usá-lo mais tarde apenas por não fazer nada. Se você não está usando agora, você tem que trabalhar para usá-lo mais tarde. Então, usá-lo agora aumenta a probabilidade de você usá-lo mais tarde.

Você parece ter um equívoco de que a memória só pode ser usada por um processo ou pela sobrecarga do kernel. Isso não é verdade. Em um sistema típico, a grande maioria da memória física não é livre, usada por processos nem consumida pela sobrecarga do kernel.

Por exemplo, suponha que seu sistema tenha bastante memória livre e você execute top e, em seguida, saia. Seu sistema tem duas escolhas. Ele pode manter o programa top na RAM ou descartar as páginas que o continham. Vamos ver as duas opções:

Se deixar a RAM livre, isso exige esforço. E pior, é um esforço que precisa ser desfeito para usar a RAM. E se você executar top novamente, o programa terá que ser carregado a partir do disco, o que é muito lento.

Se ele mantém as páginas na RAM e você executa top novamente, não é necessário carregar o problema do disco. Essa é uma grande vitória. E se a memória for necessária para algum outro propósito, ela pode fazer a transição diretamente para esse propósito sem ter que se esforçar para tornar a memória usada e removê-la do pool livre.

Assim, as páginas da RAM permanecerão em uso, mantendo o executável. Esse uso não está associado a nenhum processo, pois top não está em execução. Mas não é livre, pois contém dados que podem ser úteis. E não é uma sobrecarga - se a memória for mais útil fazendo outra coisa, o conteúdo pode ser descartado, pois o executável pode ser paginado a partir do disco, se necessário.

E, de fato, em um sistema típico sob carga típica, a grande maioria da memória contém informações que podem ser úteis no futuro, mas podem ser descartadas se a memória for necessária para outra finalidade.

Se você está olhando para /proc/meminfo , o número para o qual você provavelmente deveria estar olhando é MemAvailable . Isso combina memória livre e memória que contém informações que podem ser descartadas trivialmente se mais memória livre for necessária.

    
por 28.04.2015 / 21:29