Spostamento dei file di scambio in una partizione dedicata in Snow Leopard


31

Finora sono stato in grado di spostare i file di scambio di memoria virtuale di Apple in una partizione dedicata sul mio disco rigido. La tecnica che ho usato è descritta in una discussione su forums.macosxhints.com.

Tuttavia, con l'anteprima per sviluppatori di Snow Leopard, questo metodo non funziona più. Qualcuno sa come si potrebbe fare con il nuovo sistema operativo?

Aggiornamento: ho contrassegnato la risposta di dblu come accettata anche se non ha funzionato del tutto perché mi ha dato istruzioni eccellenti e dettagliate e perché il suo suggerimento di usare alla plutilfine mi ha indicato nella giusta direzione. La soluzione completa e funzionante è pubblicata qui nella domanda perché non ho abbastanza reputazione per modificare la risposta accettata.

Aggiornamento n. 2: modificata la procedura per illustrare la tecnica di ekl , che semplifica notevolmente il tutto eliminando la necessità di uno script di shell intermedio:

Soluzione completa:

1. Apri Terminale ed esegui una copia di backup del predefinito dynamic_pager.plist di Apple:

$ cd /System/Library/LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist{,_bak}

2. Converti il ​​plist da binario a semplice XML:

$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist

3. Apri il plist convertito con il tuo editor di testo preferito. (Io uso pico, vedi la risposta di dblu per un esempio usando vim):

$ sudo pico -w com.apple.dynamic_pager.plist

Dovrebbe apparire come segue:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs$
<plist version="1.0">
<dict>
    <key>EnableTransactions</key>
    <true/>
    <key>HopefullyExitsLast</key>
    <true/>
    <key>Label</key>
    <string>com.apple.dynamic_pager</string>
    <key>OnDemand</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/dynamic_pager</string>
        <string>-F</string>
        <string>/private/var/vm/swapfile</string>
    </array>
</dict>
</plist>

4. Modificare l'array ProgramArguments (righe da 13 a 18) per utilizzare il comando shell wait4path (come suggerito da ZILjr ) prima di avviare dynamic_pager. Vedi la nota n. 1 per i dettagli sul perché ciò sia necessario. Nel seguente esempio, la mia partizione si chiama 'Scambia' e ho scelto di mettere i file di scambio in una directory nascosta su quella partizione, chiamata '.vm', assicurandomi che la directory specificata esista effettivamente . L'XML dovrebbe apparire come segue:

<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>/bin/wait4path /Volumes/Swap/ &amp;&amp;
/sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string>
</array>

5. Salvare il plist e tornare al prompt del terminale. Utilizzando pico, i comandi sarebbero:

<ctrl+o> to save the file
<enter>  to accept the same filename (com.apple.dynamic_pager.plist)
<ctrl+x> to exit

6. Converti il ​​plist modificato in binario:

$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist

7.Riavvia il tuo Mac. In caso di problemi, passare alla modalità di avvio dettagliata tenendo premuto Command-v immediatamente dopo l'avvio. Questo ti permetterà di vedere tutti i messaggi di avvio che appaiono durante l'avvio. Se riscontri problemi ancora peggiori (ovvero non vedi mai la schermata di accesso), tieni premuti i Comandi. Ciò avvierà il computer in modalità utente singolo (nessuna interfaccia utente grafica, solo un prompt dei comandi) e ti consentirà di ripristinare la copia di backup di com.apple.dynamic_pager.plist che hai creato nel passaggio 1.

8. Una volta avviato il computer, avvia Terminal e verifica che i file di scambio siano stati effettivamente spostati:

$ cd /Volumes/Swap/.vm
$ ls -l

Dovresti vedere qualcosa del genere:

-rw-------  1 someUser  staff  67108864 18 Sep 12:02 swapfile0

9. Elimina i vecchi file di scambio:

$ cd /private/var/vm
$ sudo rm swapfile*

10. Profitto!

Nota 1

La modifica degli argomenti in dynamic_pager nel plist senza usare wait4pathnon sempre funziona, e quando fallisce, lo fa in un modo straordinariamente silenzioso. Il problema deriva dal fatto che dynamic_pager viene avviato molto presto nel processo di avvio. Se la tua partizione di swap non è stata ancora montata al primo caricamento di dynamic_pager (nella mia esperienza, questo accade il 99% delle volte), il sistema si fingerà. Creerà un collegamento simbolico nella directory / Volumes che ha lo stesso nome della partizione di swap, ma rimanda alla posizione predefinita del file di scambio (/ private / var / vm). Quindi, quando viene montata la partizione di swap effettiva, verrà assegnato il nome Swap 1(o YourDriveName 1). Puoi vedere il problema aprendo Terminal ed elencando i contenuti della tua directory / Volumes:

