Σίγουρα είναι λάθος επιλογή τα 32b. Δεν υπάρχει περίπτωση να χρησιμοποιεί το σύστημα σου την υπόλοιπη μνήμη. Γύρνα σε 64b αφού θέλεις να κάνεις δουλειές με πολλά data ή να χρησιμοποιήσεις ένα βαρύ πρόγραμμα. 32b για data crunching δεν είναι σωστό, πηγαίνεις γυρεύοντας για προβλήματα.
Βασικά, πιστεύω ότι το πρόβλημα σου είναι τα default memory limits (και η πιθανότητα του να μην έχεις ορίσει swap file, θεωρώντας ότι 8 GB μνήμη δεν γεμίζει - δεν είναι σωστό, να ορίσεις τουλάχιστον 8 και ακόμα καλύτερα 16 GB swap). Ψάξε και διάβασε για το OOM-Killer. Μια συμβουλή για πιθανά γρήγορη λύση είναι να ορίσεις άμεσα ένα μεγάλο χώρο σαν swap. Αν το σύστημα δεν μπορεί να ικανοποιήσει τις απαιτήσεις ενός προγράμματος για virtual μνήμη, δεν θα του επιτρέπει allocations και πιθανά θα γίνει στόχος του OOM-killer όταν θεωρηθεί ότι συμπεριφέρεται μη ικανοποιητικά καταναλώνοντας περισσότερη μνήμη από αυτή που μπορεί να του δώσει.
@edit
Μετά από το τεστ που έκανα για allocation μνήμης με τα προγράμματα από το
http://linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html, διαπίστωσα ότι άλλαξε η συμπεριφορά στο μηχάνημα μου σε σχέση με παλαιότερα. Πιο πριν, περίπου στο 1 GB allocated memory, έμπαινε ο oom-killer και αντίο πρόγραμμα. Τώρα το πρώτο πρόγραμμα δεσμεύει 500 GB εικονικής μνήμης πριν αρχίσει όλο το μηχάνημα να κολλάει. Δυστυχώς δεν είχα την υπομονή να περιμένω για τον oom-killer αφού πλέον φαίνεται ότι δεν ενεργοποιείται.
@second edit
Τελικά μετά από ακόμα λίγο πειραματισμό διαπίστωσα ότι ο oom-killer ενεργοποιείται. Με swap κλειστό ο oom-killer ξυπνάει και σκοτώνει το πρόγραμμα στα 4G που έχω ram. Για όποιον ενδιαφέρεται τα δύο προγράμματα είναι τα παρακάτω:
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#define MEGABYTE 1024*1024
int main(int argc, char *argv[])
{
void *myblock = NULL;
int count = 0;
while (1)
{
myblock = (void *) malloc(MEGABYTE);
if (!myblock) break;
printf("Currently allocating %d MB\n", ++count);
}
exit(0);
}
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#define MEGABYTE 1024*1024
int main(int argc, char *argv[])
{
void *myblock = NULL;
int count = 0;
while(1)
{
myblock = (void *) malloc(MEGABYTE);
if (!myblock) break;
memset(myblock,1, MEGABYTE);
printf("Currently allocating %d MB\n",++count);
}
exit(0);
}