Come posso aumentare lo spazio di swap massimo consentito?

6

Quando provo a fare un calcolo che deve allocare e utilizzare 128 GB di memoria (è un programma a riga di comando scritto in C), il kernel uccide il mio processo con estremo pregiudizio. Questa voce del registro della console è un esempio di un'istanza:

9/25/15 7:08:40.000 PM kernel[0]: low swap: killing pid 6202 (huffgrp)

Il calcolo funziona correttamente e in un intervallo di tempo ragionevole quando assegna e utilizza 64 GB di memoria. La mia macchina ha 32 GB di RAM e spazio beaucoup sul disco rigido. Ho anche provato questo su un'altra macchina con 8 GB di RAM, su cui il calcolo da 64 GB funziona bene, impiegando più tempo ovviamente, ma il calcolo di 128 GB viene ucciso dal kernel nello stesso modo. Su entrambi eseguo Yosemite 10.10.5.

A proposito, malloc() non restituisce mai un errore, indipendentemente dalla quantità di spazio che chiedo. Il kernel ucciderà il processo solo una volta che troppa memoria sarà effettivamente utilizzata dal processo, con un notevole scambio di dati sul disco rigido.

Quindi sembra esserci un limite di spazio di swap segreto da qualche parte tra 64 GB e 128 GB.

La mia domanda è: come 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 un'opzione -S per impostare la dimensione dei file di swap creati. L'ho provato, richiedendo file di scambio da 160 GB, ma non ha avuto alcun effetto. I file di swap erano ancora 1 GB ciascuno, e il processo era ancora ucciso dal kernel.

    
posta Mark Adler 26.09.2015 - 19:45
fonte

1 risposta

3

Anche se non sono riuscito a trovare alcuna documentazione più recente, "Mac OS X Internals: A Systems Approach" di Singh menziona due limiti oscuri in / sbin / dynamic_pager (pagina 919 f.):

  • The absolute minimum and maximum swap file sizes are 64MB and 1GB, respectively.

  • The maximum swap file size must not be greater than 12.5% of the free space available on the volume that contains the swap file. Moreover, the maximum swap file size must not be greater than the amount of physical memory on the system.

  • At most, eight swap files can be created.

[...]

Mentre il libro è un po 'datato e probabilmente i numeri sono cambiati, la regola del 12,5% mi sembra molto sospetta.

Singh implica che questi sono limiti hard-coded nel file binario e quindi il file delle proprietà che hai trovato probabilmente non sarà utile. Si noti inoltre che il sistema di scambio crea diversi, ma solo fino a otto, file di scambio distinti.

/ sbin / dynamic_pager è documentato, come hai notato, molto pagina man rudimentale , e c'è una dichiarazione contrastante nell'attuale documentazione dello sviluppatore sulla memoria virtuale , affermando che

To give processes access to their entire 4 gigabyte or 18 exabyte address space, OS X uses the hard disk to hold data that is not currently in use. As memory gets full, sections of memory that are not being used are written to disk to make room for data that is needed now. The portion of the disk that stores the unused data is known as the backing store because it provides the backup storage for main memory.

[...]

Note: Unlike most UNIX-based operating systems, OS X does not use a preallocated disk partition for the backing store. Instead, it uses all of the available space on the machine’s boot partition.

(sottolineatura mia)

Quindi, intorno a questo punto, vorrei provare qualche soluzione pragmatica. Forse prova ad aumentare ulteriormente lo spazio su disco per verificare una correlazione nella dimensione di scambio ottenibile, verificando quindi la limitazione del 12,5% di cui sopra.

    
risposta data 23.12.2015 - 12:43
fonte

Leggi altre domande sui tag