$ cd /Volumes
$ ls -l

Vedrai qualcosa del genere:

drwxrwxrwx  11 yourUser  staff   442 16 Sep 12:13 Swap -> private/var/vm
drwxrwxrwx  14 yourUser  staff     5 16 Sep 12:13 Swap 1 
lrwxr-xr-x   1 root      admin     1 17 Sep 12:01 System -> /

Si noti che questo errore può essere molto difficile da individuare. Se dovessi controllare i file di scambio come mostrerò nel passaggio 12, li vedresti comunque ! Il collegamento simbolico sembrerebbe che i tuoi swapfile siano stati spostati, anche se in realtà erano memorizzati nella posizione predefinita.

Nota 2

Inizialmente non ero in grado di farlo funzionare in Snow Leopard perché com.apple.dynamic_pager.plist era archiviato in formato binario. Ho fatto una copia del file originale e l'ho aperto con l'Editor elenco proprietà di Apple (disponibile con Xcode) per apportare modifiche, ma questo processo ha aggiunto alcuni attributi estesi al file plist che ha fatto sì che il sistema lo ignorasse e usasse i valori predefiniti . Come ha sottolineato dblu, l'uso plutilper convertire il file in XML semplice funziona come un incantesimo.

Nota 3

Puoi controllare l'applicazione Console per vedere tutti i messaggi che dynamic_pager_init echi sullo schermo. Se vedi le seguenti righe ripetute più volte, c'è un problema con l'installazione. Mi sono imbattuto in questi messaggi perché ho dimenticato di creare la directory '.vm' che ho specificato in dynamic_pager_init.

com.apple.launchd[1]  (com.apple.dynamic_pager[176]) Exited with exit code: 1
com.apple.launchd[1]  (com.apple.dynamic_pager) Throttling respawn: Will start in 10 seconds

Quando tutto funziona correttamente, è possibile che venga visualizzato il messaggio sopra solo un paio di volte, quindi non più i messaggi di "Rialzo di limitazione". Ciò significa che il sistema ha dovuto attendere il caricamento della partizione, ma alla fine ha avuto successo.


Sono davvero curioso di sapere perché vorresti farlo?
BinaryMisfit,

Per i piccoli guadagni di prestazione. Mi piace mantenere i miei dischi rigidi suddivisi in base all'utilizzo. Ho una partizione per il sistema operativo e le applicazioni, una per la cartella degli utenti, una per i documenti, una per i media (musica, film, ecc.) E una per i file di scambio. Nella mia esperienza, mantenere i file di swap separati dal resto del sistema mantiene bassa la frammentazione del disco. La mia preferenza sarebbe quella di avere lo scambio su un'unità dedicata, ma di solito è sufficiente un'altra partizione.
e.James

4
Abbastanza giusto - Tuttavia le partizioni sulla stessa unità in realtà causano più lavoro per l'unità stessa, tuttavia le partizioni su unità diverse forniscono un miglioramento delle prestazioni. Il disco rigido deve fare più lavoro quando si salta attraverso le partizioni su un singolo disco. Lo chiedo solo perché devo ancora avere problemi di frammentazione e prestazioni sul mio Mac dopo quasi 2 anni di utilizzo immediato e quando vedo questi post mi interessano.
BinaryMisfit,

1
Non sono sicuro del motivo per cui non riesco a pubblicare una risposta ( 101 rappresentanti, che - se ricordo i miei calcoli - è superiore ai 10 richiesti dallo stato protetto) , ma ho trovato una wait4pathsoluzione non risolta, grazie a ciò che Applicorn's Xupport modificato per me. Pubblicherò una risposta completa una volta che avrò capito come fare, ma la cosa più breve è cambiare l'ultimo argomento del programma in solo il nuovo percorso (ad es. <string>/Volumes/swap/.vm/swapfile</string>), Cambiare la OnDemandchiave in <true/>e aggiungere una StartOnMountchiave alla fine con un valore di <true/>. PS Questa soluzione funziona bene in Lion (almeno per me).
Slipp D. Thompson,

1
@Slipp Douglas: mi sembra legittimo. La StartOnMountbandiera è stata aggiunta in 10.5 secondo: mactech.com/articles/mactech/Vol.25/25.10/…
e.James

Risposte:


