OS Xのlsofがとてつもなく遅いのはなぜですか?


34

Mac(10.8.2、MacBook Pro)のlsofがなぜ遅いのか、私にはわかりません。

私のMacではlsof、1分以上かかります。

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

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

Ubuntu 12.04を実行している典型的なLinuxボックスでは、lsof20ミリ秒かかります。

$ 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すると、ファイルをコピーするプロセスで実行され、画像を挿入しようとするたびにシステムが1分間ハングするためです。 Evernoteで。)


1
ファイルではなくコンソールに出力する場合、特定のポイントでハングしますか?私も10.8.2です。私には6秒かかりましたが、AirServerの開いているファイルのリストの途中で毎回ハングしていることに気付きました。私はAirServerを殺し、時間は1.76秒に落ちました。おそらくあなたのシステムには評価に時間がかかっているものがありますか?
ウォーレンペナ

興味深いデータポイント、@ WarrenPena。lsof引数なしで(すべてのファイルをリストするために)実行すると、1分間ハングしてからすべてのファイルを印刷します。しかし、先ほど述べたように、/ tmpディレクトリで単一のファイルを開いている人をリストしようとするとハングします。そのため、特定の開いているファイルが問題ではありません。また、AirServerプロセスを実行していません。
ジェイソン

2
それは(だけ?)約1秒かかります。試すこともできsudo opensnoop -n lsofます。
-Lri

2
私には19秒かかります。理由は
わかり

良いアイデア、@ LauriRanta。2つのタブで実行sudo opensnoop -n lsoflsof /tmp/testfileてみましたが、opensnoopは3つのファイルが開かれたとしか報告しませんでした。そのため、問題はファイルを開く回数が多すぎることではなく、過剰なproc_info呼び出しに関連するものでなければなりません。
ジェイソン

回答:


9

私の経験として、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

なぜそんなに遅いのかを知る究極の方法は、「Instruments」ツールを実行して(右上隅の「Spotlight Search」アイコン)、/ usr / sbin / lsofで「System Trace」を実行し、グラフとsys呼び出しを確認することです。

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください


2
うわー!をからに-n切り詰めます。このオプションは... reallsof +D5.31 real0.25 real
wetjosh

2
私にとっては
とてつもなく

こんにちは@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よりもproc_info3万回電話するのに1分長くかかるように見える理由はあまりわかりませんが、あなたのタイミングは、LinuxとOS Xの両方がlsofを実行するユーザー時間に対して10ミリ秒の範囲にあることを示しています。CPUの他の負荷を除外するためにセーフモードで起動するその遅い時間を再現できますか?

私は3台のMacを試しましたが、10.7.5を実行しているものは私の10.8.2 Macよりも約1秒高速です。古いOSはより遅いCore 2 Duoプロセッサであり、新しいOSを実行しているi7 Macは古いOSやCPUと同じかそれより速いと思いますが、間違っています。

すべてのマシンはほぼ同じ数のproc_info呼び出しを行い、すべてのマシンはコマンドの無駄なユーザー時間を持っています-しかし、全体的なタイミングが遅くなる可能性がありますマック)。

11インチAir(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.