func monitorFileDescriptor(done <-chan struct{}) { ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() for { used, err := runtime.FDUsage() if err != nil { plog.Errorf("cannot monitor file descriptor usage (%v)", err) return } fileDescriptorUsed.Set(float64(used)) limit, err := runtime.FDLimit() if err != nil { plog.Errorf("cannot monitor file descriptor usage (%v)", err) return } if used >= limit/5*4 { plog.Warningf("80%% of the file descriptor limit is used [used = %d, limit = %d]", used, limit) } select { case <-ticker.C: case <-done: return } } }
func init() { rand.Seed(time.Now().UnixNano()) expvar.Publish( "file_descriptor_limit", expvar.Func( func() interface{} { n, _ := runtime.FDLimit() return n }, ), ) }