我有一个名为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使用的来源。
有人建议更好的方法吗?
答案 0 :(得分:3)
ioutil.Readdir
的问题在于file.Readdir
表示它为每个文件执行了lstat
。
似乎Readdirnames
没有这样做,只返回名字。因为你只想要计数,这应该足够了。