2015-01-05 71 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的一部分。我不知道我是否可以通過系統調用以某種方式得到這個數... –

相關問題