From c6a7288109c2c99b612a3bfa44c89643b89f919e Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Thu, 4 Feb 2021 18:46:20 +0200 Subject: [PATCH] lib/storage: check for prevHourMetricIDs cache before falling back to checking for (date, metricID) entries during data ingestion This should reduce possible CPU usage spikes at the beginning of every hour. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1046 --- lib/storage/storage.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/storage/storage.go b/lib/storage/storage.go index 811b62cd97..b0c5d42650 100644 --- a/lib/storage/storage.go +++ b/lib/storage/storage.go @@ -1659,6 +1659,8 @@ func (s *Storage) updatePerDateData(rows []rawRow) error { prevMetricID uint64 ) hm := s.currHourMetricIDs.Load().(*hourMetricIDs) + hmPrev := s.prevHourMetricIDs.Load().(*hourMetricIDs) + hmPrevDate := hmPrev.hour / 24 nextDayMetricIDs := &s.nextDayMetricIDs.Load().(*byDateMetricIDEntry).v todayShare16bit := uint64((float64(fasttime.UnixTimestamp()%(3600*24)) / (3600 * 24)) * (1 << 16)) type pendingDateMetricID struct { @@ -1708,6 +1710,10 @@ func (s *Storage) updatePerDateData(rows []rawRow) error { } s.pendingHourEntries = append(s.pendingHourEntries, e) s.pendingHourEntriesLock.Unlock() + if date == hmPrevDate && hmPrev.m.Has(metricID) { + // The metricID is already registered for the current day on the previous hour. + continue + } } // Slower path: check global cache for (date, metricID) entry.