我有一个名为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 (这对于我们的活动负载均衡器(至少是.5百万fd)来说是很大的)-所以我假设这是该进程的高dentry缓存cpu使用率的来源。
有没有人有更好的建议呢?
发布于 2015-01-06 01:45:54
ioutil.Readdir的问题是它做了file.Readdir,也就是说它对每个文件做了lstat。
看起来Readdirnames并没有这样做,只返回名字。既然你只想要计数,这应该就足够了。
https://stackoverflow.com/questions/27784844
复制相似问题