10

NOTA : vedere (anche) una risposta corretta / migliorata nella domanda stessa.


La seguente soluzione ha funzionato per me:

Apri un terminale e fai il backup com.apple.dynamic_pager.plist che cambierai in un secondo:

$ cd / Sistema / Libreria / LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist {, _ bak}

converti plist binario in xml:

$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist

e aprilo con il tuo editor di testo preferito

$ sudo vim com.apple.dynamic_pager.plist

sarà simile a questo:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 <plist version="1.0">
 4 <dict>
 5     <key>EnableTransactions</key>
 6     <true/>
 7     <key>HopefullyExitsLast</key>
 8     <true/>
 9     <key>Label</key>
10     <string>com.apple.dynamic_pager</string>
11     <key>OnDemand</key>
12     <false/>
13     <key>ProgramArguments</key>
14     <array>
15         <string>/sbin/dynamic_pager</string>
16         <string>-F</string>
17         <string>/private/var/vm/swapfile</string>
18     </array>
19 </dict>
20 </plist>

Nella riga 17 modifica / private / var / vm / swapfile (ad es. / Volumes / partition2 / swapfile), salva e chiudi il tuo editor (": x" farà entrambi in vim).

converti il ​​file plist in binario:

$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist

Dopo aver riavviato il Mac dovresti trovare i file di scambio nella directory che hai specificato.

In caso di problemi, è possibile ripristinare il backup creato nel primo passaggio con:

$ cd / Sistema / Libreria / LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist {_bak,}

Sei sicuro che il file di scambio venga effettivamente spostato nella partizione con questa configurazione? Quando ho provato questo approccio originariamente, dynamic_pager veniva caricato prima che le partizioni secondarie fossero state montate. Il sistema si sarebbe fatto strada creando un collegamento simbolico a partition2 nella directory / Volumes che semplicemente puntava a / private / var / vm. È possibile identificare l'errore eseguendo ls -al nella directory / Volumes, dove si vedrebbero sia "partition2" (il collegamento simbolico) che "partition2 1" (la partizione effettiva).
e.James,

Ad ogni modo, +1 per la tecnica per convertire i file plist da e verso il formato binario. com.apple.dynamic_pager.plist era in formato testo normale in 10.5.x, ma in formato binario a partire dal 10.6. Quale è parte del mio problema. Ho modificato i file plist usando l'app Editor elenco proprietà fornito con Xcode, e forse è per questo che le cose non hanno funzionato. Proverò il plutil e vedrò se mi spingerà oltre.
e.James,

Al momento non posso provarlo con un'altra partizione, tuttavia durante i miei test ho creato dynamic_pager creando file di swap su una chiavetta usando la tecnica sopra.
dblu,

Sono stato in grado di far funzionare la tecnica originale, grazie al tuo suggerimento da utilizzare plutilper le conversioni. Ho pubblicato la soluzione completa nella domanda (poiché non ho abbastanza rappresentante per aggiungerla alla tua risposta). Vedi la mia nota n. 1 per una descrizione dettagliata dei problemi che ho riscontrato con la semplice modifica del plist.
e.James,

Comunque, grazie per la risposta. Hai messo insieme un eccellente set di istruzioni e mi hai indicato la giusta direzione, quindi l'ho contrassegnato come accettato. Saluti! :)
e.James,

3

Ho adottato questa idea e l'ho portata un po 'oltre affrontando le strategie di crescita e bonifica.

Dettagli su http://www.crypticide.com/dropsafe/article/3848 ; Pubblicherei un link alla pagina del progetto GoogleCode "dynamicpagerwrapper", ma il blog mi dice che non ho abbastanza punti reputazione ...


1
+1 Roba fantastica! Lo sto provando proprio ora. Ecco il link al progetto GoogleCode: code.google.com/p/dynamicpagerwrapper
e.James

assicurati di utilizzare almeno la revisione 8 dello script: code.google.com/p/dynamicpagerwrapper/source/browse/trunk/…

3

solo una domanda: perché non modificare semplicemente l'aggiunta del file .plist wait4path, invece di usare l'intermedio dynamic_pager_init?

qualcosa come questo:

EDIT: come spiegato nel commento di e.James e nel mio commento seguente, il blocco XML immediatamente successivo non è buono, sia perché c'è un errore (mancante &&) sia perché solo il primo argomento dell'array ProgramArguments viene analizzato come programma da eseguire !

ma .. (scorrere verso il basso)

 ...
