O sistema acha que está trocando, mas não está

0

Eu tenho um servidor linux (Ubuntu 10.04) que não tem espaço de troca (swapon -l não informa nada, memória swap de 0kb listada em / proc / meminfo). O início da saída do topo (classificado por% mem) é reproduzido abaixo:

top - 04:18:28 up  7:31,  2 users,  load average: 0.93, 0.76, 0.71
Tasks:  25 total,   2 running,  23 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.0%us,  0.8%sy,  0.0%ni, 84.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4195200k total,  4177028k used,    18172k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
30075 admin     20   0 4026m 1.4g 9648 S   31 35.7 271:03.97 2.5g java
 7700 root      15   0  170m 9152 4360 S    0  0.2   0:00.96 161m apache2
 7730 www-data  15   0  171m 6268 1168 S    0  0.1   0:00.00 165m apache2
 7726 www-data  15   0  171m 6232 1108 S    0  0.1   0:00.01 165m apache2
 9520 www-data  15   0  171m 6228 1100 S    0  0.1   0:00.00 165m apache2

Minha confusão é como 4 GB de memória podem ser usados com apenas 40% do uso relatado (ps concorda com esses números). Além disso, estou confuso quanto mais memória virtual poderia ser alocada do que residente quando não há espaço de troca.

Conforme relatado, não há memória livre, o apt-get falhou devido a uma má alocação. Isso também me confunde, pois achei que o assassino da OOM teria entrado em ação antes que isso acontecesse.

    
por Zack Bloom 08.11.2010 / 10:19

1 resposta

2

O número na coluna VIRT não significa que toda a memória não é realmente usada, é apenas marcada como alocada. Programas Java tendem a alocar muito espaço virtual.

Às vezes isso pode ser um pouco confuso; por padrão, o kernel do Linux permite que os programas comprometam a memória - ou seja, aloquem mais memória do que a disponível no sistema. Isso é o mesmo que provedores de e-mail fornecem gigabytes e gigabytes de espaço de e-mail gratuito, porque eles sabem / esperam que nem todo mundo realmente use tanto espaço, mas apenas uma fração dele.

Quanto excesso de permissão é permitido? Em distribuições típicas, as configurações padrão são usar o modo vm.overcommit_memory=0 , o que significa que o kernel Linux usa algumas heurísticas para determinar essa quantidade. Verifique o valor que você definiu agora com sysctl vm.overcommit_memory

Se for 0 e você quiser alterar o comportamento do kernel para "Não permitir que ocorram over-commiting", adicione essas linhas a /etc/sysctl.conf :

vm.overcommit_memory=2
vm.overcommit_ratio=0

Depois de dar o comando sudo sysctl -p , as novas configurações serão carregadas.

Mas o que essas linhas significam?

vm.overcommit_memory=2 altera o modelo de supercomprometimento de heurística para valor definido pelo usuário.

vm.overcommit_ratio=0 é a porcentagem de memória com permissão para excesso de confirmação. Zero significa que não é permitido o excesso de confirmação.

Mas, se você quiser permitir cerca de 2 gigabytes de over-committing no seu caso, então

vm.overcommit_memory=2
vm.overcommit_ratio=50

faria isso.

    
por 08.11.2010 / 10:38