Não consigo descobrir por que o lsof no meu Mac (10.8.2, MacBook Pro) é tão lento.
No meu Mac, lsof
leva mais de um minuto:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 1m16.483s
user 0m0.029s
sys 1m15.969s
Em uma caixa típica do Linux, executando o Ubuntu 12.04, são lsof
necessários 20 ms:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 0m0.023s
user 0m0.008s
sys 0m0.012s
O problema persiste se eu executar lsof -n
(para evitar pesquisas de DNS). Além disso, tentei verificar quais chamadas do sistema são feitas lsof
usandodtruss
e descobri que ele está chamando proc_info
dezenas de milhares de vezes:
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | sort | uniq -c | sort -nr | head
10000 proc_info(0x2, 0x1199, 0x8) = 1272 0
6876 proc_info(0x2, 0x45, 0x8) = 1272 0
2360 proc_info(0x2, 0x190D, 0x8) = 1272 0
1294 proc_info(0x2, 0xFF, 0x8) = 1272 0
1152 proc_info(0x2, 0x474, 0x8) = 1272 0
1079 proc_info(0x2, 0x2F, 0x8) = 1272 0
709 proc_info(0x2, 0xFE, 0x8) = 1272 0
693 proc_info(0x2, 0x1F, 0x8) = 1272 0
623 proc_info(0x2, 0x11A, 0x8) = 1272 0
528 proc_info(0x2, 0xF7, 0x8) = 1272 0
Alguma ideia? Eu executei esses testes e obtive os mesmos resultados usando a versão dolsof
incluída no OS X (4.85) e a versão mais recente de ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).
(Para os curiosos, a razão pela qual estou frustrado com esse desempenho é que, ao arrastar imagens para o Evernote, ele é executado lsof
no processo de cópia do arquivo, fazendo com que meu sistema fique travado por um minuto inteiro sempre que tento inserir uma imagem no Evernote.)
fonte
lsof
sem argumentos (para listar todos os arquivos), ele será interrompido por um minuto e depois imprimirá todos os arquivos. Mas, como mencionei, ainda trava se eu tentar listar quem tem um único arquivo aberto no diretório / tmp, portanto, esse não é um arquivo aberto específico que é o problema. Além disso, não estou executando nenhum processo AirServer.sudo opensnoop -n lsof
.sudo opensnoop -n lsof
elsof /tmp/testfile
em duas guias, e o opensnoop relatou apenas que três arquivos foram abertos. Portanto, o problema não deve ser um número excessivo de arquivos abertos, mas algo relacionado aproc_info
chamadas excessivas .Respostas:
De acordo com minha experiência, do Mac OS X 10.7 (Lion) ao 10.11.5 (EI Capitan), o
lsof
travamento sempre.Para resolver o problema, anexe a
-n
opção.De acordo com o manual de
lsof
, a-n
opção:EDIT 2018-04-25: Se ainda estiver lento, você pode tentar
A melhor maneira de descobrir por que é tão lento executar a ferramenta "Instruments" (no ícone do Spotlight Search no canto superior direito) para fazer um "System Trace" em / usr / sbin / lsof e ver as chamadas de gráfico e sys.
fonte
-n
cortar meulsof +D
para baixo de5.31 real
para0.25 real
. Esta opção é para ... realAcho que a maior parte do problema é que o macOS está se tornando cada vez mais ridículo com inchaço e camadas desnecessárias sobre camadas de estruturas inúteis. Isso significou centenas de processos extras e milhares de arquivos extras sendo mantidos abertos, aumentando a quantidade de trabalho
lsof
a em pelo menos uma ordem de magnitude e, talvez, mais como duas ordens.lsof
passou de velocidade razoável para atrozmente lento entre 10,6 e 10,13.Aqui em um sistema 10.13.4 atual, vejo o seguinte com apenas 7 aplicativos abertos e em execução (Terminal, Chrome, Calendário, Finder, Adium, IPGadget e Stickies). (O Chrome tem 7 janelas, com talvez 10 guias cada.)
Durante a execução, ambas as CPUs têm mais de 50% de tempo do sistema
-O
Às vezes, adicionar ajuda, principalmente selsof
não tiver sido executado ultimamente, mas o melhor que eu vi foi cerca de 10% de economia. Geralmente é minúsculo e provavelmente não vale os riscos descritos na página de manual:dtruss
alega que existem mais de 89.000 chamadasproc_info()
com minha carga de processo atual, e essas estão no kernel e, comotime
relatórios, a grande maioria do tempo gasto está no kernel. Não sei por que existem cerca de 8 chamadas por arquivo aberto.Infelizmente, o macOS / Darwin não inclui o
fstat
comando BSD cada vez mais útil e eficiente .fonte
Eu não tenho uma ótima resposta por que seu sistema parece demorar um minuto a mais do que o meu Mac mais lento para ligar
proc_info
30 mil vezes, mas seu tempo mostra que o Linux e o OS X estão na faixa de 10 ms para que o tempo do usuário execute lsof. Você pode reproduzir o tempo lento de inicialização no modo de segurança para descartar outras cargas na sua CPU?Eu tentei três Macs e os que executam 10.7.5 são cerca de um segundo mais rápidos que o meu Mac 10.8.2. O sistema operacional mais antigo é um processador Core 2 Duo mais lento e eu acho que um Mac i7 executando o sistema operacional mais recente seria tão rápido ou mais rápido que o sistema operacional e a CPU mais antigos, mas eu estaria errado.
Todas as máquinas fazem o mesmo número de chamadas proc_info, e todas as máquinas têm um tempo de usuário limitado para o comando - mas você pode ter um tempo geral mais lento (e eu não tenho idéia do por que o seu é tão drasticamente mais lento que o meu leão da montanha) Mac).
11 polegadas Air (i7) 2011 executando o Mountain Lion - SSD:
MacBook Pro de 15 polegadas executando o Lion Server - HDD:
IMac de 27 polegadas executando o Lion - HDD:
fonte