linux - 在 Go 中获取进程打开的文件句柄数的有效方法?

标签 linux go

我有一个名为 scollector 的监控代理,它在我们的负载均衡器上使用了更多的 CPU。 Perf 说 CPU 主要是由于 __d_lookup。我监控的其中一件事是打开文件句柄的数量 - 我通过以下代码执行此操作:

    fds, e := ioutil.ReadDir("/proc/" + pid + "/fd")
    if e != nil {
        w.Remove(pid)
        continue
    }
    ...
    Add(md, "linux.proc.num_fds", len(fds), tags, metadata.Gauge, metadata.Files, descLinuxProcFd)

当我跟踪进程时,我看到它在 /fd 目录中的每个文件上调用 lstat(这对我们的事件负载均衡器来说会很多(至少 50 万个 fds)- 所以我假设这是进程的高 dentry 缓存 cpu 使用率的来源。

有人对执行此操作的更好方法有任何建议吗?

最佳答案

ioutil.Readdir 的问题在于它执行 file.Readdir,它表示它对每个文件执行 lstat

好像Readdirnames不这样做,只返回名称。由于您只需要计数,这就足够了。

关于linux - 在 Go 中获取进程打开的文件句柄数的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784844/

相关文章:

go - 复合类型和指针方法

linux - 在没有dos2unix的情况下递归地转换目录和子目录中所有文件的所有EOL(dos-> unix)

linux - 获取以前版本的 linux-next 的日志

google-app-engine - 继续 Google App Engine 频繁关闭

go - 如何从 Go 服务器在浏览器中下载文件

html - 为什么在我输入电子邮件时没有显示我的订单状态?

linux - 主机命令不使用辅助 dns 条目解析反向查找区域

linux - 使用 sed 条件替换

c++ - 在串行端口上读取返回我刚写的内容

go - 无法将 traefik 与动态配置文件一起使用