[ltt-dev] [UST RFC] ustctl show-stats
Douglas Santos
douglas.santos at polymtl.ca
Thu Sep 9 14:29:06 EDT 2010
new ustctl command to show stats during runtime
ustctl --show-stats PID (returns the number of events and the size)
since I'm touching serialize/fast path it isn't ready for integration.
per cpu/channel can be added also.
comments welcome.
---
include/ust/ustcmd.h | 6 ++++++
libust/serialize.c | 3 +++
libust/tracectl.c | 20 ++++++++++++++++++++
libust/tracer.h | 6 ++++++
libust/type-serializer.c | 3 +++
libustcmd/ustcmd.c | 37 +++++++++++++++++++++++++++++++++++++
ustctl/ustctl.c | 16 ++++++++++++++++
7 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/include/ust/ustcmd.h b/include/ust/ustcmd.h
index 60f5018..bae151e 100644
--- a/include/ust/ustcmd.h
+++ b/include/ust/ustcmd.h
@@ -43,6 +43,11 @@ struct marker_status {
char *fs; /* Format string (end of marker_status array if NULL) */
};
+struct trace_stats {
+ unsigned long events;
+ unsigned long size;
+};
+
extern pid_t *ustcmd_get_online_pids(void);
extern int ustcmd_set_marker_state(const char *, int, pid_t);
extern int ustcmd_set_subbuf_size(const char *, pid_t);
@@ -62,5 +67,6 @@ extern int ustcmd_get_cmsf(struct marker_status **, pid_t);
extern int ustcmd_set_sock_path(const char *, pid_t);
extern int ustcmd_get_sock_path(char **, pid_t);
extern int ustcmd_force_switch(pid_t);
+extern int ustcmd_show_stats(struct trace_stats **, pid_t);
#endif /* _USTCMD_H */
diff --git a/libust/serialize.c b/libust/serialize.c
index bd947ab..fb3ccde 100644
--- a/libust/serialize.c
+++ b/libust/serialize.c
@@ -743,6 +743,9 @@ notrace void ltt_vtrace(const struct marker *mdata, void *probe_data,
/* Out-of-order commit */
ltt_commit_slot(channel, buf, buf_offset, data_size, slot_size);
DBG("just commited event (%s/%s) at offset %ld and size %zd", mdata->channel, mdata->name, buf_offset, slot_size);
+
+ stats.events++;
+ stats.size += slot_size;
}
barrier();
diff --git a/libust/tracectl.c b/libust/tracectl.c
index e64b26f..fd23581 100644
--- a/libust/tracectl.c
+++ b/libust/tracectl.c
@@ -98,6 +98,8 @@ struct blocked_consumer {
struct list_head list;
};
+struct trace_stats stats;
+
static long long make_pidunique(void)
{
s64 retval;
@@ -112,6 +114,11 @@ static long long make_pidunique(void)
return retval;
}
+static void show_stats(FILE *fp)
+{
+ fprintf(fp, "%lu %lu\n", stats.events, stats.size);
+}
+
static void print_markers(FILE *fp)
{
struct marker_iter iter;
@@ -1078,6 +1085,19 @@ int process_client_cmd(char *recvbuf, struct ustcomm_source *src)
else if(nth_token_is(recvbuf, "force_switch", 0) == 1) {
do_cmd_force_switch();
}
+ else if(!strcmp(recvbuf, "show_stats")) {
+ char *ptr;
+ size_t size;
+ FILE *fp;
+
+ fp = open_memstream(&ptr, &size);
+ show_stats(fp);
+ fclose(fp);
+
+ result = ustcomm_send_reply(&ustcomm_app.server, ptr, src);
+
+ free(ptr);
+ }
else {
ERR("unable to parse message: %s", recvbuf);
}
diff --git a/libust/tracer.h b/libust/tracer.h
index c5df6ec..e04ac18 100644
--- a/libust/tracer.h
+++ b/libust/tracer.h
@@ -117,6 +117,12 @@ enum marker_id {
MARKER_ID_DYNAMIC, /* Dynamic IDs (range: 128-65535) */
};
+struct trace_stats {
+ unsigned long events;
+ unsigned long size;
+};
+extern struct trace_stats stats;
+
/* static ids 0-1 reserved for internal use. */
#define MARKER_CORE_IDS 2
static __inline__ enum marker_id marker_id_type(uint16_t id)
diff --git a/libust/type-serializer.c b/libust/type-serializer.c
index bf1c496..df0ef02 100644
--- a/libust/type-serializer.c
+++ b/libust/type-serializer.c
@@ -101,6 +101,9 @@ void _ltt_specialized_trace(const struct marker *mdata, void *probe_data,
}
/* Out-of-order commit */
ltt_commit_slot(chan, buf, buf_offset, data_size, slot_size);
+
+ stats.events++;
+ stats.size += slot_size;
}
/*
* asm volatile and "memory" clobber prevent the compiler from moving
diff --git a/libustcmd/ustcmd.c b/libustcmd/ustcmd.c
index f0a6ae0..c9dbf7c 100644
--- a/libustcmd/ustcmd.c
+++ b/libustcmd/ustcmd.c
@@ -507,6 +507,43 @@ int ustcmd_force_switch(pid_t pid)
}
/**
+ * Show stats for a given PID.
+ *
+ * @param stats Pointer to stats array to be filled
+ * @param pid Targeted PID
+ * @return 0 if successful, or -1 on error
+ */
+int ustcmd_show_stats(struct trace_stats **stat, const pid_t pid)
+{
+ char *big_str = NULL;
+ int result;
+ struct trace_stats *tmp_stats = NULL;
+ unsigned int i = 0, ind = 0;
+
+ if (stat == NULL) {
+ return -1;
+ }
+
+ result = ustcmd_send_cmd("show_stats", pid, &big_str);
+ if (result != 1) {
+ return -1;
+ }
+
+ tmp_stats = (struct trace_stats *) zmalloc(sizeof(struct trace_stats) *
+ (ustcmd_count_nl(big_str) + 1));
+ if (tmp_stats == NULL) {
+ return -1;
+ }
+
+ sscanf(big_str, "%lu %lu", &tmp_stats->events, &tmp_stats->size);
+ *stat = tmp_stats;
+
+ free(big_str);
+ return 0;
+
+}
+
+/**
* Sends a given command to a traceable process
*
* @param cmd Null-terminated command to send
diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c
index d290975..bea6405 100644
--- a/ustctl/ustctl.c
+++ b/ustctl/ustctl.c
@@ -42,6 +42,7 @@ enum command {
GET_SOCK_PATH,
SET_SOCK_PATH,
FORCE_SWITCH,
+ SHOW_STATS,
UNKNOWN
};
@@ -74,6 +75,7 @@ Commands:\n\
--disable-marker \"CHANNEL/MARKER\"\tDisable a marker\n\
--list-markers\t\t\tList the markers of the process, their\n\t\t\t\t\t state and format string\n\
--force-switch\t\t\tForce a subbuffer switch\n\
+ --show-stats\t\t\tShow trace stats\n\
\
");
}
@@ -105,6 +107,7 @@ int parse_opts_long(int argc, char **argv, struct ust_opts *opts)
{ "get-sock-path", 0, 0, GET_SOCK_PATH },
{ "set-sock-path", 1, 0, SET_SOCK_PATH },
{ "force-switch", 0, 0, FORCE_SWITCH },
+ { "show-stats", 0, 0, SHOW_STATS},
{ 0, 0, 0, 0 }
};
@@ -215,6 +218,7 @@ int main(int argc, char *argv[])
pidit = opts.pids;
struct marker_status *cmsf = NULL;
+ struct trace_stats *stat = NULL;
while(*pidit != -1) {
switch (opts.cmd) {
@@ -341,6 +345,18 @@ int main(int argc, char *argv[])
}
break;
+ case SHOW_STATS:
+ result = ustcmd_show_stats(&stat, *pidit);
+ if (result) {
+ fprintf(stderr,
+ "error while trying to show stats for"
+ " PID %u\n", (unsigned int) *pidit);
+ break;
+ }
+
+ printf("events=%lu size=%lu\n", stat->events, stat->size);
+ break;
+
default:
ERR("unknown command\n");
break;
--
1.7.0.4
More information about the lttng-dev
mailing list