【问题标题】:In Mac OS X, how can I get an accurate count of file descriptor usage?在 Mac OS X 中,如何获得文件描述符使用的准确计数?
【发布时间】:2010-10-22 04:01:51
【问题描述】:

在 Linux 上,ulimit -n 可用于更改或查看进程的文件描述符数量限制,lsof -p nnn | wc -l 似乎始终报告实际文件描述符的使用情况。

但在 Mac OS X 上,lsof -p nnn | wc -l 可以返回一个高于限制的数字。我想这意味着 lsof 返回的不仅仅是文件描述符,但我不知道是什么。

底线:如何获得 Mac OS X 中文件描述符使用的准确计数?

【问题讨论】:

  • 首先,不要通过管道输出并查看它实际列出的内容。然后你就会知道这些额外的描述符来自哪里以及它们是什么。

标签: macos unix lsof


【解决方案1】:

我最近遇到了识别这一点的需要——我用来计算总条目的命令(不仅仅是文件句柄,而是它的相对关系,因此与 imo 相关)是:

lsof | awk '{print $1}' | uniq -c | sort -rn | head

这会给出类似以下的输出(您使用频率最高的应用程序可能会有所不同!):

$lsof | awk '{print $1}' | uniq -c | sort -rn | head
3271 com.apple
2978 Google
 914 Atom\x20H
 505 Skype
 476 Microsoft
 375 Screenher
 304 Finder
 292 Dock
 277 Atom\x20H
 270 Atom\x20H

我通常只需要查看前 10 个条目,但您可以操纵 head 以显示任意数量的行。

【讨论】:

  • 您应该在调用uniq 之前sort 以避免重复条目:lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head
  • 使用lsof -n,它不会尝试将ips解析为域名并且速度更快。
  • @deadbeef 我尝试了lsoflsof -n,就我而言,它们都是15秒。
【解决方案2】:

lsof 可以显示很多东西,而不仅仅是文件描述符,但大多数可能会增加您的计数的是应用程序的已加载框架和库。您可以查看“FD”列以查看某行是否为文件描述符——在这种情况下,它是一个数字,可能后跟一个指示模式的字母——或其他内容(参见lsof 手册页查看完整列表)。

如果你只需要一个粗略的近似值,在你的 wc 之前添加一个 'grep -v " txt "' 会让你更接近一个准确的值。如果您需要一个确切的值,您可能需要组合一个正则表达式,以便通过 FD 列精确地通过该文件管理器提供输出。

【讨论】:

  • lsof -d "^txt" 将避免使用 grep。
【解决方案3】:

我修改了anders的回答,现在只显示特定进程打开的fd号:

FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3

例子:

$ ./fd-count.sh 5926                                                                                                           
PID: 5926       97

【讨论】:

【解决方案4】:

我在寻找哪个进程有很多文件描述符——所以我猜是这样的

for pid in `ps aux | tail -n +2 | awk '{print $2}'`; do FCOUNT=`lsof -p $pid | grep -v " txt " | wc -l`; echo "PID: $pid $FCOUNT"; done | sort -nk3

【讨论】:

  • lsof: illegal process ID: PID
  • @bithavoc,用于ps aux | tail -n +2 | awk '{print $2}'中的pid;做 FCOUNT=lsof -p $pid | grep -v " txt " | wc -l; echo "PID: $pid $FCOUNT";完成 | sort -nk3 -- 这将切断包含列标题的第一行 ps 输出。
  • 您还应该将| tail -n +2 技巧添加到lsof -p $pid | grep -v " txt " | wc -l,这样您就不会最终将标题行计为文件描述符。
猜你喜欢
  • 2011-01-04
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多