캐시 적중률 측정
Oracle
SELECT metric_name, ROUND(value, 2) AS pct
FROM v$sysmetric
WHERE metric_name = 'Buffer Cache Hit Ratio'
AND intsize_csec = (SELECT MAX(intsize_csec) FROM v$sysmetric);적중률이 낮다고 항상 나쁜 것은 아니다. 단독으로 보지 말고 워크로드 맥락에서 해석한다.
PostgreSQL
SELECT ROUND(sum(blks_hit) * 100.0 / NULLIF(sum(blks_hit) + sum(blks_read), 0), 2) AS cache_hit_pct
FROM pg_stat_database;일반적으로 99% 이상이 목표다. 낮으면 shared_buffers와 OS 캐시를 검토한다.
MySQL
SELECT ROUND((1 - (
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='Innodb_buffer_pool_read_requests')
)) * 100, 2) AS buffer_pool_hit_pct;reads는 디스크 읽기, read_requests는 전체 읽기다. 낮으면 innodb_buffer_pool_size를 늘린다.
SQL Server
SELECT ROUND(
100.0 * (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name='Buffer cache hit ratio')
/ NULLIF((SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name='Buffer cache hit ratio base'), 0), 2) AS pct;최신 SQL Server에서는 Page Life Expectancy(PLE)가 메모리 압박을 더 의미 있게 보여 주는 지표다.
MongoDB
var c = db.serverStatus().wiredTiger.cache;
({ configuredMB: +(c['maximum bytes configured']/1048576).toFixed(0),
inCacheMB: +(c['bytes currently in the cache']/1048576).toFixed(0),
readIntoCache: c['pages read into cache'],
evictedPages: c['unmodified pages evicted'] })'pages read into cache'와 eviction이 높으면 WiredTiger 캐시가 너무 작다는 뜻이다.
Redis
INFO stats
# keyspace_hits / (keyspace_hits + keyspace_misses) = hit ratio적중률이 지속적으로 낮으면 TTL/eviction 설정이나 접근 패턴을 검토해야 한다.