Re: add protection metrics of zoneinfo
"Wu, Liming" <[email protected]> Thu, 09 Feb 2017 00:10:50 -0800
| Newsgroups | gmane.comp.sysutils.pcp |
|---|---|
| Message-ID | <[email protected]> |
Nathan, suggestion is appreciated. I modify the code. It's best if you can help me to review it. Thanks. --- LiMing
additional_protection_metric_of_zoneinfo.patch
(application/octet-stream, 6.9 KB)
From 2cd725dc22005c40cf098d089d187e2d2238e666 Mon Sep 17 00:00:00 2001 From: Liming <[email protected]> Date: Thu, 9 Feb 2017 14:43:23 +0800 Subject: [PATCH] additional protection metric of zoneinfo Different hardware platforms have different protection array elements, so the way of 'instance domain' is used to store elements of protection. Nathan's suggestion is appreciated. --- src/pmdas/linux/help | 1 + src/pmdas/linux/linux.h | 2 ++ src/pmdas/linux/pmda.c | 29 +++++++++++++++++++++++++++-- src/pmdas/linux/proc_zoneinfo.c | 22 ++++++++++++++++++++-- src/pmdas/linux/proc_zoneinfo.h | 3 ++- src/pmdas/linux/root_linux | 1 + 6 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/pmdas/linux/help b/src/pmdas/linux/help index be2c30d..de42ab0 100644 --- a/src/pmdas/linux/help +++ b/src/pmdas/linux/help @@ -974,6 +974,7 @@ table entry. @ mem.zoneinfo.spanned spanned space in each zone for each NUMA node @ mem.zoneinfo.present present space in each zone for each NUMA node @ mem.zoneinfo.managed managed space in each zone for each NUMA node +@ mem.zoneinfo.protection protection space in each zone for each NUMA node @ mem.ksm.full_scans Number of times that KSM has scanned for duplicated content @ mem.ksm.merge_across_nodes Kernel allows merging across NUMA nodes @ mem.ksm.pages_shared The number of nodes in the stable tree diff --git a/src/pmdas/linux/linux.h b/src/pmdas/linux/linux.h index 2869ce0..fc2ade9 100644 --- a/src/pmdas/linux/linux.h +++ b/src/pmdas/linux/linux.h @@ -92,6 +92,7 @@ enum { CLUSTER_BUDDYINFO, /* 67 /proc/buddyinfo */ CLUSTER_ZONEINFO, /* 68 /proc/zoneinfo */ CLUSTER_KSM_INFO, /* 69 /sys/kernel/mm/ksm */ + CLUSTER_ZONEINFO_PROTECTION, /* 70 /proc/zoneinfo protection item */ NUM_CLUSTERS /* one more than highest numbered cluster */ }; @@ -150,6 +151,7 @@ enum { IPC_SEM_INDOM, /* 30 - ipc sem_stat msgid */ BUDDYINFO_INDOM, /* 31 - kernel buddys */ ZONEINFO_INDOM, /* 32 - proc zoneinfo */ + ZONEINFO_PROTECTION_INDOM, /* 33 - proc zoneinfo protection item */ NUM_INDOMS /* one more than highest numbered cluster */ }; diff --git a/src/pmdas/linux/pmda.c b/src/pmdas/linux/pmda.c index 419d617..11a71ae 100644 --- a/src/pmdas/linux/pmda.c +++ b/src/pmdas/linux/pmda.c @@ -331,6 +331,7 @@ static pmdaIndom indomtab[] = { { IPC_SEM_INDOM, 0, NULL }, { BUDDYINFO_INDOM, 0, NULL }, { ZONEINFO_INDOM, 0, NULL }, + { ZONEINFO_PROTECTION_INDOM, 0, NULL }, }; @@ -3620,6 +3621,11 @@ static pmdaMetric metrictab[] = { { PMDA_PMID(CLUSTER_ZONEINFO,7), PM_TYPE_U64, ZONEINFO_INDOM, PM_SEM_INSTANT, PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0) }, }, +/* mem.zoneinfo.protection */ + { NULL, + { PMDA_PMID(CLUSTER_ZONEINFO_PROTECTION,0), PM_TYPE_U64, ZONEINFO_PROTECTION_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0) }, }, + /* * /proc/cpuinfo cluster (cpu indom) */ @@ -5207,8 +5213,10 @@ linux_refresh(pmdaExt *pmda, int *need_refresh, int context) if (need_refresh[CLUSTER_BUDDYINFO]) refresh_proc_buddyinfo(&proc_buddyinfo); - if (need_refresh[CLUSTER_ZONEINFO]) - refresh_proc_zoneinfo(INDOM(ZONEINFO_INDOM)); + if (need_refresh[CLUSTER_ZONEINFO] || + need_refresh[CLUSTER_ZONEINFO_PROTECTION]) + refresh_proc_zoneinfo(INDOM(ZONEINFO_INDOM), + INDOM(ZONEINFO_PROTECTION_INDOM)); if (need_refresh[CLUSTER_KSM_INFO]) refresh_ksm_info(&ksm_info); @@ -5291,6 +5299,9 @@ linux_instance(pmInDom indom, int inst, char *name, __pmInResult **result, pmdaE case ZONEINFO_INDOM: need_refresh[CLUSTER_ZONEINFO]++; break; + case ZONEINFO_PROTECTION_INDOM: + need_refresh[CLUSTER_ZONEINFO_PROTECTION]++; + break; /* no default label : pmdaInstance will pick up errors */ } @@ -6602,6 +6613,20 @@ linux_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom) /* * Cluster added by Wu Liming <[email protected]> */ + case CLUSTER_ZONEINFO_PROTECTION: { + unsigned long long *value; + sts = pmdaCacheLookup(INDOM(ZONEINFO_PROTECTION_INDOM), inst, NULL, (void **)&value); + if (sts < 0) + return sts; + if (sts == PMDA_CACHE_INACTIVE) + return PM_ERR_INST; + switch (idp->item) { + case 0: /* mem.zoneinfo.protection */ + atom->ull = (__uint64_t)value; + } + break; + } + case CLUSTER_ZONEINFO: { zoneinfo_entry_t *info; diff --git a/src/pmdas/linux/proc_zoneinfo.c b/src/pmdas/linux/proc_zoneinfo.c index dc4e01f..d3a65d0 100644 --- a/src/pmdas/linux/proc_zoneinfo.c +++ b/src/pmdas/linux/proc_zoneinfo.c @@ -17,7 +17,7 @@ #include "proc_zoneinfo.h" int -refresh_proc_zoneinfo(pmInDom indom) +refresh_proc_zoneinfo(pmInDom indom, pmInDom zoneinfo_protection_indom) { int node, values; zoneinfo_entry_t *info; @@ -54,7 +54,7 @@ refresh_proc_zoneinfo(pmInDom indom) changed = 1; } /* inner loop to extract all values for this node */ - while (values < ZONE_VALUES && fgets(buf, sizeof(buf), fp) != NULL) { + while (values < ZONE_VALUES + 1 && fgets(buf, sizeof(buf), fp) != NULL) { if ((sscanf(buf, " pages free %llu", &value)) == 1) { info->values[ZONE_FREE] = (value << _pm_pageshift) / 1024; values++; @@ -96,6 +96,24 @@ refresh_proc_zoneinfo(pmInDom indom) values++; continue; } + else if (strncmp(buf, " protection: (", 20) == 0) { + char protected_name[64]; + char *endp, *bp = buf + 20 + 1; + unsigned long long value = 0; + int index = 0; + + for (index = 0;; index++) { + value = (strtoul(bp, &endp, 10) << _pm_pageshift) / 1024; + sprintf(protected_name, "%s::lowmem_reserved%d", + instname, index); + pmdaCacheStore(zoneinfo_protection_indom, PMDA_CACHE_ADD, + protected_name, (void *)value); + if (*endp != ',') + break; + bp = endp + 2; /* skip comma and space, then continue */ + } + values++; + } } pmdaCacheStore(indom, PMDA_CACHE_ADD, instname, (void *)info); diff --git a/src/pmdas/linux/proc_zoneinfo.h b/src/pmdas/linux/proc_zoneinfo.h index a39c4e0..88c35a2 100644 --- a/src/pmdas/linux/proc_zoneinfo.h +++ b/src/pmdas/linux/proc_zoneinfo.h @@ -32,4 +32,5 @@ typedef struct { __uint64_t values[ZONE_VALUES]; } zoneinfo_entry_t; -extern int refresh_proc_zoneinfo(pmInDom indom); +extern int refresh_proc_zoneinfo(pmInDom indom, + pmInDom zoneinfo_protection_indom); diff --git a/src/pmdas/linux/root_linux b/src/pmdas/linux/root_linux index a2a0462..0bcff26 100644 --- a/src/pmdas/linux/root_linux +++ b/src/pmdas/linux/root_linux @@ -519,6 +519,7 @@ mem.zoneinfo { spanned 60:68:5 present 60:68:6 managed 60:68:7 + protection 60:70:0 } swap { -- 1.8.3.1
regression_testing_for_protection_metric.patch
(application/octet-stream, 7.6 KB)
From 9c8a86a75bbf47360743ca7b72772e3358e6b60c Mon Sep 17 00:00:00 2001 From: Liming <[email protected]> Date: Thu, 9 Feb 2017 15:43:51 +0800 Subject: [PATCH] regression testing for protection metric --- qa/821 | 2 +- qa/821.out | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/qa/821 b/qa/821 index 4faca78..ccb37d4 100755 --- a/qa/821 +++ b/qa/821 @@ -15,7 +15,7 @@ echo "QA output created by $seq" [ $PCP_PLATFORM = linux ] || _notrun "Linux-specific memory metric testing" userid=`id -u` # test exercises procfs access from both root and non-root -[ "$userid" != 0 ] || _notrun "Test cannot be run as privileged root user" +#[ "$userid" != 0 ] || _notrun "Test cannot be run as privileged root user" config="$PCP_PMDAS_DIR/linux/bandwidth.conf" diff --git a/qa/821.out b/qa/821.out index 7d7abec..1311b9f 100644 --- a/qa/821.out +++ b/qa/821.out @@ -863,6 +863,20 @@ mem.zoneinfo.present inst [N or "DMA::node0"] value 15984 inst [N or "Normal::node0"] value 14653440 +mem.zoneinfo.protection + inst [N or "DMA32::node0::lowmem_reserved0"] value 0 + inst [N or "DMA32::node0::lowmem_reserved1"] value 0 + inst [N or "DMA32::node0::lowmem_reserved2"] value 56164 + inst [N or "DMA32::node0::lowmem_reserved3"] value 56164 + inst [N or "DMA::node0::lowmem_reserved0"] value 0 + inst [N or "DMA::node0::lowmem_reserved1"] value 6336 + inst [N or "DMA::node0::lowmem_reserved2"] value 62500 + inst [N or "DMA::node0::lowmem_reserved3"] value 62500 + inst [N or "Normal::node0::lowmem_reserved0"] value 0 + inst [N or "Normal::node0::lowmem_reserved1"] value 0 + inst [N or "Normal::node0::lowmem_reserved2"] value 0 + inst [N or "Normal::node0::lowmem_reserved3"] value 0 + mem.zoneinfo.scanned inst [N or "DMA32::node0"] value 0 inst [N or "DMA::node0"] value 0 @@ -1954,6 +1968,20 @@ mem.zoneinfo.present inst [N or "DMA::node0"] value 15984 inst [N or "Normal::node0"] value 14653440 +mem.zoneinfo.protection + inst [N or "DMA32::node0::lowmem_reserved0"] value 0 + inst [N or "DMA32::node0::lowmem_reserved1"] value 0 + inst [N or "DMA32::node0::lowmem_reserved2"] value 56164 + inst [N or "DMA32::node0::lowmem_reserved3"] value 56164 + inst [N or "DMA::node0::lowmem_reserved0"] value 0 + inst [N or "DMA::node0::lowmem_reserved1"] value 6336 + inst [N or "DMA::node0::lowmem_reserved2"] value 62500 + inst [N or "DMA::node0::lowmem_reserved3"] value 62500 + inst [N or "Normal::node0::lowmem_reserved0"] value 0 + inst [N or "Normal::node0::lowmem_reserved1"] value 0 + inst [N or "Normal::node0::lowmem_reserved2"] value 0 + inst [N or "Normal::node0::lowmem_reserved3"] value 0 + mem.zoneinfo.scanned inst [N or "DMA32::node0"] value 0 inst [N or "DMA::node0"] value 0 @@ -2809,6 +2837,24 @@ mem.zoneinfo.present inst [N or "Normal::node0"] value 65011712 inst [N or "Normal::node1"] value 67108864 +mem.zoneinfo.protection + inst [N or "DMA32::node0::lowmem_reserved0"] value 0 + inst [N or "DMA32::node0::lowmem_reserved1"] value 0 + inst [N or "DMA32::node0::lowmem_reserved2"] value 249844 + inst [N or "DMA32::node0::lowmem_reserved3"] value 249844 + inst [N or "DMA::node0::lowmem_reserved0"] value 0 + inst [N or "DMA::node0::lowmem_reserved1"] value 7016 + inst [N or "DMA::node0::lowmem_reserved2"] value 256864 + inst [N or "DMA::node0::lowmem_reserved3"] value 256864 + inst [N or "Normal::node0::lowmem_reserved0"] value 0 + inst [N or "Normal::node0::lowmem_reserved1"] value 0 + inst [N or "Normal::node0::lowmem_reserved2"] value 0 + inst [N or "Normal::node0::lowmem_reserved3"] value 0 + inst [N or "Normal::node1::lowmem_reserved0"] value 0 + inst [N or "Normal::node1::lowmem_reserved1"] value 0 + inst [N or "Normal::node1::lowmem_reserved2"] value 0 + inst [N or "Normal::node1::lowmem_reserved3"] value 0 + mem.zoneinfo.scanned inst [N or "DMA32::node0"] value 0 inst [N or "DMA::node0"] value 0 @@ -3795,6 +3841,24 @@ mem.zoneinfo.present inst [N or "Normal::node0"] value 65011712 inst [N or "Normal::node1"] value 67108864 +mem.zoneinfo.protection + inst [N or "DMA32::node0::lowmem_reserved0"] value 0 + inst [N or "DMA32::node0::lowmem_reserved1"] value 0 + inst [N or "DMA32::node0::lowmem_reserved2"] value 249844 + inst [N or "DMA32::node0::lowmem_reserved3"] value 249844 + inst [N or "DMA::node0::lowmem_reserved0"] value 0 + inst [N or "DMA::node0::lowmem_reserved1"] value 7016 + inst [N or "DMA::node0::lowmem_reserved2"] value 256864 + inst [N or "DMA::node0::lowmem_reserved3"] value 256864 + inst [N or "Normal::node0::lowmem_reserved0"] value 0 + inst [N or "Normal::node0::lowmem_reserved1"] value 0 + inst [N or "Normal::node0::lowmem_reserved2"] value 0 + inst [N or "Normal::node0::lowmem_reserved3"] value 0 + inst [N or "Normal::node1::lowmem_reserved0"] value 0 + inst [N or "Normal::node1::lowmem_reserved1"] value 0 + inst [N or "Normal::node1::lowmem_reserved2"] value 0 + inst [N or "Normal::node1::lowmem_reserved3"] value 0 + mem.zoneinfo.scanned inst [N or "DMA32::node0"] value 0 inst [N or "DMA::node0"] value 0 @@ -4652,6 +4716,24 @@ mem.zoneinfo.present inst [N or "Normal::node0"] value 65011712 inst [N or "Normal::node1"] value 67108864 +mem.zoneinfo.protection + inst [N or "DMA32::node0::lowmem_reserved0"] value 0 + inst [N or "DMA32::node0::lowmem_reserved1"] value 0 + inst [N or "DMA32::node0::lowmem_reserved2"] value 249844 + inst [N or "DMA32::node0::lowmem_reserved3"] value 249844 + inst [N or "DMA::node0::lowmem_reserved0"] value 0 + inst [N or "DMA::node0::lowmem_reserved1"] value 7016 + inst [N or "DMA::node0::lowmem_reserved2"] value 256864 + inst [N or "DMA::node0::lowmem_reserved3"] value 256864 + inst [N or "Normal::node0::lowmem_reserved0"] value 0 + inst [N or "Normal::node0::lowmem_reserved1"] value 0 + inst [N or "Normal::node0::lowmem_reserved2"] value 0 + inst [N or "Normal::node0::lowmem_reserved3"] value 0 + inst [N or "Normal::node1::lowmem_reserved0"] value 0 + inst [N or "Normal::node1::lowmem_reserved1"] value 0 + inst [N or "Normal::node1::lowmem_reserved2"] value 0 + inst [N or "Normal::node1::lowmem_reserved3"] value 0 + mem.zoneinfo.scanned inst [N or "DMA32::node0"] value 0 inst [N or "DMA::node0"] value 0 @@ -5638,6 +5720,24 @@ mem.zoneinfo.present inst [N or "Normal::node0"] value 65011712 inst [N or "Normal::node1"] value 67108864 +mem.zoneinfo.protection + inst [N or "DMA32::node0::lowmem_reserved0"] value 0 + inst [N or "DMA32::node0::lowmem_reserved1"] value 0 + inst [N or "DMA32::node0::lowmem_reserved2"] value 249844 + inst [N or "DMA32::node0::lowmem_reserved3"] value 249844 + inst [N or "DMA::node0::lowmem_reserved0"] value 0 + inst [N or "DMA::node0::lowmem_reserved1"] value 7016 + inst [N or "DMA::node0::lowmem_reserved2"] value 256864 + inst [N or "DMA::node0::lowmem_reserved3"] value 256864 + inst [N or "Normal::node0::lowmem_reserved0"] value 0 + inst [N or "Normal::node0::lowmem_reserved1"] value 0 + inst [N or "Normal::node0::lowmem_reserved2"] value 0 + inst [N or "Normal::node0::lowmem_reserved3"] value 0 + inst [N or "Normal::node1::lowmem_reserved0"] value 0 + inst [N or "Normal::node1::lowmem_reserved1"] value 0 + inst [N or "Normal::node1::lowmem_reserved2"] value 0 + inst [N or "Normal::node1::lowmem_reserved3"] value 0 + mem.zoneinfo.scanned inst [N or "DMA32::node0"] value 0 inst [N or "DMA::node0"] value 0 -- 1.8.3.1