Movendo os arquivos de troca para uma partição dedicada no Snow Leopard

31

Consegui mover os arquivos de troca de memória virtual da Apple para uma partição dedicada no meu disco rígido até agora. A técnica que estou usando é descrita em um tópico no forums.macosxhints.com.

No entanto, com a visualização do desenvolvedor do Snow Leopard, esse método não funciona mais. Alguém sabe como isso poderia ser feito com o novo sistema operacional?

Update: Eu marquei a resposta de dblu como aceite, mesmo que não muito trabalho, porque ele deu instruções excelentes, detalhado e porque sua sugestão para usar plutilem última análise, apontou-me na direção certa. A solução completa e útil está postada aqui na pergunta porque não tenho reputação suficiente para editar a resposta aceita.

Atualização 2: Foi alterado o procedimento para ilustrar a técnica do ekl , que simplifica bastante a coisa toda, eliminando a necessidade de um script de shell intermediário:

Solução completa:

1. Abra o Terminal e faça uma cópia de backup do dynamic_pager.plist padrão da Apple:

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

2. Converta o plist de binário em XML simples:

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

3. Abra o plist convertido com o seu editor de texto de sua escolha. (Eu uso pico, veja a resposta do dblu para um exemplo usando vim):

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

Deve ter a seguinte aparência:

<?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. Modifique a matriz ProgramArguments (linhas 13 a 18) para usar o comando shell wait4path (conforme sugerido pelo ZILjr ) antes de iniciar o dynamic_pager. Veja a nota 1 para detalhes sobre por que isso é necessário. No exemplo a seguir, minha partição é chamada 'Swap' e escolhi colocar os arquivos de swap em um diretório oculto nessa partição, chamada '.vm', para ter certeza de que o diretório especificado realmente existe . O XML deve ter a seguinte aparência:

<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. Salve o plist e retorne ao prompt do terminal. Usando pico, os comandos seriam:

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

6. Converta o plist modificado novamente em binário:

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

7.Reinicie o seu Mac. Se você tiver problemas, alterne para o modo de inicialização detalhado, mantendo pressionada a tecla Command-v imediatamente após o toque de inicialização. Isso permitirá que você veja todas as mensagens de inicialização que aparecem durante a inicialização. Se você tiver problemas ainda piores (ou seja, nunca verá a tela de login), mantenha pressionada a tecla Command-s. Isso inicializará o computador no modo de usuário único (sem interface gráfica do usuário, apenas um prompt de comando) e permitirá restaurar a cópia de backup de com.apple.dynamic_pager.plist que você fez na etapa 1.

8. Depois que o computador inicializar, inicie o Terminal e verifique se os arquivos de troca foram realmente movidos:

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

Você deve ver algo assim:

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

9. Exclua os arquivos de troca antigos:

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

10. Lucro!

Nota 1

Modificar os argumentos para dynamic_pager no plist sem usar wait4pathnem sempre funciona e, quando falha, ocorre de maneira espetacularmente silenciosa. O problema decorre do fato de o dynamic_pager ser iniciado muito cedo no processo de inicialização. Se sua partição de troca ainda não foi montada quando o dynamic_pager é carregado pela primeira vez (na minha experiência, isso acontece 99% do tempo), o sistema irá falsificar seu caminho. Ele criará um link simbólico no diretório / Volumes que tem o mesmo nome que sua partição de troca, mas aponta para o local padrão do arquivo de troca (/ private / var / vm). Então, quando sua partição de troca real for montada, ele receberá o nome Swap 1(ou YourDriveName 1). Você pode ver o problema abrindo o Terminal e listando o conteúdo do seu diretório / Volumes:

$ cd /Volumes
$ ls -l

Você verá algo assim:

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 -> /

Observe que essa falha pode ser muito difícil de detectar. Se você fosse procurar os arquivos de troca como mostro na etapa 12, ainda os veria ! O link simbólico faria parecer que seus arquivos de troca foram movidos, mesmo que eles estivessem realmente sendo armazenados no local padrão.

Nota 2

Inicialmente, não consegui fazer isso funcionar no Snow Leopard porque o com.apple.dynamic_pager.plist estava armazenado em formato binário. Fiz uma cópia do arquivo original e abri-o com o Editor de lista de propriedades da Apple (disponível com o Xcode) para fazer alterações, mas esse processo adicionou alguns atributos estendidos ao arquivo plist, o que fez com que o sistema o ignorasse e apenas usasse os padrões . Como o dblu apontou, usar plutilpara converter o arquivo em XML simples funciona como um encanto.

Nota 3

