É 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.
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?
É 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.
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.