OS X의 lsof가 엄청나게 느린 이유는 무엇입니까?


36

내 Mac (10.8.2, MacBook Pro)의 lsof가 왜 그렇게 느린 지 알 수 없습니다.

내 Mac에서는 lsof1 분 이상이 걸립니다.

$ touch /tmp/testfile
$ time lsof /tmp/testfile

real   1m16.483s
user   0m0.029s
sys    1m15.969s

일반적인 Linux 상자에서 Ubuntu 12.04를 실행하는 lsof데 20ms가 걸립니다.

$ touch /tmp/testfile
$ time lsof /tmp/testfile

real   0m0.023s
user   0m0.008s
sys    0m0.012s

lsof -nDNS 조회를 피하기 위해 실행하면 문제가 지속됩니다 . 또한을 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파일을 복사하는 과정에서 이미지를 삽입하려고 할 때마다 시스템이 최대 1 분 동안 중단되기 때문에 이미지를 드래그 하는 것입니다 Evernote에서.)


1
파일 대신 콘솔에 출력 한 경우 특정 지점에서 정지합니까? 나는 또한 10.8.2에 있습니다. 6 초가 걸렸고 AirServer의 열린 파일을 나열하는 도중마다 매번 중단되는 것을 알았습니다. AirServer를 종료하고 시간이 1.76 초로 감소했습니다. 시스템에 평가하는 데 시간이 오래 걸리는 것이 있습니까?
Warren Pena

흥미로운 데이터 포인트, @WarrenPena. lsof인수없이 (모든 파일을 나열하기 위해) 실행하면 1 분 동안 중단 된 다음 모든 파일을 인쇄합니다. 그러나 언급했듯이 / tmp 디렉토리에 단일 파일이 열려있는 사람을 나열하려고하면 여전히 정지하므로 문제가되는 특정 열린 파일이 아닙니다. 또한 AirServer 프로세스를 실행하지 않습니다.
Jason

2
나를 위해 약 1 초가 걸립니다. 시도해 볼 수도 있습니다 sudo opensnoop -n lsof.
Lri February

2
나를 위해 19 초가 걸립니다. 왜 그런지 모르겠다.
daviewales

@LauriRanta 님, 좋은 생각입니다. 나는 실행 시도 sudo opensnoop -n lsoflsof /tmp/testfile두 개의 탭에, 단지 세 개의 파일을 열되었다고보고 opensnoop. 따라서 문제는 파일을 너무 많이 proc_info열지 말고 과도한 호출 과 관련된 것이어야 합니다.
Jason

답변:


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

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 아이콘에서 "Instruments"도구를 실행하여 / usr / sbin / lsof에서 "System Trace"를 수행 한 다음 graph 및 sys 호출을 보는 것입니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


2
와우! 추가 -n내 컷 lsof +D에서 아래 5.31 real로를 0.25 real. 이 옵션은 ... 실제
wetjosh

2
아직도 나를 위해 엄청나게 느리게 ...
Noldorin

안녕하세요 @Noldorin이 이전 스레드와 동일한 OS에 있습니까? 그렇지 않은 경우 여기에 특정 설정 및 특정 타이밍과 연결되는 새로운 특정 질문에 대한 새로운 답변을 얻을 수 있습니다.
bmike

3

문제의 가장 큰 부분은 macOS가 낭비되는 프레임 워크 레이어에 부풀어 오르고 불필요한 레이어로 점점 더 어리석어지고 있다는 것입니다. 이는 수백 개의 추가 프로세스와 수천 개의 추가 파일이 열려 있음을 의미하여 작업량을 lsof최소한 1 배 이상, 아마도 2 개 이상 증가시켜야합니다.

lsof 합리적인 속도에서 10.6 ~ 10.13 사이에서 엄청나게 느려졌습니다.

현재 10.13.4 시스템에서 7 개의 응용 프로그램 (단말기, Chrome, 캘린더, 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

실행 중 두 CPU의 시스템 시간이 50 %를 넘습니다.

-O특히 lsof최근에 실행되지 않은 경우 도움을 추가 하는 것이 도움이 되었지만, 내가 본 최고는 약 10 % 절약되었습니다. 일반적으로 이는 사소한 것이며 매뉴얼 페이지에 설명 된 위험을 감수 할 가치가 없습니다.

# time lsof -lnPO | wc -l
   10994

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

dtrussproc_info()현재 프로세스로드로 89,000 건 이상의 호출이 있고 커널에 있다고 주장 하며 time보고서에 따르면 대부분의 시간은 커널에 있습니다. 열린 파일 당 약 8 개의 호출이있는 이유를 모르겠습니다.

안타깝게도 macOS / Darwin에는 훨씬 유용하고 효율적인 BSD fstat명령이 포함되어 있지 않습니다 .


1

나는 왜 당신의 시스템이 가장 느린 Mac보다 1,300,000 proc_info번 호출하는 데 1 분 더 걸리는 것처럼 보이는지에 대한 큰 대답을 얻지 못했지만 타이밍에 따르면 리눅스와 OS X가 lsof를 실행하기 위해 10ms 범위에 있음을 알 수 있습니다. CPU의 다른로드를 배제하기 위해 안전 모드에서 느린 부팅을 재현 할 수 있습니까?

나는 세 개의 Mac을 시도했지만 10.7.5를 실행하는 Mac은 10.8.2 Mac보다 약 1 초 빠릅니다. 구형 OS는 Core 2 Duo 프로세서가 느리고 새로운 OS를 실행하는 i7 Mac이 구형 OS 및 CPU보다 빠르거나 빠를 것이라고 생각하지만 잘못되었습니다.

모든 머신은 같은 수의 proc_info 호출을 수행하며 모든 머신은 명령에 대한 사용자 시간이 적습니다.하지만 전반적인 타이밍이 느려질 수 있습니다. 맥).

11 인치 에어 (i7) 2011 달리기 Mountain Lion-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 

Lion Server를 실행하는 15 인치 MacBook Pro-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

Lion을 실행하는 27 인치 iMac-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. 나는 2010 년 말 MBP (i7 + 8GB)에서 10.8.2를 실행하고 있으며 많은 앱을 실행하는 동안 ~ 1.8 초를 얻습니다.
Harv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.