Você pode verificar o aplicativo Console para ver as mensagens que dynamic_pager_init ecoam na tela. Se você vir as seguintes linhas repetidas vezes sem conta, há um problema com a instalação. Encontrei essas mensagens porque esqueci de criar o diretório '.vm' especificado em 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 tudo estiver funcionando corretamente, você poderá ver a mensagem acima apenas algumas vezes e, em seguida, não haverá mais as mensagens "Aceleração do reaparecimento". Isso significa que o sistema precisou esperar o carregamento da partição, mas no final foi bem-sucedida.

e.James
fonte
Estou realmente curioso para saber por que você gostaria de fazer isso?
BinaryMisfit 23/08/2009
Para os pequenos ganhos de desempenho. Eu gosto de manter meus discos rígidos particionados de acordo com o uso. Eu tenho uma partição para o sistema operacional e aplicativos, uma para a pasta de usuários, uma para documentos, uma para mídia (música, filmes etc.) e outra para arquivos de troca. Na minha experiência, manter os arquivos de troca separados do resto do sistema mantém a fragmentação do disco baixa. Minha preferência seria trocar em uma unidade dedicada, mas outra partição geralmente é suficiente.
e.James
4
Bastante justo - no entanto, as partições na mesma unidade realmente causam mais trabalho para a própria unidade, mas as partições em unidades diferentes fornecem um ganho de desempenho. O disco rígido precisa fazer mais trabalho ao saltar entre partições em um único disco. Só pergunto porque ainda tenho problemas de fragmentação e desempenho no meu Mac após quase 2 anos de uso fora da caixa e, quando vejo essas postagens, elas me interessam.
BinaryMisfit 23/08/2009
1
Não sei por que não consigo postar uma resposta ( 101 repetições, que - se me lembro da matemática - é mais do que as 10wait4path exigidas pelo estado protegido) , mas encontrei uma não solução, graças ao que o Applicorn's Xupport modificado para mim. Vou postar uma resposta completa assim que descobrir como, mas o mais curto é mudar o último argumento do programa para apenas o novo caminho (por exemplo <string>/Volumes/swap/.vm/swapfile</string>), alterar a OnDemandchave para <true/>e adicionar uma StartOnMountchave ao final com um valor de <true/>. PS Esta solução funciona bem no Lion (pelo menos para mim).
Slipp D. Thompson
1
@ Slipp Douglas: Parece legítimo para mim. A StartOnMountbandeira foi adicionada na versão
e.James

Respostas:

10

NOTA : Veja (também) uma resposta corrigida / aprimorada na própria pergunta.


A seguinte solução funcionou para mim:

Abra um terminal e faça backup de com.apple.dynamic_pager.plist que você mudará em um segundo:

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

converter plist binário em xml:

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

e abra-o com seu editor de texto favorito

$ sudo vim com.apple.dynamic_pager.plist

será algo como isto:

 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>

Na linha 17, modifique / private / var / vm / swapfile (por exemplo, / Volumes / partition2 / swapfile), salve e feche seu editor (": x" fará as duas coisas no vim).

converta o arquivo plist novamente em binário:

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

Depois de reiniciar o seu Mac, você deve encontrar os arquivos de troca no diretório especificado.

Se você tiver algum problema, poderá restaurar o backup criado na primeira etapa com:

$ cd / Sistema / Biblioteca / LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist {_bak,}
dblu
fonte
Você tem certeza de que o swapfile está realmente sendo movido para a partição com esta configuração? Quando tentei essa abordagem originalmente, o dynamic_pager seria carregado antes da montagem das partições secundárias. O sistema tentaria criar um link simbólico para particionar2 no diretório / Volumes, que simplesmente apontava para / private / var / vm. Você pode identificar a falha executando ls -al no diretório / Volumes, onde verá "partition2" (o link simbólico) e "partition2 1" (sua partição real).
e.James
De qualquer forma, +1 para a técnica de converter arquivos plist para e do formato binário. com.apple.dynamic_pager.plist estava no formato de texto sem formatação no 10.5.x, mas no formato binário a partir do 10.6. O que faz parte do meu problema. Estive modificando arquivos plist usando o aplicativo Property List Editor que acompanha o Xcode, e talvez seja por isso que as coisas não funcionaram. Vou tentar o plutil e ver se isso me deixa mais longe.
e.James 18/09/09
Não posso testá-lo com outra partição no momento, no entanto, durante meus testes, fiz o dynamic_pager criando arquivos de troca em um pendrive usando a técnica acima.
dblu 18/09/09
Consegui fazer a técnica original funcionar, graças à sua sugestão de usar plutilnas conversões. Postei a solução completa na pergunta (já que não tenho representante suficiente para adicioná-la à sua resposta). Veja minha nota 1 para obter uma descrição detalhada dos problemas com os quais eu apenas modifiquei o plist.
e.James 18/09/09
De qualquer forma, obrigado pela resposta. Você formou um excelente conjunto de instruções e me indicou a direção certa, de modo que eu a marquei como aceita. Felicidades! :)
e.James
3

