2015-01-05 37 views
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占用率的来源。要做到这一点?

回答

3

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

看来Readdirnames不这样做,只返回名称。既然你只需要点数,那应该就够了。

+0

这里是readdirnames的unix实现:golang.org/src/os/dir_unix.go –

+0

是的。底层的f.readdirnames不会调用'lstat'。 – cnicutar

+0

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的一部分。我不知道我是否可以通过系统调用以某种方式得到这个数... –

相关问题