有效的方法来获取Go中的进程打开文件句柄的数量?

时间:2015-01-05 17:38:47

标签: linux go

我有一个名为scollector的监视代理程序,它在我们的loadbalancer上使用了更多的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)

当我对该过程进行分析时,我看到它在lstat目录中的每个文件上调用/fd(这对于我们的主动负载均衡器来说将是很多(至少.5百万fds) - 所以我假设这是该进程的高dentry缓存cpu使用的来源。

有人建议更好的方法吗?

1 个答案:

答案 0 :(得分:3)

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

似乎Readdirnames没有这样做,只返回名字。因为你只想要计数,这应该足够了。