Adotei essa idéia e fui um pouco mais longe, abordando as estratégias de crescimento e recuperação.

Detalhes em http://www.crypticide.com/dropsafe/article/3848 ; Eu postaria um link para a página de projeto do GoogleCode "dynamicpagerwrapper", mas o blog me diz que não tenho pontos de reputação suficientes ...


fonte
1
+1 Ótimas coisas! Estou tentando agora. Aqui está o link para o projeto GoogleCode
e.James
verifique se está usando pelo menos a revisão 8 do script: code.google.com/p/dynamicpagerwrapper/source/browse/trunk/…
3

apenas uma pergunta: por que não apenas editar o arquivo .plist adicionando wait4path, em vez de usar o intermediário dynamic_pager_init?

algo assim:

EDIT: como explicado no comentário de e.James e no meu comentário a seguir, o bloco XML imediatamente a seguir não é bom, tanto porque há um erro (ausente &&) quanto porque apenas o primeiro argumento da matriz ProgramArguments é analisado como o programa a ser executado !

mas .. (role para baixo)

 ...
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>
 ...

final do bloco xml errado


este bloco XML deve funcionar:

   ...
    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>
     ...

lembre-se de que ainda não tive tempo suficiente para tentar com segurança essa configuração, mas tentei executar vários outros comandos do shell iniciados da mesma maneira e tudo deve funcionar conforme o esperado

Como funciona:

base: executando wait4path /path && commandsignifica que commandé executado apenas se wait4pathtermina e sai sem erros, e isso acontece apenas quando /pathhá um caminho disponível, para que possamos dizer dynamic_pagercom segurança para usar esse volume para arquivos de troca

1) conforme escrito na página de launchd.plistmanual, as chaves Programe ProgramArgumentssão mapeadas para uma execvpchamada, isso significa que tudo, exceto a primeira string da matriz, é tratado como um argumento para a primeira string da matriz, o programa a ser executado;

2) conforme escrito na página de bashmanual, existe uma bash -c <string>opção para executar a sequência passada como comandos

1 + 2 = 3) o que acontece usando essa linha de comando em um launchd plist ??

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

/bin/bashé o programa a ser executado, -cé o primeiro argumento e a cadeia de caracteres entre aspas duplas é o segundo argumento

Eu acho que deve funcionar exatamente como sua solução, sem o script intermediário: launchdiniciará o serviço, que aguardará o caminho especificado e será iniciado dynamic_pager..

Por favor, note que:
* a string que você quer executar deve ser dupla citado se você executar bash -cno Terminal, mas é não double citado no arquivo plist! (eu acho que porque ele já está declarado como uma string com a tag apropriada)
* os dois &na string devem ser alterados para &amp;no arquivo plist

PS: como sempre, proceda por sua conta e risco, não me responsabilizo por problemas que você possa ter usando essa configuração!

Obrigado por compartilhar seu trabalho conosco

ekl
fonte
Essa é uma idéia interessante. Não tenho certeza se é "legal" colocar mais de um programa na ProgramArgumentsmatriz, mas certamente vale a pena tentar. Voce já experimentou?
e.James
Desculpe, houve um erro na minha postagem anterior, minha ideia era executar a seguinte linha de comando (observe o && que estava faltando): wait4path / Volumes / Swap / && / sbin / dynamic_pager -F /Volumes/Swap/.vm/swapfile se alguém encontrar uma maneira de "formatar" essa linha para que o launchd goste, acho que deve funcionar (estou pensando nisso, talvez chamando / bin / bash passando o resto como argumentos?); mais explicações sobre os campos Program e ProgramArguments estão disponíveis na página de manual launchd.plist e isso levará à página de manual execvp (3). Estou lendo e pensando, se alguém é mais rápido, por favor poste :)
ekl
Eu editei o post anterior com uma solução que deve funcionar, por favor, comente se você vir algum tipo de erro ou o que pode não funcionar corretamente, obrigado!
EKL
Eu tentei no meu laptop e parece funcionar. Vou ficar de olho nisso por alguns dias para ter certeza, mas parece que você simplificou imensamente todo o processo! Bom trabalho:)
e.James
Seu método simplificado está funcionando como um encanto no meu laptop. Obrigado! Vou atualizar a questão principal para incorporar sua solução.
e.James
2

Eu sei que já faz um tempo desde que este artigo foi escrito, mas pensei em adicionar meu pequeno item aqui para aqueles que querem fazer isso também…