13     <key>ProgramArguments</key>
14     <array>
15         <string>/bin/wait4path</string>
16         <string>/Volumes/Swap/</string>
17         <string>/sbin/dynamic_pager</string>
18         <string>-F</string>
19         <string>/Volumes/Swap/.vm/swapfile</string>
20     </array>
 ...

fine del blocco XML errato


questo blocco XML dovrebbe invece funzionare:

   ...
    13     <key>ProgramArguments</key>
    14     <array>
    15         <string>/bin/bash</string>
    16         <string>-c</string>
    17         <string>/bin/wait4path /Volumes/Swap/ &amp;&amp; /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string>
    18     </array>
     ...

tieni presente che non ho ancora avuto abbastanza tempo per provare in sicurezza questa impostazione, ma ho provato a eseguire vari altri comandi shell lanciati allo stesso modo e tutto dovrebbe funzionare come previsto

Come funziona:

base: esecuzione wait4path /path && commandsignifica che commandviene eseguito solo se wait4pathtermina ed esce senza errori, e questo accade solo quando /pathè disponibile un percorso, quindi possiamo tranquillamente dire dynamic_pagerdi usare quel volume per i file di scambio

1) come scritto in launchd.plistmanpage, i tasti Programe ProgramArgumentssono mappati su una execvpchiamata, ciò significa che tutto tranne la prima stringa nell'array viene trattato come argomento per la prima stringa nell'array, il programma da eseguire;

2) come scritto in bashmanpage, c'è bash -c <string>un'opzione per eseguire la stringa passata come comandi

1 + 2 = 3) cosa succede usando questa riga di comando in una piattaforma launchd ??

/bin/bash -c "wait4path /Volumes/Swap/ && /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile"

/bin/bashè il programma da eseguire, -cè il primo argomento e la stringa tra virgolette doppie è il secondo argomento

Immagino che dovrebbe funzionare esattamente come la tua soluzione, senza lo script intermedio: launchdavvierà il servizio, che attenderà il percorso indicato e quindi si avvierà dynamic_pager.

Si prega di notare che:
* la stringa che si vuole eseguire deve essere il doppio citato se si esegue bash -cin terminale, ma è senza doppio citato nel file plist! (suppongo perché è già stato dichiarato come una stringa con il tag appropriato)
* i due &nella stringa devono essere cambiati &amp;nel file plist

PS: come sempre, procedi a tuo rischio, non mi assumo alcuna responsabilità per problemi che potresti avere usando questa impostazione!

grazie per aver condiviso il tuo lavoro con noi


Questa è un'idea interessante. Non sono sicuro che sia "legale" inserire più di un programma ProgramArgumentsnell'array, ma sicuramente vale la pena provare. L'hai provato?
e.James

Spiacente, c'è un errore nel mio post precedente, la mia idea era quella di eseguire la seguente riga di comando (notare i && che mancavano): wait4path / Volumes / Swap / && / sbin / dynamic_pager -F /Volumes/Swap/.vm/swapfile se qualcuno trova un modo per "formattare" quella linea in modo che a launchd piacerà, suppongo che dovrebbe funzionare (ci sto pensando, forse chiamare / bin / bash e passare il resto come argomenti?); ulteriori spiegazioni sui campi Program e ProgramArguments sono disponibili nella manpage launchd.plist e questo porterà alla manpage execvp (3). Sto leggendo e pensando, se qualcuno è più veloce per favore pubblica un post :)
ekl

ho modificato il post precedente con una soluzione che dovrebbe funzionare, per favore commenta se vedi qualche tipo di errore o qualunque cosa potrebbe non funzionare correttamente, grazie!
ekl,

L'ho provato sul mio laptop e sembra funzionare. Lo terrò d'occhio per un paio di giorni per essere sicuro, ma sembra che tu abbia semplificato immensamente l'intero processo! Bel lavoro:)
e.James

Il tuo metodo semplificato funziona come un fascino sul mio laptop. Grazie! Aggiornerò la domanda principale per integrare la tua soluzione.
e.James,

2

So che è passato un po 'di tempo da quando questo articolo è stato scritto, ma ho pensato di aggiungere il mio piccolo oggetto qui per quelli che vogliono fare anche questo ...

Ho usato il trucco sopra per spostare i miei file di swap su un'altra unità interna (il mio disco di avvio è SSD con chip MLC, quindi spostare Vm off può salvare l'aspettativa di vita). Ad ogni modo, dopo aver creato il nuovo volume, avevo un volume Swap in Finder che non avrei mai usato in Finder stesso, quindi ho deciso di rendere il volume invisibile a Finder. È necessario che sia installato il Developer Toolkit di Apple. Quindi digitare:

