Чому lsof в OS X настільки смішно повільний?


36

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


1
Якщо у вас є вихід на консоль замість файлу, чи він висить у певній точці? Я також 10.8.2. Мені було потрібно 6 секунд, і я помітив, що він зависає кожен раз на півдорозі, перераховуючи відкриті файли AirServer. Я вбив AirServer, і час знизився до 1,76. Можливо, у вашій системі є щось, на що потрібно багато часу, щоб оцінити?
Warren Pena

Цікава точка даних, @WarrenPena. Якщо я запускаю lsofбез аргументів (щоб перерахувати всі файли), він зависає на хвилину, а потім друкує всі файли. Але, як я вже згадував, воно все ще зависає, якщо я спробую вказати, хто має один файл, відкритий у каталозі / tmp, тому проблема не в конкретному відкритому файлі. Крім того, я не запускаю жодного процесу AirServer.
Джейсон

2
Це (тільки?) Займає близько секунди. Ви також можете спробувати sudo opensnoop -n lsof.
Лрі

2
Це займає 19 с. Не маю ідеї, чому ...
daviewales

Гарна ідея, @LauriRanta. Я спробував запустити sudo opensnoop -n lsofі lsof /tmp/testfileна двох вкладках, і opensnoop повідомив лише про те, що три файли були відкриті. Тому проблема повинна полягати не у надмірній кількості відкритих файлів, а у тому, що пов’язане із надмірними proc_infoдзвінками.
Джейсон

Відповіді:


10

Як показує мій досвід, від Mac OS X 10.7 (Lion) до 10.11.5 (EI Capitan) lsofзавжди висить.

Щоб вирішити проблему, додайте -nваріант.

lsof -n

Згідно з посібником lsof, -nваріант:

inhibits the conversion of network numbers to host names for network files.  
Inhibiting conversion may make  lsof  run faster.  It is also useful when host 
name lookup is not working properly

EDIT 2018-04-25: Якщо вона все ще повільна, можете спробувати

-O to bypass  the  strategy it uses to avoid being blocked by some kernel operations
-P to inhibits the conversion of port numbers to port names for network files
-l to inhibits  the  conversion of user ID numbers to login names

Кінцевий спосіб з'ясувати, чому так повільно - запустити інструмент "Інструменти" (з правого верхнього кута значок Spotlight Search), щоб зробити "Системну трасування" на / usr / sbin / lsof, а потім переглянути графік та систематизувати дзвінки.

введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення


2
Оце Так! Додавання -nскоротити мою lsof +Dвниз від 5.31 realдо 0.25 real. Цей варіант призначений для ... справжнього
wetjosh

2
Все ще смішно повільно для мене ...
Нолдорін

Привіт @Noldorin Ви на тому ж os, як і ця старша нитка? Якщо ні, то нове конкретне запитання, що поєднує тут ваші конкретні налаштування та конкретні терміни, може бути вартим нової відповіді.
bmike

3

Я думаю, що найбільша частина проблеми полягає в тому, що macOS стає все більш смішним з нальотом і непотрібними шарами на шарах марнотратних рамок. Це означало сотні додаткових процесів і тисячі зайвих файлів, які тримаються відкритими, збільшуючи обсяг роботи, lsofщонайменше, на порядок, а може бути, як на два порядки.

lsof перейшов від розумної швидкості до жорстоко повільного між 10,6 та 10,13.

Тут у поточній системі 10.13.4 я бачу наступне, із відкритими та запущеними лише 7 додатками (Terminal, Chrome, Calendar, Finder, Adium, IPGadget та Stickies). (У Chrome 7 вікон, можливо, 10 вкладок.)

# ps ax | wc -l
     401
# time lsof -lnP | wc -l
   10976

real    0m49.684s
user    0m0.250s
sys 0m40.172s

Під час запуску обидва процесора мають понад 50% системного часу

Додавання -Oдопомагає іноді, особливо якщо lsofйого не виконували останнім часом, але найкраще, що я бачив, - це приблизно 10% економії. Зазвичай це незначно і, ймовірно, не варто ризиків, викладених на сторінці керівництва:

# time lsof -lnPO | wc -l
   10994

real    0m47.482s
user    0m0.249s
sys 0m40.472s

dtrussстверджує, що proc_info()з моїм поточним завантаженням процесу є понад 89 000 дзвінків , і вони знаходяться в ядрі, і як timeповідомляє, переважна більшість витраченого часу припадає на ядро. Я не знаю, чому існує близько 8 дзвінків на відкритий файл.

На жаль, macOS / Darwin не включає все більш корисну та ефективну fstatкоманду BSD .


1

Я не маю великої відповіді, чому ваша система займає хвилину довше, ніж мій повільний Mac, щоб зателефонувати в proc_info30 тисяч разів, але ваш термін показує, що і Linux, і OS X знаходяться в діапазоні 10 мс для часу користування для запуску lsof. Чи можете ви відтворити це повільне завантаження в безпечному режимі, щоб виключити інші навантаження на ваш процесор?

Я спробував три Macs, а ті, що працюють 10.7.5, приблизно на секунду швидші, ніж мої 10.8.2 Mac. Старіші ОС - це повільніші процесори Core 2 Duo, і я думаю, що i7 Mac, який працює з новою ОС, буде таким же швидшим або швидшим, ніж старі ОС і процесор, але я помиляюся.

Усі машини здійснюють приблизно однакову кількість викликів proc_info, і всі машини мають час користування користувачем для команди - але ви, можливо, будете на більш повільному загальному терміні (і я не маю поняття, чому ваша така різко повільніше, ніж мій гірський лев Мак).

11 дюймовий Air (i7) 2011 року працює на гірському леві - SSD:

$ system_profiler SPSoftwareDataType
      System Version: OS X 10.8.2 (or something)
      Kernel Version: Darwin 12.3.0
      Secure Virtual Memory: Enabled
$ time lsof /tmp/testfile 

real    0m1.179s
user    0m0.012s
sys     0m1.158s
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | sort | uniq -c | sort -nr | head
9310 proc_info(0x2, 0x68, 0x8)           = 1272 0
1220 proc_info(0x2, 0xCEB6, 0x8)                 = 1272 0
$ cat /tmp/dump | cut -c -9 | sort | uniq -c | sort -nr | head
30884 proc_info
 116 write(0x4
  87 read(0x5,
  60 sigaction
  60 setitimer
  35 stat64("/
  30 sigprocma
  30 sigaltsta
  21 close(0x3
  18 close(0x6 

15-дюймовий MacBook Pro під керуванням Lion Server - HDD:

$ system_profiler SPSoftwareDataType
      System Version: Mac OS X Server 10.7.5 (11G63)
      Kernel Version: Darwin 11.4.2
$ time lsof /tmp/testfile

real    0m0.329s
user    0m0.005s
sys     0m0.324s

27-дюймовий iMac під управлінням Lion - HDD:

$ system_profiler SPSoftwareDataType
      System Version: Mac OS X 10.7.5 (11G63b)
      Kernel Version: Darwin 11.4.2
$ time lsof /tmp/testfile

real    0m0.066s
user    0m0.002s
sys     0m0.065s
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | cut -c -9 | sort | uniq -c | sort -nr | head
23034 proc_info
 188 write(0x4
 141 read(0x5,
  96 sigaction
  96 setitimer
  48 sigprocma
  48 sigaltsta
  31 stat64("/
  21 close(0x3
  18 close(0x6

1
+1. Я працюю 10.8.2 на MBP наприкінці 2010 року (i7 + 8 ГБ), а під час запуску купу програм я отримую ~ 1,8 сек.
Харв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.