Estou tentando diagnosticar alguns segfaults aleatórios em um servidor sem cabeça e uma coisa que parece curiosa é que eles parecem acontecer apenas sob pressão de memória e meu tamanho de troca não ultrapassa 0.
Como posso forçar minha máquina a trocar para garantir que ela esteja funcionando corretamente?
orca ~ # free
total used free shared buffers cached
Mem: 1551140 1472392 78748 0 333920 1046368
-/+ buffers/cache: 92104 1459036
Swap: 1060280 0 1060280
orca ~ # swapon -s
Filename Type Size Used Priority
/dev/sdb2 partition 1060280 0 -1
Isso é Linux? Nesse caso, você pode tentar o seguinte:
# sysctl vm.swappiness=100
E, em seguida, use um programa que use muito RAM ou escreva um aplicativo pequeno que consome apenas memória RAM. O seguinte será feito (fonte: experimentos e diversão com cache de disco do Linux ):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv) {
int max = -1;
int mb = 0;
char* buffer;
if(argc > 1)
max = atoi(argv[1]);
while((buffer=malloc(1024*1024)) != NULL && mb != max) {
memset(buffer, 1, 1024*1024);
mb++;
printf("Allocated %d MB\n", mb);
sleep(1);
}
return 0;
}
Codifiquei a linha memset para inicializar blocos com 1s em vez de 0s, porque o gerenciador de memória virtual do Linux pode ser inteligente o suficiente para não alocar realmente RAM caso contrário. Adicionei o sleep (1) para você terá mais tempo para assistir aos processos, pois ele devora ram e swap. O assassino do OOM deve matar isso assim que estiver fora de RAM e SWAP para dar ao programa. Você pode compilá-lo com
gcc filename.c -o memeater
onde filename.c é o arquivo em que você salva o programa acima. Em seguida, você pode executá-lo com ./memeater.
Eu não faria isso em uma máquina de produção.