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.)
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
e lsof /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 a proc_info
chamadas excessivas .