Existe alguma maneira de saber se um aplicativo específico em execução no Mac OSX (10.2+) possui parte de sua memória trocada (ou seja, para um dos /private/var/vm/swapfile*
arquivos)? E quanto?
Recompensa (150 rps)
Questão simples. A primeira resposta correta será aceita se eu a vir com menos de 2 dias de vencimento do período de recompensa. Se eu ainda não tiver um, concederei a quem me contar o fato novo mais interessante. E se eu não aprendi nada com nenhuma das respostas, concederei a recompensa a quem escrever com mais beleza.
macos
mac
swap
virtual-memory
Charles Stewart
fonte
fonte
Respostas:
Eu tenho pesquisado muito no Google ;-) Pelo que entendi, a memória virtual de um determinado processo é dividida em páginas que são tratadas pelo sistema operacional e apresentadas ao aplicativo como se fossem RAM.
No OS X, baseado no kernel do Mach, isso é tratado por um daemon chamado
dynamic_pager
. Esse processo gera os arquivos de troca/private/var/vm
como você mencionou. Esses arquivos de troca não são gerados por aplicativo, mas com "necessidade de memória". Os arquivos de troca são divididos em páginas de 4096 bytes e as páginas são alocadas aos processos que (são considerados pelo SO) precisam de memória virtual. Portanto, você não pode associar um arquivo de troca a um determinado aplicativo, mas pode ver quantas páginas um determinado processo está usando.Você pode tentar o comando
vm_stat
em Termial. Isso fornece uma estatística do uso da VM (observe que 'tamanho da página' vezes o número de páginas ativas igual ao tamanho dos seus arquivos de troca). Isso também explica por que você pode ter vários processos usando a VM, mas apenas alguns arquivos de troca.Outros comandos divertidos são
vmmap [process id]
epagestuff
.fonte
vmmap [pid]
ouvmmap -pages [pid]
a resposta para a segunda parte da sua pergunta?O
vmmap PID
comando deve fornecer algumas estatísticas úteis em números sobre um determinado processo.fonte
Com base nas idéias postadas aqui, criei esta pequena linha de código:
que exibe a seção Resumo (3 linhas) da saída vmmap. Eu usei
notifyd
neste exemplo, mas você pode substituí-lo por qualquer PID que você conhece.Esta linha tentará listar todas as linhas de resumo de todos os processos em execução. Obviamente, alguns irão falhar porque seu ID do processo já se foi (processo encerrado), mas, em geral, achei que essa é uma ótima maneira de percorrer uma lista de informações de memória e localizar o principal trocador.
Editado: algum usuário anônimo viu que esta última linha de comando precisava ser aprimorada, porque obviamente a variante original não funcionava mais. Então, muito obrigado quem você é e lamento que sua edição tenha sido rejeitada. (O primeiro comando leu anteriormente 'ps xa' e resultou na falha do vmmap devido ao título do ps ser lançado nele)
Melhorias adicionais: se você deseja saber o nome do programa imediatamente, use esta pequena alteração
Uma pequena alteração na outra extremidade deste comando permite filtrar determinados nomes de programas ou componentes do caminho da linha de comandos. Aqui, examinamos todos os processos da 'Library / PrivateFrameworks' apenas por exemplo.
fonte
ps -o pid= -xa | awk '{print $1}' | xargs -n 1 -I{} bash -c ‘sudo vmmap {} || true’ | egrep 'swapped_out|^Path:|^Process:'
. Ele ainda não para em ctrl + c, mas também não para em erros de vmmap.Abra o Activity Monitor na sua pasta / Aplicativos / Utilitários e há uma coluna Memória virtual que informará isso. Você pode clicar no cabeçalho da memória virtual para classificar por mais ou menos usado pelo aplicativo. Também certifique-se de alterar Meus processos para Todos os processos e saiba que um aplicativo pode ter vários processos. Por exemplo, o aplicativo de terceiros Little Snitch é composto por "Little Snitch Network Monitor" e "Little Snitch UIAgent".
fonte
Como disse o ridogi, abra o Activity Monitor. Navegue até o processo que deseja inspecionar e clique em ... Inspecionar! Depois clique na memória; isto lhe dirá quanto swap o processo fornecido está usando.
Diverta-se!
fonte