Su Mac OS X Yosemite 10.10.5, quando provo ad eseguire un calcolo che deve allocare e usare 128 GB di memoria (è un programma a riga di comando scritto in C), il kernel uccide il mio processo con estremi pregiudizi. Questa voce del registro della console è un esempio di un'istanza:
25/09/15 7: 08: 40.000 PM kernel [0]: low swap: killing pid 6202 (huffgrp)
Il calcolo funziona bene e in un ragionevole lasso di tempo quando alloca e utilizza 64 GB di memoria. Il mio Mac ha 32 GB di RAM e spazio beaucoup sul disco rigido. Ho anche provato questo su un altro Mac con 8 GB di RAM, su cui funziona anche il calcolo da 64 GB, impiegando ovviamente più tempo, ma il calcolo da 128 GB viene ucciso dal kernel nello stesso modo.
A proposito, malloc()
non restituisce mai un errore, non importa quanto spazio chiedo. Il kernel ucciderà il processo solo una volta che una quantità eccessiva di quella memoria viene effettivamente utilizzata dal processo, causando un sacco di scambio sul disco rigido.
Quindi sembra esserci un limite di spazio di scambio segreto tra 64 GB e 128 GB.
La mia domanda è: come posso riconfigurare il kernel per consentire più spazio di swap? Ho trovato un file dall'aspetto promettente /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
, ma non vedo il numero segreto lì dentro. La pagina man per dynamic_pager
dice che tutto ciò che fa è impostare il nome e la posizione dei file di scambio. Esiste una versione precedente della stessa pagina man che documenta -S
un'opzione per impostare la dimensione dei file di swap creati. Ci ho provato, richiedendo swapfile da 160 GB, ma non ha avuto alcun effetto. I file di scambio erano ancora 1 GB ciascuno e il processo era ancora interrotto dal kernel.
malloc
più di quello che hai è perché commit_limit è molto alto (probabilmente infinito). Pertanto il sistema operativo allocherà la memoria che non ha (questo è scommettere che il processo non lo utilizzerà, il sistema operativo di solito vince questa scommessa). È possibile che si desideri regolare il limite di commit come limite di memoria, in questo modo il processo fallirà presto.
malloc()
. Stavo deviando eventuali commenti su qualcuno pensando che non stia verificando il valore di ritorno di malloc()
. A proposito, il mio obiettivo non è fallire prima. Il mio obiettivo è riuscire.