1
我有一个名为scollector的监视代理,它在我们的负载均衡器上使用了更多的cpu。 Perf说CPU主要是由于__d_lookup
。有一个问题我监视的一件事是打开的文件句柄数 - 我通过下面的代码做到这一点:通过Go中的进程获取文件句柄数量的有效方法?
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)
当我与strace的过程中,我看到它在/fd
目录中的所有文件调用lstat
(这是对于我们的主动负载平衡器(至少500万fds)会有很大的影响 - 所以我推测这是高进程缓存cpu占用率的来源。要做到这一点?
这里是readdirnames的unix实现:golang.org/src/os/dir_unix.go –
是的。底层的f.readdirnames不会调用'lstat'。 – cnicutar
Readdir也排序,这可能是很多的CPU。我注意到'/ *打开文件表结构*/ struct files_struct {0} {0} {0}} int count; \t fd_set close_on_exec; \t fd_set open_fds; \t struct file * fd [NR_OPEN]; }'是linux中task_struct的一部分。我不知道我是否可以通过系统调用以某种方式得到这个数... –