Eu usei o truque acima para mover meus arquivos de swap para outra unidade interna (minha unidade de inicialização é SSD com chips MLC, portanto, a remoção de vm pode salvar a expectativa de vida). De qualquer forma, depois de criar o novo volume, eu tinha um volume de Troca no Finder que nunca vou usar no próprio Finder, então decidi tornar o volume invisível para o Finder. Você precisa do Developer Toolkit da Apple instalado. Então digite:

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

… E substitua / Volumes / Troque pelo nome que você deu ao seu volume. Reinicie o Finder e pronto, não haverá mais troca de volume no Finder!

Michael Spurlock
fonte
1

Você pode usar wait4path para aguardar a montagem do volume; caso contrário, o launchd reiniciará seu script dynamic_pager_init repetidas vezes até que isso aconteça ...

ZILjr
fonte
Brilhante! Eu usei em wait4pathvez da combinação if/ grep, e isso limpa as coisas muito bem. Obrigado pela dica.
e.James
1

Talvez possamos usar o Xupport para fazer esses trabalhos sujos para nós :) http://www.applicorn.com/

Otimizador de memória virtual:

Alterar o local dos arquivos de troca No Mac OS X, as informações da memória virtual são armazenadas nos chamados "Swapfiles". Como os arquivos de troca são os arquivos de sistema mais interativos, faz sentido colocá-los em uma partição separada. É recomendável armazenar os arquivos de troca na primeira partição do seu disco rígido interno mais rápido. O tamanho mínimo recomendado da partição deve ser cerca de 3 ou 4 vezes mais que o tamanho da memória física incorporada (por exemplo, 1 GB de memória física = partição de troca de 4 GB). Recomendações e instruções para um ótimo desempenho do sistema:

1. Divida novamente o disco rígido com um volume de troca como PRIMEIRA partição (usando o DVD de instalação do Mac OS X). AVISO: REPARTICIONAR UM DISCO RÍGIDO APAGARÁ TODOS OS DADOS EXISTENTES!

2. Restaure os dados do sistema ou instale um novo sistema na partição do sistema.

3. Inicialize a partir da partição do sistema.

4. Se você deseja que seu volume de swap fique invisível para o Finder: • Inicie o Xupport e escolha "Configurações" • Ative "Mostrar arquivos e pastas ocultos" e reinicie o Finder • Renomeie o volume de swap de "swap" para ".swap" (O ponto o torna invisível para o Finder) • Desative "Mostrar arquivos e pastas ocultos" e reinicie o Finder novamente

5. Selecione a nova partição de troca em "Swap Storage Volume". Em seguida, pressione o botão "Definir" para aplicar as novas configurações de localização do arquivo de troca (é necessário reiniciar).

BTW, funciona para mim. Snow Leopard 10.6.2 @ MacBook Pro de 2,4 GHz, 4 GB de RAM, 500 GB HD


fonte
Parece promissor. Obrigado pelo link e instruções detalhadas!
e.James
applicorn.com - 404
pkoch 26/03
1

É provavelmente uma resposta indesejada (já que não posso comentar depois de Diago), mas por que você realmente insiste que isso trará pequenos ganhos de desempenho? Eu passei por uma discussão nos fóruns da apple e concluí que isso não é uma boa ideia. E eu fui muito resistente em abandoná-lo. Você poderia criar dados que provassem isso, pelo menos para você, ou é apenas um "sentimento"?

De todas as vezes que eu usei swap, mesmo no linux, há 10 anos atrás, e hoje em dia no ubuntu, eu nunca via melhorias no desempenho. Minha razão para querer isso foi evitar problemas com espaço livre no OSX e, no Linux, por poder hibernar. Isso é tudo para mim.

Mas eu nunca fiz pesquisas mais profundas por conta própria ou nas interwebs.

cregox
fonte
Essa é uma crítica válida. Não tenho dados para apoiar minhas reivindicações :)
e.James
Legal. Então, eventualmente, você pode desistir de passar por todo esse problema também! : P
cregox 23/02
1

Esta não é uma resposta, mas talvez um complemento de acompanhamento muito útil. A Apple fornece um editor de lista grátis aqui PlistEdit Pro . Permite editar esses arquivos com segurança. Parece que você pode mudar o argumento com o valor / private / var / vm / swapfile para algo como / Volumes / OtherDrive / vm / myswapfilename para mover os arquivos de troca para outro lugar ...

Mais uma vez eu não testei isso ...

Jesse
fonte
É um bom pensamento, e a primeira coisa que comecei quando segui esse caminho. O problema é que a partição de troca nem sempre é montada no momento em que o pager dinâmico é iniciado. Veja a nota 1 na própria pergunta para obter detalhes sobre o que quero dizer.
e.James