Nie mogę zrozumieć, dlaczego lsof na moim Macu (10.8.2, MacBook Pro) jest taki wolny.
Na moim komputerze Mac lsof
zajmuje więcej niż minutę:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 1m16.483s
user 0m0.029s
sys 1m15.969s
W typowym systemie Linux z systemem Ubuntu 12.04 lsof
trwa 20 ms:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 0m0.023s
user 0m0.008s
sys 0m0.012s
Problem nie ustępuje, jeśli uruchomię lsof -n
(aby uniknąć wyszukiwania DNS). Ponadto próbowałem sprawdzić, które wywołania systemowe są wykonywane przy lsof
użyciu dtruss
, i stwierdziłem, że wywołuje to proc_info
dziesiątki tysięcy razy:
$ 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
Jakieś pomysły? Uruchomiłem te testy i uzyskałem te same wyniki przy użyciu zarówno wersji lsof
dołączonej do OS X (4.85), jak i najnowszej wersji z ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).
(Z ciekawości powodem, dla którego frustruje mnie ta wydajność, jest to, że kiedy przeciągam obrazy do Evernote, działa ono lsof
w trakcie kopiowania pliku, powodując zawieszenie się systemu przez całą minutę za każdym razem, gdy próbuję wstawić obraz w Evernote.)
źródło
lsof
bez argumentów (aby wyświetlić wszystkie pliki), to zawiesi się na minutę, a następnie wydrukuje wszystkie pliki. Ale, jak wspomniałem, nadal się zawiesza, jeśli spróbuję wymienić, kto ma otwarty pojedynczy plik w katalogu / tmp, więc problem nie jest konkretnym otwartym plikiem. Ponadto nie uruchamiam żadnego procesu AirServer.sudo opensnoop -n lsof
.sudo opensnoop -n lsof
ilsof /tmp/testfile
na dwóch kartach, i opensnoop zgłosił tylko, że trzy pliki zostały otwarte. Problemem nie może być zbyt duża liczba otwieranych plików, ale coś związanego z nadmierną liczbąproc_info
wywołań.Odpowiedzi:
Z mojego doświadczenia wynika, że od Mac OS X 10.7 (Lion) do 10.11.5 (EI Capitan)
lsof
zawsze się zawiesza.Aby rozwiązać problem, dołącz
-n
opcję.Zgodnie z instrukcją
lsof
,-n
opcja:EDYCJA 2018-04-25: Jeśli nadal jest wolny, możesz spróbować
Ostatecznym sposobem, aby dowiedzieć się, dlaczego tak wolno, jest uruchomienie narzędzia „Instruments” (w prawym górnym rogu ikony Spotlight Search), aby wykonać „System Trace” na / usr / sbin / lsof, a następnie zobaczyć wywołania wykresów i sys.
źródło
-n
wyciąć mojelsof +D
od5.31 real
do0.25 real
. Ta opcja jest dla ... prawdziwegoMyślę, że największą częścią problemu jest to, że macOS staje się coraz bardziej absurdalny z powodu wzdęć i niepotrzebnych warstw na warstwach marnotrawnych ram. Oznaczało to, że setki dodatkowych procesów i tysiące dodatkowych plików pozostały otwarte, zwiększając ilość pracy
lsof
do wykonania o co najmniej rząd wielkości, a być może bardziej o dwa zamówienia.lsof
przeszedł z rozsądnej prędkości do okropnie wolnego między 10,6 a 10,13.Tutaj, w obecnym systemie 10.13.4, widzę następujące z zaledwie 7 aplikacjami otwartymi i uruchomionymi (Terminal, Chrome, Kalendarz, Finder, Adium, IPGadget i Stickies). (Chrome ma 7 okien, z których każda może 10 kart).
Podczas pracy oba procesory mają ponad 50% czasu systemowego
Dodawanie
-O
czasami pomaga, szczególnie jeślilsof
ostatnio nie było uruchomione, ale najlepsze, co widziałem, to około 10% oszczędności. Zwykle jest to niewielka ilość i prawdopodobnie nie jest warta ryzyka opisanego na stronie podręcznika:dtruss
twierdzi, żeproc_info()
przy moim bieżącym obciążeniu procesu jest ponad 89 000 wywołań , a są one wysyłane do jądra, a jaktime
donosi, ogromna większość czasu spędzana jest w jądrze. Nie wiem, dlaczego na otwarty plik przypada około 8 połączeń.Niestety macOS / Darwin nie zawiera coraz bardziej przydatnego i wydajnego
fstat
polecenia BSD .źródło
Nie mam doskonałej odpowiedzi na pytanie, dlaczego twój system zajmuje minutę dłużej niż mój najwolniejszy komputer Mac, aby zadzwonić
proc_info
30 tysięcy razy, ale twoje wyczucie czasu pokazuje, że zarówno Linux, jak i OS X znajdują się w zakresie 10 ms, aby użytkownik mógł uruchomić lsof. Czy potrafisz odtworzyć to wolne uruchamianie w trybie awaryjnym, aby wykluczyć inne obciążenia procesora?Wypróbowałem trzy komputery Mac, a te z systemem 10.7.5 są o około sekundę szybsze niż mój Mac 10.8.2. Starsze systemy operacyjne są wolniejszymi procesorami Core 2 Duo i sądzę, że Mac i7 z nowszym systemem operacyjnym byłby tak szybki lub szybszy niż starszy system operacyjny i procesor, ale myliłbym się.
Wszystkie maszyny wykonują mniej więcej taką samą liczbę wywołań proc_info, a wszystkie maszyny mają ograniczony czas użytkownika na komendę - ale możesz mieć wolniejszy ogólny czas (i nie mam pojęcia, dlaczego twój jest tak wolniejszy niż mój Mountain Lion Prochowiec).
11-calowy Air (i7) 2011 z systemem Mountain Lion - SSD:
15-calowy MacBook Pro z systemem Lion Server - HDD:
27-calowy iMac z systemem Lion - HDD:
źródło