Estou respondendo à tag linux . Minha resposta é específica apenas para Linux .
Sim, páginas grandes são mais propensas a fragmentação. Existem duas visões de memória, a que seu processo obtém (virtual) e a que o kernel gerencia (real). Quanto maior a página, mais difícil será agrupar (e mantê-la) seus vizinhos, especialmente quando o serviço estiver sendo executado em um sistema que também precisa oferecer suporte a outros que, por padrão, alocam e gravam em muito mais memória do que eles. na verdade, acabam usando.
O mapeamento do kernel de endereços concedidos (reais) é privado. Há uma boa razão pela qual o espaço do usuário os vê como o kernel os apresenta, porque o kernel precisa ser capaz de se comprometer demais sem confundir o espaço do usuário. Seu processo obtém um espaço de endereço "Disneyfied" agradável e contíguo no qual trabalhar, alheio ao que o kernel está realmente fazendo com essa memória nos bastidores.
A razão pela qual você vê desempenho degradado em servidores de longa execução é mais provável porque os blocos alocados que não foram explicitamente bloqueados (por exemplo, mlock()
/ mlockall()
ou posix_madvise()
) e que não foram modificados por um tempo foram paginados , o que significa que seu serviço desliza para o disco quando é necessário ler eles. A modificação desse comportamento torna seu processo um vizinho ruim , e é por isso que muitas pessoas colocam seus RDBMS em um servidor completamente diferente de web / php / python / ruby / qualquer que seja. A única maneira de corrigir isso, de maneira sutil, é reduzir a competição por blocos contíguos.
A fragmentação só é realmente perceptível (na maioria dos casos) quando a página A está na memória e a página B mudou para troca. Naturalmente, reiniciar seu serviço parece 'curar' isso, mas apenas porque o kernel ainda não teve a oportunidade de paginar o processo '(agora) os blocos recém-alocados dentro dos limites de sua taxa de supercomprometimento.
De fato, reiniciar (digamos) 'apache' sob uma carga alta provavelmente enviará blocos pertencentes a outros serviços diretamente ao disco. Então sim, o 'apache' melhoraria por um curto período de tempo, mas o 'mysql' poderá sofrer .. pelo menos até que o kernel os faça sofrer da mesma forma quando houver simplesmente uma falta de memória física suficiente.
Adicione mais memória ou divida os malloc()
consumidores exigentes :) Não é apenas uma fragmentação que você precisa observar.
Tente vmstat
obter uma visão geral do que realmente está sendo armazenado.