From 2471bdda00c7ca94a0e5ebbef7e68db8c92a705f Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Tue, 5 Jul 2022 11:02:30 -0700 Subject: [PATCH] fix: for DiskInfo call cache disk metrics (#15229) Small uploads spend a significant amount of time (~5%) fetching disk info metrics. Also maps are allocated for each call. Add a 100ms cache to disk metrics. --- cmd/xl-storage-disk-id-check.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/cmd/xl-storage-disk-id-check.go b/cmd/xl-storage-disk-id-check.go index 5b56b7d63..9d07ad194 100644 --- a/cmd/xl-storage-disk-id-check.go +++ b/cmd/xl-storage-disk-id-check.go @@ -78,20 +78,28 @@ type xlStorageDiskIDCheck struct { diskID string storage *xlStorage health *diskHealthTracker + metricsCache timedValue } func (p *xlStorageDiskIDCheck) getMetrics() DiskMetrics { - diskMetric := DiskMetrics{ - APILatencies: make(map[string]uint64), - APICalls: make(map[string]uint64), - } - for i, v := range p.apiLatencies { - diskMetric.APILatencies[storageMetric(i).String()] = v.value() - } - for i := range p.apiCalls { - diskMetric.APICalls[storageMetric(i).String()] = atomic.LoadUint64(&p.apiCalls[i]) - } - return diskMetric + p.metricsCache.Once.Do(func() { + p.metricsCache.TTL = 100 * time.Millisecond + p.metricsCache.Update = func() (interface{}, error) { + diskMetric := DiskMetrics{ + APILatencies: make(map[string]uint64, len(p.apiLatencies)), + APICalls: make(map[string]uint64, len(p.apiCalls)), + } + for i, v := range p.apiLatencies { + diskMetric.APILatencies[storageMetric(i).String()] = v.value() + } + for i := range p.apiCalls { + diskMetric.APICalls[storageMetric(i).String()] = atomic.LoadUint64(&p.apiCalls[i]) + } + return diskMetric, nil + } + }) + m, _ := p.metricsCache.Get() + return m.(DiskMetrics) } type lockedLastMinuteLatency struct {