J'essaie de diagnostiquer des segfaults aléatoires sur un serveur sans tête et une chose qui semble curieuse est qu'elles ne semblent pas se produire sous pression de mémoire et que ma taille d'échange ne deviendra pas supérieure à 0.
Comment puis-je forcer ma machine à échanger pour vous assurer que cela fonctionne correctement?
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
Est-ce Linux? Si oui, vous pouvez essayer ce qui suit:
# sysctl vm.swappiness=100
Puis utilisez un programme qui utilise beaucoup de RAM ou écrivez une petite application qui mange simplement RAM. Ce qui suit le fera (source: expériences et amusantes avec Le cache de disque 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;
}
Codé la ligne MEMSET pour initialiser les blocs avec 1S plutôt que 0s, car le gestionnaire de mémoire virtuel Linux peut être suffisamment intelligent pour ne pas réellement allouer RAM sinon. J'ai ajouté le sommeil (1) afin de vous donner plus de temps pour regarder les processus car il gobbles bélier et échanger. Le tueur OMM devrait tuer cela une fois que vous êtes sorti de RAM et échangeez-vous pour donner au programme. Vous pouvez le compiler avec
gcc filename.c -o memeater
où le nom de fichier.c est le fichier que vous enregistrez le programme ci-dessus. Ensuite, vous pouvez l'exécuter avec ./memeater.
Je ne ferais pas cela sur une machine de production.