Come faccio ad aumentare lo spazio di scambio massimo su Mac OS X?


14

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_pagerdice 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 -Sun'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.


Ho anche pubblicato questa domanda su apple.stackexchange.com, ma non vi è stata alcuna risposta.
Mark Adler,

1
Il motivo per cui puoi mallocpiù 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.
ctrl-alt-delor,

Non riesco a capire perché pensi che il paragrafo 5 sia vero, non segue dal paragrafo 4 (anche se lo inizi con "così"). Hai anche provato ad aggiungere molti swap? (la domanda non è chiara su questo, anche se sospetto che la risposta sia affermativa).
ctrl-alt-delor,

@richard Sì, lo so perché 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.
Mark Adler,

@richard Perché il messaggio del kernel dice "low swap". Per quanto riguarda "l'aggiunta di molti swap", no, non l'ho fatto perché non so come. Questa è esattamente questa domanda. Come faccio ad aggiungere spazio di swap? Naturalmente, il kernel aggiunge automaticamente lo spazio di swap, ma solo fino a un limite. Da qui la radice della domanda: come posso aumentare il limite di spazio di swap del kernel?
Mark Adler,

Risposte:


4

Non la risposta che hai chiesto, ma se crei il tuo file di dimensioni adeguate, inseriscilo nel tuo processo e quindi esegui il calcolo in questo spazio degli indirizzi, dovrebbe avere lo stesso effetto di un file di scambio e sei sicuro di avere lo spazio, invece di competere con altri processi per RAM / swap disponibili.

Potrebbe anche essere più lento, a seconda della frequenza con cui si sovrascrive i dati, ma dovrebbe essere molto più portatile.


2
Grande idea! Avevo grandi speranze. Purtroppo, furono scagliati contro la dura riva della realtà. Il processo è stato comunque interrotto dal kernel per grandi quantità di scambio, proprio come prima (messaggio console "low swap"), anche se utilizzava un file che avevo creato per usarlo come memoria virtuale mmap().
Mark Adler,

Siamo spiacenti, la maggior parte della mia esperienza è con Linux. Ma forse il problema è che il kernel non sta tornando al file e non lo tiene invece nella RAM. Che cosa succede se si chiama periodicamente msync()per costringerlo a farlo?
dataless

0

Le mie informazioni sul Mac sono piuttosto datate e potrebbe non esserci più la magia del kernel per farlo. Pertanto, suggerisco di utilizzare Linux per questo programma, in cui è possibile montare una cartella o una partizione come swap in modo molto semplice.

Elimina le incertezze dell'uso di una cartella di scambio dinamico. Creare una partizione di scambio fisica (solo una partizione vuota non formattata, con codice del tipo di tabella del disco per lo scambio, in Linux è un codice esadecimale 0x82.) Quindi:

  1. Modifica il file / etc / rc trova la sezione di swap commentando tutto. aggiungi la lineamount -vat swap
    • significa montare tutte le partizioni di swap in / etc / fstab
  2. correre pdisk /dev/disk? -dump
    • "?" è il numero del disco del tuo record hd il numero accanto alla partizione di swap
  3. Modifica o crea / etc / fstab (probabilmente non esiste) aggiungi una riga come /dev/disk?s?? none swap sw 0 0
    • ? è il tuo disco.
    • ?? è il numero della partizione di swap.
  4. riavvio.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.