libsysprof: add some memory counters

We will probably add a bunch more here too.
This commit is contained in:
Christian Hergert
2023-08-07 18:02:05 -07:00
parent dac36ed851
commit a1211ec298

View File

@ -47,17 +47,39 @@ struct _SysprofMemoryUsageClass
SysprofInstrumentClass parent_class; SysprofInstrumentClass parent_class;
}; };
static const char *counter_names[] = {
"Used",
"Total",
"Available",
"Free",
"Buffers",
"Cached",
"Swap Cached",
"Mapped",
"Shmem",
"Swap Total",
"Swap Free",
};
typedef struct _MemStat typedef struct _MemStat
{ {
int stat_fd; int stat_fd;
union { union {
struct { struct {
SysprofCaptureCounterValue used; gint64 used;
gint64 total; gint64 total;
gint64 avail; gint64 avail;
gint64 free; gint64 free;
gint64 buffers;
gint64 cached;
gint64 swap_cached;
gint64 mapped;
gint64 shmem;
gint64 swap_total;
gint64 swap_free;
} sys; } sys;
SysprofCaptureCounterValue values[11];
}; };
} MemStat; } MemStat;
@ -107,7 +129,7 @@ mem_stat_parse (MemStat *st,
for (;;) for (;;)
{ {
goffset off; gssize off;
char *key; char *key;
char *value; char *value;
char *unit; char *unit;
@ -123,8 +145,8 @@ mem_stat_parse (MemStat *st,
/* Offset from self to save value. Stop after getting to /* Offset from self to save value. Stop after getting to
* last value we care about. * last value we care about.
*/ */
if (!(off = GPOINTER_TO_UINT (g_hash_table_lookup (keys, key)))) if (!g_hash_table_lookup_extended (keys, key, NULL, (gpointer *)&off))
break; off = -1;
/* Get the data value */ /* Get the data value */
if (!(value = strtok_r (bufptr, " \n\t:", &save))) if (!(value = strtok_r (bufptr, " \n\t:", &save)))
@ -139,17 +161,21 @@ mem_stat_parse (MemStat *st,
unit = strtok_r (bufptr, " \n\t:", &save); unit = strtok_r (bufptr, " \n\t:", &save);
if (g_strcmp0 (unit, "kB") == 0) if (g_strcmp0 (unit, "kB") == 0)
v64 *= 1024; v64 *= 1024L;
else if (g_strcmp0 (unit, "mB") == 0) else if (g_strcmp0 (unit, "mB") == 0)
v64 *= 1024 * 1024; v64 *= 1024L * 1024L;
else if (g_strcmp0 (unit, "gB") == 0)
v64 *= 1024L * 1024L * 1024L;
v64ptr = (gint64 *)(gpointer)(((gchar *)st) + off); if (off >= 0)
{
*v64ptr = v64; v64ptr = (gint64 *)(gpointer)(((gchar *)st) + off);
*v64ptr = v64;
}
} }
/* Create pre-compiled value for used to simplify display */ /* Create pre-compiled value for used to simplify display */
st->sys.used.vdbl = (gdouble)st->sys.total - (gdouble)st->sys.avail; st->sys.used = (gdouble)st->sys.total - (gdouble)st->sys.avail;
} }
typedef struct _Record typedef struct _Record
@ -175,9 +201,11 @@ sysprof_memory_usage_record_fiber (gpointer user_data)
Record *record = user_data; Record *record = user_data;
SysprofCaptureWriter *writer; SysprofCaptureWriter *writer;
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
SysprofCaptureCounter counters[1]; SysprofCaptureCounter counters[11];
MemStat st; MemStat st;
guint counter_id; guint counter_base;
g_autofree guint *counter_ids = g_new0 (guint, 11);
g_autofree SysprofCaptureCounterValue *values = g_new0 (SysprofCaptureCounterValue, 11);
g_assert (record != NULL); g_assert (record != NULL);
g_assert (SYSPROF_IS_RECORDING (record->recording)); g_assert (SYSPROF_IS_RECORDING (record->recording));
@ -191,22 +219,27 @@ sysprof_memory_usage_record_fiber (gpointer user_data)
if (!mem_stat_open (&st, &error)) if (!mem_stat_open (&st, &error))
return dex_future_new_for_error (g_steal_pointer (&error)); return dex_future_new_for_error (g_steal_pointer (&error));
counter_id = sysprof_capture_writer_request_counter (writer, 1); counter_base = sysprof_capture_writer_request_counter (writer, 11);
g_strlcpy (counters[0].category, "Memory", sizeof counters[0].category); for (guint i = 0; i < 11; i++)
g_strlcpy (counters[0].name, "Used", sizeof counters[0].name); {
g_strlcpy (counters[0].description, "Memory used by system", sizeof counters[0].description); g_strlcpy (counters[i].category, "Memory", sizeof counters[i].category);
g_strlcpy (counters[i].name, counter_names[i], sizeof counters[i].name);
counters[0].id = counter_id; g_strlcpy (counters[i].description, "", sizeof counters[0].description);
counters[0].type = SYSPROF_CAPTURE_COUNTER_DOUBLE; counters[i].id = counter_base + i;
counters[0].value.vdbl = 0; counters[i].type = SYSPROF_CAPTURE_COUNTER_INT64;
counters[i].value.v64 = 0;
}
sysprof_capture_writer_define_counters (writer, sysprof_capture_writer_define_counters (writer,
SYSPROF_CAPTURE_CURRENT_TIME, SYSPROF_CAPTURE_CURRENT_TIME,
-1, -1,
-1, -1,
counters, counters,
1); 11);
for (guint i = 0; i < 11; i++)
counter_ids[i] = counter_base + i;
for (;;) for (;;)
{ {
@ -235,9 +268,9 @@ sysprof_memory_usage_record_fiber (gpointer user_data)
SYSPROF_CAPTURE_CURRENT_TIME, SYSPROF_CAPTURE_CURRENT_TIME,
-1, -1,
-1, -1,
&counter_id, counter_ids,
&st.sys.used, st.values,
1); 11);
} }
dex_await (dex_future_first (dex_ref (record->cancellable), dex_await (dex_future_first (dex_ref (record->cancellable),
@ -290,6 +323,13 @@ sysprof_memory_usage_class_init (SysprofMemoryUsageClass *klass)
ADD_OFFSET ("MemTotal", G_STRUCT_OFFSET (MemStat, sys.total)); ADD_OFFSET ("MemTotal", G_STRUCT_OFFSET (MemStat, sys.total));
ADD_OFFSET ("MemFree", G_STRUCT_OFFSET (MemStat, sys.free)); ADD_OFFSET ("MemFree", G_STRUCT_OFFSET (MemStat, sys.free));
ADD_OFFSET ("MemAvailable", G_STRUCT_OFFSET (MemStat, sys.avail)); ADD_OFFSET ("MemAvailable", G_STRUCT_OFFSET (MemStat, sys.avail));
ADD_OFFSET ("Buffers", G_STRUCT_OFFSET (MemStat, sys.buffers));
ADD_OFFSET ("Cached", G_STRUCT_OFFSET (MemStat, sys.cached));
ADD_OFFSET ("SwapCached", G_STRUCT_OFFSET (MemStat, sys.swap_cached));
ADD_OFFSET ("Mapped", G_STRUCT_OFFSET (MemStat, sys.mapped));
ADD_OFFSET ("Shmem", G_STRUCT_OFFSET (MemStat, sys.shmem));
ADD_OFFSET ("SwapTotal", G_STRUCT_OFFSET (MemStat, sys.swap_total));
ADD_OFFSET ("SwapFree", G_STRUCT_OFFSET (MemStat, sys.swap_free));
#undef ADD_OFFSET #undef ADD_OFFSET
} }