Я не можу зрозуміти, чому 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
дзвінками.