Я не могу понять, почему lsof на моем Mac (10.8.2, MacBook Pro) такой медленный.
На моем Mac lsof
занимает больше минуты:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 1m16.483s
user 0m0.029s
sys 1m15.969s
На типичном Linux-компьютере с Ubuntu 12.04 lsof
требуется 20 мс:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 0m0.023s
user 0m0.008s
sys 0m0.012s
Проблема сохраняется, если я запускаю lsof -n
(чтобы избежать поиска DNS). Кроме того, я попытался проверить, какие системные вызовы выполняются с lsof
помощью dtruss
, и обнаружил, что он вызывает proc_info
десятки тысяч раз:
$ 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
Любые идеи? Я провел эти тесты и получил те же результаты, используя как версию, lsof
включенную в OS X (4.85), так и последнюю версию с ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).
(Любопытно, что причина этого разочарования в том, что когда я перетаскиваю изображения в Evernote, он запускается lsof
в процессе копирования файла, в результате чего моя система зависает на целую минуту при каждой попытке вставить изображение в Evernote.)
lsof
без аргументов (чтобы вывести список всех файлов), он зависает на минуту, а затем печатает все файлы. Но, как я уже говорил, он все равно зависает, если я пытаюсь перечислить, у кого открыт один файл в каталоге / tmp, поэтому проблема не в конкретном открытом файле. Кроме того, я не запускаю процесс AirServer.
sudo opensnoop -n lsof
.
sudo opensnoop -n lsof
и lsof /tmp/testfile
в двух вкладках, и opensnoop только сообщил, что были открыты три файла. Таким образом, проблема не в чрезмерном количестве открытий файлов, а в том, что они связаны с чрезмерными proc_info
вызовами.