Add sqlite page cache hit and miss statistics (#13665)
* Add sqlite page cache hit/ miss statistics * Proper function definition Co-authored-by: Vladimir Kobal <vlad@prokk.net> * Proper function calls Co-authored-by: Vladimir Kobal <vlad@prokk.net> Co-authored-by: Vladimir Kobal <vlad@prokk.net>
Stelios Fragkakis committed
Sep 14, 2022 at 19:22 UTC
466b1fcc56d3dc4787f332d76db0623f5dad9f91
5 files changed
+56
daemon/global_statistics.c
+40
@@ -38,6 +38,8 @@ static struct global_statistics {
38
volatile uint64_t sqlite3_queries_failed_busy;
39
volatile uint64_t sqlite3_queries_failed_locked;
40
volatile uint64_t sqlite3_rows;
41
+ volatile uint64_t sqlite3_cache_hit;
42
+ volatile uint64_t sqlite3_cache_miss;
43
44
} global_statistics = {
45
.connected_clients = 0,
@@ -134,6 +136,11 @@ static inline void global_statistics_copy(struct global_statistics *gs, uint8_t
136
gs->sqlite3_queries_failed_busy = __atomic_load_n(&global_statistics.sqlite3_queries_failed_busy, __ATOMIC_RELAXED);
137
gs->sqlite3_queries_failed_locked = __atomic_load_n(&global_statistics.sqlite3_queries_failed_locked, __ATOMIC_RELAXED);
138
gs->sqlite3_rows = __atomic_load_n(&global_statistics.sqlite3_rows, __ATOMIC_RELAXED);
139
+
140
+ gs->sqlite3_cache_hit = (uint64_t) sql_context_cache_stats(SQLITE_DBSTATUS_CACHE_HIT);
141
+ gs->sqlite3_cache_hit += (uint64_t) sql_metadata_cache_stats(SQLITE_DBSTATUS_CACHE_HIT);
142
+ gs->sqlite3_cache_miss = (uint64_t) sql_context_cache_stats(SQLITE_DBSTATUS_CACHE_MISS);
143
+ gs->sqlite3_cache_miss += (uint64_t) sql_metadata_cache_stats(SQLITE_DBSTATUS_CACHE_MISS);
144
}
145
146
static void global_statistics_charts(void) {
@@ -581,6 +588,39 @@ static void global_statistics_charts(void) {
588
rrdset_done(st_sqlite3_rows);
589
}
590
591
+ if(gs.sqlite3_cache_hit) {
592
+ static RRDSET *st_sqlite3_cache = NULL;
593
+ static RRDDIM *rd_cache_hit = NULL;
594
+ static RRDDIM *rd_cache_miss= NULL;
595
+
596
+ if (unlikely(!st_sqlite3_cache)) {
597
+ st_sqlite3_cache = rrdset_create_localhost(
598
+ "netdata"
599
+ , "sqlite3_cache"
600
+ , NULL
601
+ , "sqlite3"
602
+ , NULL
603
+ , "Netdata SQLite3 Cache"
604
+ , "ops/s"
605
+ , "netdata"
606
+ , "stats"
607
+ , 131103
608
+ , localhost->rrd_update_every
609
+ , RRDSET_TYPE_LINE
610
+ );
611
+
612
+ rd_cache_hit = rrddim_add(st_sqlite3_cache, "cache_hit", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
613
+ rd_cache_miss = rrddim_add(st_sqlite3_cache, "cache_miss", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
614
+ }
615
+ else
616
+ rrdset_next(st_sqlite3_cache);
617
+
618
+ rrddim_set_by_pointer(st_sqlite3_cache, rd_cache_hit, (collected_number)gs.sqlite3_cache_hit);
619
+ rrddim_set_by_pointer(st_sqlite3_cache, rd_cache_miss, (collected_number)gs.sqlite3_cache_miss);
620
+
621
+ rrdset_done(st_sqlite3_cache);
622
+ }
623
+
624
// ----------------------------------------------------------------
625
}
626
database/sqlite/sqlite_context.c
+7
@@ -444,6 +444,13 @@ skip_delete:
444
return (rc_stored != SQLITE_DONE);
445
}
446
447
+int sql_context_cache_stats(int op)
448
+{
449
+ int count, dummy;
450
+ sqlite3_db_status(db_context_meta, op, &count, &dummy, 0);
451
+ return count;
452
+}
453
+
454
//
455
// TESTING FUNCTIONS
456
//
database/sqlite/sqlite_context.h
+1
@@ -6,6 +6,7 @@
6
#include "daemon/common.h"
7
#include "sqlite3.h"
8
9
+extern int sql_context_cache_stats(int op);
10
typedef struct ctx_chart {
11
uuid_t chart_id;
12
const char *id;
database/sqlite/sqlite_functions.c
+7
@@ -2760,3 +2760,10 @@ int bind_text_null(sqlite3_stmt *res, int position, const char *text, bool can_b
2760
return 1;
2761
return sqlite3_bind_null(res, position);
2762
}
2763
+
2764
+int sql_metadata_cache_stats(int op)
2765
+{
2766
+ int count, dummy;
2767
+ sqlite3_db_status(db_meta, op, &count, &dummy, 0);
2768
+ return count;
2769
+}
database/sqlite/sqlite_functions.h
+1
@@ -121,5 +121,6 @@ void migrate_localhost(uuid_t *host_uuid);
121
extern void sql_store_host_system_info(uuid_t *host_id, const struct rrdhost_system_info *system_info);
122
extern void sql_build_host_system_info(uuid_t *host_id, struct rrdhost_system_info *system_info);
123
void sql_store_host_labels(RRDHOST *host);
124
+extern int sql_metadata_cache_stats(int op);
125
DICTIONARY *sql_load_host_labels(uuid_t *host_id);
126
#endif //NETDATA_SQLITE_FUNCTIONS_H