[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