我有一个名为 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/