# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1260355571 0
# Node ID 9e9746e635f9ec1ef1a3e0cbb425e89112f8e63b
# Parent 18342df0f9dcf3a0a5a7ce05ea0218cf94335157
tmem, xentop: Report a few key per-domain tmem statistics in xentop.
Signed-off-by: Dan Magenheimer <dan.magenheimer@xxxxxxxxxx>
---
tools/xenstat/libxenstat/src/xenstat.c | 62 ++++++++++++++++++++++++++++
tools/xenstat/libxenstat/src/xenstat.h | 12 +++++
tools/xenstat/libxenstat/src/xenstat_priv.h | 8 +++
tools/xenstat/xentop/xentop.c | 31 ++++++++++++++
4 files changed, 113 insertions(+)
diff -r 18342df0f9dc -r 9e9746e635f9 tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c Wed Dec 09 10:44:56 2009 +0000
+++ b/tools/xenstat/libxenstat/src/xenstat.c Wed Dec 09 10:46:11 2009 +0000
@@ -129,6 +129,32 @@ void xenstat_uninit(xenstat_handle * han
free(handle->priv);
free(handle);
}
+}
+
+static inline unsigned long long parse(char *s, char *match)
+{
+ char *s1 = strstr(s,match);
+ unsigned long long ret;
+
+ if ( s1 == NULL )
+ return 0LL;
+ s1 += 2;
+ if ( *s1++ != ':' )
+ return 0LL;
+ sscanf(s1,"%llu",&ret);
+ return ret;
+}
+
+void domain_get_tmem_stats(xenstat_handle * handle, xenstat_domain * domain)
+{
+ char buffer[4096];
+
+ xc_tmem_control(handle->xc_handle,-1,TMEMC_LIST,domain->id,
+ sizeof(buffer),-1,-1,buffer);
+ domain->tmem_stats.curr_eph_pages = parse(buffer,"Ec");
+ domain->tmem_stats.succ_eph_gets = parse(buffer,"Ge");
+ domain->tmem_stats.succ_pers_puts = parse(buffer,"Pp");
+ domain->tmem_stats.succ_pers_gets = parse(buffer,"Gp");
}
xenstat_node *xenstat_get_node(xenstat_handle * handle, unsigned int flags)
@@ -232,11 +258,13 @@ xenstat_node *xenstat_get_node(xenstat_h
domain->networks = NULL;
domain->num_vbds = 0;
domain->vbds = NULL;
+ domain_get_tmem_stats(handle,domain);
domain++;
node->num_domains++;
}
} while (new_domains == DOMAIN_CHUNK_SIZE);
+
/* Run all the extra data collectors requested */
node->flags = 0;
@@ -674,6 +702,40 @@ unsigned long long xenstat_vbd_wr_sects(
return vbd->wr_sects;
}
+/*
+ * Tmem functions
+ */
+
+xenstat_tmem *xenstat_domain_tmem(xenstat_domain * domain)
+{
+ return &domain->tmem_stats;
+}
+
+/* Get the current number of ephemeral pages */
+unsigned long long xenstat_tmem_curr_eph_pages(xenstat_tmem *tmem)
+{
+ return tmem->curr_eph_pages;
+}
+
+/* Get the number of successful ephemeral gets */
+unsigned long long xenstat_tmem_succ_eph_gets(xenstat_tmem *tmem)
+{
+ return tmem->succ_eph_gets;
+}
+
+/* Get the number of successful persistent puts */
+unsigned long long xenstat_tmem_succ_pers_puts(xenstat_tmem *tmem)
+{
+ return tmem->succ_pers_puts;
+}
+
+/* Get the number of successful persistent gets */
+unsigned long long xenstat_tmem_succ_pers_gets(xenstat_tmem *tmem)
+{
+ return tmem->succ_pers_gets;
+}
+
+
static char *xenstat_get_domain_name(xenstat_handle *handle, unsigned int
domain_id)
{
char path[80], *vmpath;
diff -r 18342df0f9dc -r 9e9746e635f9 tools/xenstat/libxenstat/src/xenstat.h
--- a/tools/xenstat/libxenstat/src/xenstat.h Wed Dec 09 10:44:56 2009 +0000
+++ b/tools/xenstat/libxenstat/src/xenstat.h Wed Dec 09 10:46:11 2009 +0000
@@ -27,6 +27,7 @@ typedef struct xenstat_vcpu xenstat_vcpu
typedef struct xenstat_vcpu xenstat_vcpu;
typedef struct xenstat_network xenstat_network;
typedef struct xenstat_vbd xenstat_vbd;
+typedef struct xenstat_tmem xenstat_tmem;
/* Initialize the xenstat library. Returns a handle to be used with
* subsequent calls to the xenstat library, or NULL if an error occurs. */
@@ -132,6 +133,9 @@ xenstat_vbd *xenstat_domain_vbd(xenstat_
xenstat_vbd *xenstat_domain_vbd(xenstat_domain * domain,
unsigned int vbd);
+/* Get the tmem information for a given domain */
+xenstat_tmem *xenstat_domain_tmem(xenstat_domain * domain);
+
/*
* VCPU functions - extract information from a xenstat_vcpu
*/
@@ -189,4 +193,12 @@ unsigned long long xenstat_vbd_rd_sects(
unsigned long long xenstat_vbd_rd_sects(xenstat_vbd * vbd);
unsigned long long xenstat_vbd_wr_sects(xenstat_vbd * vbd);
+/*
+ * Tmem functions - extract tmem information
+ */
+unsigned long long xenstat_tmem_curr_eph_pages(xenstat_tmem *tmem);
+unsigned long long xenstat_tmem_succ_eph_gets(xenstat_tmem *tmem);
+unsigned long long xenstat_tmem_succ_pers_puts(xenstat_tmem *tmem);
+unsigned long long xenstat_tmem_succ_pers_gets(xenstat_tmem *tmem);
+
#endif /* XENSTAT_H */
diff -r 18342df0f9dc -r 9e9746e635f9 tools/xenstat/libxenstat/src/xenstat_priv.h
--- a/tools/xenstat/libxenstat/src/xenstat_priv.h Wed Dec 09 10:44:56
2009 +0000
+++ b/tools/xenstat/libxenstat/src/xenstat_priv.h Wed Dec 09 10:46:11
2009 +0000
@@ -52,6 +52,13 @@ struct xenstat_node {
long freeable_mb;
};
+struct xenstat_tmem {
+ unsigned long long curr_eph_pages;
+ unsigned long long succ_eph_gets;
+ unsigned long long succ_pers_puts;
+ unsigned long long succ_pers_gets;
+};
+
struct xenstat_domain {
unsigned int id;
char *name;
@@ -66,6 +73,7 @@ struct xenstat_domain {
xenstat_network *networks; /* Array of length num_networks */
unsigned int num_vbds;
xenstat_vbd *vbds;
+ xenstat_tmem tmem_stats;
};
struct xenstat_vcpu {
diff -r 18342df0f9dc -r 9e9746e635f9 tools/xenstat/xentop/xentop.c
--- a/tools/xenstat/xentop/xentop.c Wed Dec 09 10:44:56 2009 +0000
+++ b/tools/xenstat/xentop/xentop.c Wed Dec 09 10:46:11 2009 +0000
@@ -202,6 +202,7 @@ int show_vcpus = 0;
int show_vcpus = 0;
int show_networks = 0;
int show_vbds = 0;
+int show_tmem = 0;
int repeat_header = 0;
int show_full_name = 0;
#define PROMPT_VAL_LEN 80
@@ -354,6 +355,9 @@ static int handle_key(int ch)
case 'b': case 'B':
show_vbds ^= 1;
break;
+ case 't': case 'T':
+ show_tmem ^= 1;
+ break;
case 'r': case 'R':
repeat_header ^= 1;
break;
@@ -889,6 +893,11 @@ void do_bottom_line(void)
attr_addstr(show_vbds ? COLOR_PAIR(1) : 0, "ds");
addstr(" ");
+ /* tmem */
+ addch(A_REVERSE | 'T');
+ attr_addstr(show_tmem ? COLOR_PAIR(1) : 0, "mem");
+ addstr(" ");
+
/* vcpus */
addch(A_REVERSE | 'V');
@@ -1018,6 +1027,23 @@ void do_vbd(xenstat_domain *domain)
}
}
+/* Output all tmem information */
+void do_tmem(xenstat_domain *domain)
+{
+ xenstat_tmem *tmem = xenstat_domain_tmem(domain);
+ unsigned long long curr_eph_pages = xenstat_tmem_curr_eph_pages(tmem);
+ unsigned long long succ_eph_gets = xenstat_tmem_succ_eph_gets(tmem);
+ unsigned long long succ_pers_puts = xenstat_tmem_succ_pers_puts(tmem);
+ unsigned long long succ_pers_gets = xenstat_tmem_succ_pers_gets(tmem);
+
+ if (curr_eph_pages | succ_eph_gets | succ_pers_puts | succ_pers_gets)
+ print("Tmem: Curr eph pages: %8llu Succ eph gets: %8llu "
+ "Succ pers puts: %8llu Succ pers gets: %8llu\n",
+ curr_eph_pages, succ_eph_gets,
+ succ_pers_puts, succ_pers_gets);
+
+}
+
static void top(void)
{
xenstat_domain **domains;
@@ -1064,6 +1090,8 @@ static void top(void)
do_network(domains[i]);
if (show_vbds)
do_vbd(domains[i]);
+ if (show_tmem)
+ do_tmem(domains[i]);
}
if (!batch)
@@ -1138,6 +1166,9 @@ int main(int argc, char **argv)
break;
case 'f':
show_full_name = 1;
+ break;
+ case 't':
+ show_tmem = 1;
break;
}
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|