mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore: increase fileCache hit rate in autobuilds lifecycle (#18507)
`wsbuilder` hits the file cache when running validation. This solution is imperfect, but by first sorting workspaces by their template version id, the cache hit rate should improve.
This commit is contained in:
@@ -71,12 +71,12 @@ func (c *Cache) registerMetrics(registerer prometheus.Registerer) *Cache {
|
||||
Help: "The count of file references currently open in the file cache. Multiple references can be held for the same file.",
|
||||
})
|
||||
|
||||
c.totalOpenFileReferences = f.NewCounter(prometheus.CounterOpts{
|
||||
c.totalOpenFileReferences = f.NewCounterVec(prometheus.CounterOpts{
|
||||
Namespace: "coderd",
|
||||
Subsystem: subsystem,
|
||||
Name: "open_file_refs_total",
|
||||
Help: "The total number of file references ever opened in the file cache.",
|
||||
})
|
||||
Help: "The total number of file references ever opened in the file cache. The 'hit' label indicates if the file was loaded from the cache.",
|
||||
}, []string{"hit"})
|
||||
|
||||
return c
|
||||
}
|
||||
@@ -97,7 +97,7 @@ type Cache struct {
|
||||
|
||||
type cacheMetrics struct {
|
||||
currentOpenFileReferences prometheus.Gauge
|
||||
totalOpenFileReferences prometheus.Counter
|
||||
totalOpenFileReferences *prometheus.CounterVec
|
||||
|
||||
currentOpenFiles prometheus.Gauge
|
||||
totalOpenedFiles prometheus.Counter
|
||||
@@ -173,6 +173,7 @@ func (c *Cache) prepare(ctx context.Context, db database.Store, fileID uuid.UUID
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
||||
hitLabel := "true"
|
||||
entry, ok := c.data[fileID]
|
||||
if !ok {
|
||||
value := lazy.NewWithError(func() (CacheEntryValue, error) {
|
||||
@@ -194,10 +195,11 @@ func (c *Cache) prepare(ctx context.Context, db database.Store, fileID uuid.UUID
|
||||
c.data[fileID] = entry
|
||||
c.currentOpenFiles.Inc()
|
||||
c.totalOpenedFiles.Inc()
|
||||
hitLabel = "false"
|
||||
}
|
||||
|
||||
c.currentOpenFileReferences.Inc()
|
||||
c.totalOpenFileReferences.Inc()
|
||||
c.totalOpenFileReferences.WithLabelValues(hitLabel).Inc()
|
||||
entry.refCount++
|
||||
return entry.value
|
||||
}
|
||||
|
||||
@@ -161,7 +161,9 @@ func TestConcurrency(t *testing.T) {
|
||||
require.Equal(t, batches, promhelp.GaugeValue(t, reg, cachePromMetricName("open_files_current"), nil))
|
||||
require.Equal(t, batches, promhelp.CounterValue(t, reg, cachePromMetricName("open_files_total"), nil))
|
||||
require.Equal(t, batches*batchSize, promhelp.GaugeValue(t, reg, cachePromMetricName("open_file_refs_current"), nil))
|
||||
require.Equal(t, batches*batchSize, promhelp.CounterValue(t, reg, cachePromMetricName("open_file_refs_total"), nil))
|
||||
hit, miss := promhelp.CounterValue(t, reg, cachePromMetricName("open_file_refs_total"), prometheus.Labels{"hit": "false"}),
|
||||
promhelp.CounterValue(t, reg, cachePromMetricName("open_file_refs_total"), prometheus.Labels{"hit": "true"})
|
||||
require.Equal(t, batches*batchSize, hit+miss)
|
||||
}
|
||||
|
||||
func TestRelease(t *testing.T) {
|
||||
@@ -245,7 +247,6 @@ func TestRelease(t *testing.T) {
|
||||
// Total counts remain
|
||||
require.Equal(t, batches*fileSize, promhelp.CounterValue(t, reg, cachePromMetricName("open_files_size_bytes_total"), nil))
|
||||
require.Equal(t, batches, promhelp.CounterValue(t, reg, cachePromMetricName("open_files_total"), nil))
|
||||
require.Equal(t, batches*batchSize, promhelp.CounterValue(t, reg, cachePromMetricName("open_file_refs_total"), nil))
|
||||
}
|
||||
|
||||
func cacheAuthzSetup(t *testing.T) (database.Store, *files.Cache, *coderdtest.RecordingAuthorizer) {
|
||||
|
||||
Reference in New Issue
Block a user