Я не могу понять, почему 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
вызовами.Ответы:
Как показывает мой опыт, от Mac OS X 10.7 (Lion) до 10.11.5 (EI Capitan)
lsof
всегда зависают.Чтобы решить проблему, добавьте
-n
опцию.Согласно инструкции
lsof
,-n
опция:РЕДАКТИРОВАТЬ 2018-04-25: Если это все еще медленно, вы можете попробовать
Лучший способ выяснить, почему так медленно, - запустить инструмент «Инструменты» (в правом верхнем углу значка Spotlight Search), чтобы выполнить «Системный след» в / usr / sbin / lsof, а затем просмотреть вызовы graph и sys.
источник
-n
рубиlsof +D
от5.31 real
к0.25 real
. Этот вариант для ... реальногоЯ думаю, что самая большая часть проблемы заключается в том, что macOS становится все более нелепым с раздуванием и ненужными слоями на слоях расточительных платформ. Это означало, что сотни дополнительных процессов и тысячи дополнительных файлов
lsof
остаются открытыми, увеличивая объем работы, которую необходимо выполнить, по крайней мере, на порядок, а может быть, больше на два порядка.lsof
перешел с разумной скорости на ужасно медленный между 10,6 и 10,13.Здесь, в текущей системе 10.13.4, я вижу следующее с 7 открытыми и работающими приложениями (Terminal, Chrome, Calendar, Finder, Adium, IPGadget и Stickies). (Chrome имеет 7 окон, по 10 вкладок в каждом.)
Во время работы оба процессора занимают более 50% системного времени
-O
Иногда помогает добавление , особенно еслиlsof
оно не запускалось в последнее время, но лучшее, что я видел, было около 10% экономии. Обычно это незначительно и, вероятно, не стоит рисков, описанных на странице руководства:dtruss
утверждает, чтоproc_info()
с моей текущей загрузкой процесса поступило более 89 000 вызовов , и они относятся к ядру, и, какtime
сообщается, подавляющее большинство времени уходит на ядро. Я не знаю, почему на открытый файл приходится около 8 звонков.К сожалению, macOS / Darwin не содержит еще более полезной и эффективной
fstat
команды BSD .источник
У меня нет хорошего ответа, почему ваша система, кажется, занимает минуту дольше, чем мой самый медленный Mac, чтобы звонить в
proc_info
30 тысяч раз, но ваше время показывает, что и linux, и OS X находятся в диапазоне 10 мс для того, чтобы пользователь запускал lsof. Можете ли вы воспроизвести эту медленную загрузку в безопасном режиме, чтобы исключить другие нагрузки на ваш процессор?Я пробовал три Mac, и те, которые работают с 10.7.5, примерно на секунду быстрее, чем мой Mac с 10.8.2. Старые ОС - более медленные процессоры Core 2 Duo, и я думаю, что i7 Mac с более новой ОС будет работать быстрее или быстрее, чем старые ОС и ЦП, но я ошибаюсь.
Все машины совершают примерно одинаковое количество вызовов proc_info, и у всех машин время команды меньше, чем у пользователя, - но вы можете использовать более медленное общее время (и я не имею ни малейшего представления, почему ваша машина так значительно медленнее, чем мой Mountain Lion). Mac).
11-дюймовый Air (i7) 2011 под управлением Mountain Lion - SSD:
15-дюймовый MacBook Pro с Lion Server - HDD:
27-дюймовый iMac под управлением Lion - HDD:
источник