我不知道为什么Mac(10.8.2,MacBook Pro)上的lsof这么慢。
在我的Mac上,lsof需要一分钟以上的时间:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real   1m16.483s
user   0m0.029s
sys    1m15.969s
在运行Ubuntu 12.04的典型Linux机器上,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
有任何想法吗?我已经运行了这些测试,并使用lsofOS 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调用有关。
                



