linux não está usando swap, mas o killer da OOM é acionado

1

Eu tenho tido esse problema por um longo tempo agora, e eu não consigo entender, basicamente, meu sistema linux (32bit 3.2.6-3.fc16.i686.PAE) está se recusando a usar a troca. Quando eu corro

$ tail /dev/zero
tail: memory exhausted

ele não recorre ao uso do swap. ele simplesmente morre depois de usar a RAM física. Aqui estão os detalhes relevantes.

$ free -m
             total       used       free     shared    buffers     cached
Mem:          8076       4652       3423          0        123        543
-/+ buffers/cache:       3985       4090
Swap:         8192        116       8076


$ cat /proc/sys/vm/swappiness 
60

$ ulimit -m
unlimited

$ cat /proc/sys/vm/overcommit_ratio
50

$ cat /proc/sys/vm/overcommit_memory 
0

Eu tentei defini-lo como 1:

# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1


$ cat /proc/sys/vm/overcommit_memory 
1

e tentei novamente, o mesmo resultado. Alguma idéia?

    
por insaner 19.03.2015 / 03:15

2 respostas

0

É o Linux de 32 bits, portanto, não há como alocar mais de 4GiB de memória para um aplicativo, porque ele esgotará seu espaço de endereço. Você tem 8GiB de RAM, e é principalmente livre, então 4096 MiB podem ser alocados sem o uso de swap.

    
por 19.03.2015 / 08:33
0

Essa pergunta é meio antiga, mas há uma resposta bem simples:

tail ing de /dev/zero não faz nenhum bem. Se você quiser apenas um fluxo de bytes nulos, use cat .

tail (com parâmetros padrão) retornará as últimas 10 linhas do argumento. Como /dev/zero é um dispositivo de caractere, ele começará a ler pedaços de dados a partir dele, até o final (os arquivos regulares são lidos de trás para frente). Os dados lidos são mantidos até que 10 linhas tenham sido encontradas, então as primeiras linhas são despejadas do buffer.

As linhas serão separadas por caracteres de nova linha - \n . Como /dev/zero não retorna nenhuma nova linha, todos os dados (todos os bytes nulos lidos até agora) ainda são considerados como a primeira linha e, portanto, mantidos no buffer. E tail continuará até encontrar o final do arquivo, o que nunca acontecerá para /dev/zero . Então, você nunca obterá resultados úteis de tail /dev/zero .

Felizmente, você está em um sistema de 32 bits e tem muita memória livre, então a memória disponível para um único processo (normalmente 2 GiB, mas pode ser diferente dependendo da configuração do kernel) é esgotada rapidamente e sem troca e o comando é abortado. Se você tentar o mesmo em um sistema com menos memória livre ou um espaço de endereçamento maior (sistema de 64 bits), a cauda consumirá toda a memória que conseguir, fará com que o kernel troque o máximo possível e, eventualmente, você ainda obter um erro de alocação de memória. Ou acione o OOM-killer. Mas ainda não há bytes nulos no stdout.

    
por 16.01.2018 / 10:07

Tags