Eu tenho um problema desconcertante. Eu tenho uma biblioteca que usa sg para executar CDBs personalizados. Existem alguns sistemas que rotineiramente têm problemas com a alocação de memória em sg . Normalmente, o driver sg tem um limite rígido de cerca de 4 MB, mas o vemos nesses poucos sistemas com solicitações de ~ 2,3 MB. Ou seja, os CDBs estão se preparando para alocar uma transferência de 2,3mb. Não deve haver nenhum problema aqui: 2.3 <4.0.
Agora, o perfil da máquina. É uma CPU de 64 bits, mas executa o CentOS 6.0 de 32 bits (não os construí, nem tenho nada a ver com essa decisão). A versão do kernel para esta distribuição do CentOS é 2.6.32. Eles têm 16GB de RAM.
Aqui está a aparência do uso de memória no sistema (no entanto, como esse erro ocorre durante o teste automatizado, ainda não verifiquei se isso reflete o estado em que esse erro é retornado pelo SG ).
top - 00:54:46 up 5 days, 22:05, 1 user, load average: 0.00, 0.01, 0.21
Tasks: 297 total, 1 running, 296 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 15888480k total, 9460408k used, 6428072k free, 258280k buffers
Swap: 4194296k total, 0k used, 4194296k free, 8497424k cached
Encontrei este artigo do Linux Journal, que trata da alocação de memória no kernel. O artigo é datado, mas parece pertencer a 2,6 (alguns comentários sobre o autor na cabeça). O artigo menciona que o kernel é limitado a cerca de 1 GB de memória (embora não esteja totalmente claro no texto se esses 1 GB são físicos e virtuais ou totais). Gostaria de saber se esta é uma declaração precisa para 2.6.32. Por fim, estou me perguntando se esses sistemas estão atingindo esse limite.
Embora isso não seja realmente uma resposta para o meu problema, estou me perguntando sobre a veracidade da reivindicação da 2.6.32. Então, qual é o limite real de memória para o kernel? Pode ser necessário considerar a solução de problemas. Quaisquer outras sugestões são bem-vindas. O que torna isso tão desconcertante é que esses sistemas são idênticos a muitos outros que não mostram o mesmo problema.
fonte
Quero acrescentar um pouco à excelente resposta de Warren Young , porque as coisas são realmente piores do que ele escreve.
O espaço de endereço do kernel de 1 GB é dividido em duas partes. 128 MB são para
vmalloc
e 896 MB paralowmem
. Não importa o que realmente significa. Ao alocar memória, o código do kernel deve escolher qual deles deseja. Você não pode simplesmente obter memória de qualquer piscina que tenha espaço livre.Se você escolher
vmalloc
, você está limitado a 128 MB. Agora 1 GB não parece tão ruim ...Se você escolher
lowmem
, você está limitado a 896 MB. Não tão longe de 1 GB, mas neste caso, todas as alocações são arredondadas para a próxima potência de 2. Portanto, uma alocação de 2,3 MB consome realmente 4 MB. Além disso, você não pode alocar mais de 4 MB em uma chamada ao usarlowmem
.64 bits é realmente a resposta certa.
fonte