/Developer/Tools/SetFile -a V /Volumes/Swap/

... e sostituisci / Volumi / Scambia con qualunque cosa tu abbia chiamato il tuo volume. Riavvia Finder e presto, non più Scambia volume in Finder!


1

È possibile utilizzare wait4path per attendere il montaggio del volume; in caso contrario, launchd riavvierà lo script dynamic_pager_init ancora e ancora e ancora finché non lo fa ...


Brillante! Ho usato al wait4pathposto della combinazione if/ grep, e questo pulisce le cose abbastanza bene. Grazie per il suggerimento.
e.James,

1

Forse possiamo usare Xupport per fare quel lavoro sporco per noi :) http://www.applicorn.com/

Ottimizzatore di memoria virtuale:

Modifica la posizione dei file di scambio In Mac OS X le informazioni sulla memoria virtuale sono memorizzate nei cosiddetti "Swapfile". Poiché i file di scambio sono i file di sistema più interattivi, ha senso metterli su una partizione separata. Si consiglia di archiviare i file di scambio sulla prima partizione del disco rigido interno più veloce. Le dimensioni minime consigliate per la partizione dovrebbero essere circa 3 o 4 volte più grandi rispetto alle dimensioni della memoria fisica incorporata (ad es. 1 GB di memoria fisica = 4 GB di partizione di swap). Consigli e istruzioni per prestazioni ottimali del sistema:

1. Ripartizionare il disco rigido con un volume di scambio come PRIMA partizione (utilizzando il DVD di installazione di Mac OS X). ATTENZIONE: RIPartizionare un disco rigido cancellerà tutti i dati esistenti!

2. Ripristinare i dati di sistema o installare un nuovo sistema sulla partizione di sistema.

3. Avvio dalla partizione di sistema.

4. Se vuoi che il tuo volume di swap sia invisibile al Finder: • Avvia Xupport e scegli "Impostazioni" • Abilita "Mostra file e cartelle nascosti" e riavvia il Finder • Rinomina il volume di swap da "swap" a ".swap" (Il punto lo rende invisibile al Finder) • Disabilita "Mostra cartelle e file nascosti" e riavvia nuovamente il Finder

5. Selezionare la nuova partizione di swap in "Scambia volume di archiviazione". Quindi, premere il pulsante "Imposta" per applicare le nuove impostazioni di posizione del file di scambio (riavvio richiesto).

A proposito, funziona per me. Snow Leopard 10.6.2 @ Macbook Pro 2.4GHz, 4GB di RAM, 500GB di HD


Sembra promettente. Grazie per il link e le istruzioni dettagliate!
e.James


1

Questa è probabilmente una risposta indesiderata (dal momento che non posso commentare dopo Diago), ma perché davvero insisti che ciò darà piccoli guadagni in termini di prestazioni? Ho passato una discussione sui forum Apple e la conclusione è stata che questa non è affatto una buona idea. E sono stato molto resistente ad abbandonarlo. Potresti fornire dati che lo dimostrino almeno per te stesso o è solo un "sentimento"?

Da ogni volta che ho usato lo swap anche su Linux, 10 anni fa, e oggi su Ubuntu, non ho mai visto miglioramenti nelle prestazioni. La mia ragione per volerlo era prevenire problemi con spazio libero su OSX e, su Linux, per poter ibernare. Questo è tutto lo scambio è per me.

Ma non ho mai fatto ricerche più approfondite da solo o nelle interwebs.


Questa è una critica valida. Non ho dati a supporto delle mie affermazioni :)
e.James

Freddo. Quindi, alla fine, potresti rinunciare anche a superare tutti questi problemi! : P
cregox,

1

Questa non è una risposta, ma forse un supplemento di follow-up molto utile. Apple fornisce un editor plist gratuito qui PlistEdit Pro . Ti permette di modificare questi file in sicurezza. Sembra che potresti semplicemente cambiare l'argomento con il valore / private / var / vm / swapfile in qualcosa come / Volumes / OtherDrive / vm / myswapfilename per spostare i file di scambio da qualche altra parte ...

Ancora una volta non ho provato questo ...


È una buona idea, e la prima cosa con cui ho iniziato quando ho intrapreso questa strada. Il problema è che la partizione di swap non è sempre montata nel momento in cui si avvia il pager dinamico. Vedi la nota n. 1 nella domanda stessa per dettagli su cosa intendo.
e.James
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.