From 5e9cdfa8b668b9e4daabaa72270090f7933d3cec Mon Sep 17 00:00:00 2001 From: mzhou0 <84460416+mzhou0@users.noreply.github.com> Date: Tue, 20 Jul 2021 14:24:46 +0000 Subject: [PATCH 1/5] Add plugin for categorizing memory usage --- src/supremm/assets/mongo_setup.js | 5 ++ src/supremm/plugins/CgroupMemCategories.py | 96 ++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 src/supremm/plugins/CgroupMemCategories.py diff --git a/src/supremm/assets/mongo_setup.js b/src/supremm/assets/mongo_setup.js index 739a50c8..3cbca010 100644 --- a/src/supremm/assets/mongo_setup.js +++ b/src/supremm/assets/mongo_setup.js @@ -425,6 +425,11 @@ var summarydef = { "unit": "byte" } } + }, + "cgroupmemcategories": { + "documentation": "Categorization of the cgroup memory usage of the job as constant, increasing, decreasing, or inconsistent. A job is constant if the memory usage stays approximately the same, increasing if the memory usage increases overall, decreasing if the memory usage decreases overall, or inconsistent if the memory usage does not fall under the previous three categories.", + "type": "", + "unit": "" } } }; diff --git a/src/supremm/plugins/CgroupMemCategories.py b/src/supremm/plugins/CgroupMemCategories.py new file mode 100644 index 00000000..0a3c9ff1 --- /dev/null +++ b/src/supremm/plugins/CgroupMemCategories.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +""" Memory usage catogorization plugin """ + +import re +import numpy as np +from supremm.plugin import Plugin +from supremm.errors import ProcessingError, NotApplicableError + +class CgroupMemCategories(Plugin): + """ Cgroup memory categorization plugin """ + + name = property(lambda x: "process_memory_categories") + mode = property(lambda x: "all") + requiredMetrics = property(lambda x: ["cgroup.memory.usage"]) + optionalMetrics = property(lambda x: []) + derivedMetrics = property(lambda x: []) + + MIN_DATAPOINTS = 5 + + def __init__(self, job): + super(CgroupMemCategories, self).__init__(job) + self._data = {} + self._hostcounts = {} + if job.acct['resource_manager'] == 'pbs': + self._expectedcgroup = "/torque/{0}".format(job.job_id) + elif job.acct['resource_manager'] == 'slurm': + self._expectedcgroup = "/slurm/uid_{0}/job_{1}".format(job.acct['uid'], job.job_id) + else: + raise NotApplicableError + + def process(self, nodemeta, timestamp, data, description): + """ Categorize a job based on its Cgroup memory usage """ + + if len(data[0]) == 0: + return True + + if nodemeta.nodeindex not in self._data: + self._data[nodemeta.nodeindex] = [] + self._hostcounts[nodemeta.nodeindex] = {"present": 0, "missing": 0} + # First data point for the node is ignored + return True + + try: + dataidx = None + for idx, desc in enumerate(description[0][1]): + if re.match(r"^" + re.escape(self._expectedcgroup) + r"($|\.)", desc): + dataidx = idx + break + # No cgroup info at this datapoint + if dataidx is None: + return True + for i in xrange(len(self.requiredMetrics)): + if len(data[i]) < dataidx: + # Skip timesteps with incomplete information + raise ValueError + + self._hostcounts[nodemeta.nodeindex]["present"] += 1 + except ValueError: + self._hostcounts[nodemeta.nodeindex]["missing"] += 1 + # No cgroup info at this datapoint + return True + + self._data[nodemeta.nodeindex].append(data[0][dataidx]) + + return True + + def results(self): + if len(self._data) != self._job.nodecount: + return {"error": ProcessingError.INSUFFICIENT_HOSTDATA} + + for hoststat in self._hostcounts.itervalues(): + if hoststat['missing'] > hoststat['present']: + return {"error": ProcessingError.CPUSET_UNKNOWN} + + if len(self._data[0]) < self.MIN_DATAPOINTS: + return {"error": ProcessingError.INSUFFICIENT_DATA, "length": len(self._data[0])} + + # Classify the job's memory usage + total = np.sum(list(self._data.itervalues()), 0) + first, middle, last = np.array_split(total, 3) + first, middle, last = np.median(first), np.median(middle), np.median(last) + + # Number of zeroes used for threshold. -1 for the leading digit, -2 for the .0 + zeroes = len(str(middle)) - 3 + threshold = int('1'+'0'*zeroes) / 2 + + if abs(middle - first) <= threshold and abs(last - middle) <= threshold: + category = "CONSTANT" + elif first < middle < last: + category = "INCREASING" + elif first > middle > last: + category = "DECREASING" + else: + category = "INCONSISTENT" + + return {"category": category} From 1858984b9c0f74a309775ba49ab8edb7441cd574 Mon Sep 17 00:00:00 2001 From: mzhou0 <84460416+mzhou0@users.noreply.github.com> Date: Tue, 20 Jul 2021 14:24:59 +0000 Subject: [PATCH 2/5] Add integration test for CgroupMemCategories plugin The previous PCP archive is re-extracted to include cgroup metrics. --- .../5894431-1622570028/cpn-d14-02.0 | Bin 0 -> 28176 bytes .../5894431-1622570028/cpn-d14-02.index | Bin 0 -> 332 bytes .../5894431-1622570028/cpn-d14-02.meta | Bin 0 -> 42943 bytes tests/integration_tests/integration_test.bash | 4 ++++ 4 files changed, 4 insertions(+) create mode 100644 tests/integration_tests/5894431-1622570028/cpn-d14-02.0 create mode 100644 tests/integration_tests/5894431-1622570028/cpn-d14-02.index create mode 100644 tests/integration_tests/5894431-1622570028/cpn-d14-02.meta diff --git a/tests/integration_tests/5894431-1622570028/cpn-d14-02.0 b/tests/integration_tests/5894431-1622570028/cpn-d14-02.0 new file mode 100644 index 0000000000000000000000000000000000000000..534a955ade2d80cc2040a2659029c3844ae547bc GIT binary patch literal 28176 zcmeI5349gRy~k(fCO0Ha;NF|CxD>(SWe-Ut7!WZ^LJ(17#29hA5Ws~+WD%tlqD8c} z3QsF8&nm7}v_4eoLb0Zn+PajctgeU{6cs627b?Pg-~Y(@pSi8KHLoxI*vGve|9*dS za^`=QxifSA=gb`($C+Q98TTA#GyY_^!s~I`uzha{k}8g zIJxZWK3Un|?9-0Zu3B}$7ZKG}Yl~ESRW=X%YkHC{4EPM@i7c`CJ-cttU7KxsrY+0K zF1P7HKVM7R`aA7xSx(y})+a|@+aB=gz59>b=pG#K6WAB|l|G%~a+@BkPpbSmO*Vh3 zJfReII5<#;b`91~M&hfr7bvTZ)$XXNHh+G#)wzLkgZpOMeUtj3<1)K%s{)maMb(r|th>5RP zF!A*|CcZXfQm?o0)fonTz0J1xdKVL4+cEL=Cro^Ogo&?DF!8ku6JNXWCHaEBq#yC+ zia&h0vOjrT$&Yq(Aimr@h%Yw+`J0=MFDX0V%k99n_&NZJFRnJeFX;>Mbtn{Hhe7ex z1B$QS_>%I2z6#kEU&T;-^@mcgBcS*i1jW};P<)j`@ii1*@(KDH#?uGuRRdrVPIqE+=Z@aL21uhc;ZT zIy0Q1y0!h+zU*mP@upi;7q5I)b>B~_RhONyLv_)4Hc!7(I%|4-X9uJ6nrr$Soge8? zWOQ`cs$NDHbd78`I&a|>bB&JG&01`9bivlqM#nZ5%r@Go`Sd~6rKJm0mlS`hy7&-V z|El3NnqJZ7Zq@MtG1Zk9Rj6j1YIUYtyz@dEB;EJ3q48JJD)K^LMy>eThkr z-oH}&A%F6KS4?{3hM$ixx?^_TQln#4_vRR#Kd_7TNp$Ud&72mDP20@jn){NI*Uujp z?u(r!a#F}SE1x$o(Oa-MwiWA+ZNuaoe;@0K?ZA3rA7Z_+kFh@3XINkCb4g2~lLv|Pr(aeBb*9< z4KISv!fEh1I32zSXTU!|+U&eOHhdF)7xMk~W2blE_t<_9 z(nk^t`LWYZZU+al{bwls{wb7x{|l6U{{l+C|2L%HJrC0F9`~g%{qD7a^t<;hNWXh+ zA^q+}A^q+ZK>FS52 z^Lok98!;e*GhC8Xw>fXBkYhPWiWyROlsxEG{F=yXhHYO}PdyVEPnrP#h zey8rz^!P_pjLvILXzY|9>2{t;j}BYY#^{2shumv)-oooOZi&^+*Z4WQ;LjsXp4i6k zXgulEe741;JEce1^peAEoL1cBAwGePTm{LuchNX`XC+eanoe1RZd@I!GG6y&&Cp| z{iAOZOXmYda zes!0qj(@DNYhH7`jbS43k4&EEuyu2dF6esbAfxjZF4i@=SlyKaOnP*|C$|_K+jy9+ zaXB@+-Ztq@Y1wMkC8b?d7av-qy6X51sw;BGsg4h_eO@`Ut){njy!ZX=m8Pud{U55% zpFDAxNsrv{uEwPuv#-&ZHdghjwlRO;sLM_M=(^6gei`rOy~Z5d`%dmu)+?Osc7O9s zh09ustnazAA=e|9wGz3EyA3b{ejhRhb{9Z7SAPKIT>TNgxDzC;#V=%Ad|d~{*9}m7 z-2}zge?swf8x&u6K=E}qz79c49ob(#?oZ`^{I?W}ub)BjwG4`{N1^z742rKOq4-*f zug>V8ucz4-U(Z1C^&2R@eh0ri}chT`ij zD8Al?;_F=~zP96w{7Jt4#J2eQ2#T*yp!nJa#n)~qzVUk5<(buhl<6Z9p=LVO(x#n)j_eD#3ht2Y#1g;0DIL-E!B zZ|4)dBlw&68U*9;DA*mAL;QI|VNW;=_JYSj{Cgu|A9xb%3t6L+^<$4UIaxpU>R=IM z%}v&iJ=WOd*;{W6JRFXL{o%Q=6kY%az{!w0c~c?ZUvD}b2rq`z(Yq8L37Mak^*_XMnlzknyhUqbrG`xQI|u7ZrSyx&6l%zGZz!r#Nw zU=ySdy|wUkxB-raFGKp&dkvlm-+*VqEs#F;w!(AZHkg3#L;Bp?0ms4*VLkj9atyrB z;CT2soB;Pgj!6i}`f*6a`7jJQMxkst5$3{4upQ)>g<^0DY!5Glogl|BbP&7FYCu4j>x*t4mbacUII;S1m*kg!EcWVCfp6b#;I#2GD3|OJ*#ot+` zy6S{8RafMFtU7+=F4dK@Jk_l}t~qR{DJ#0Pt@cm;`|@{eL+J_`yH!9LyD?r% zujSDXj4$`=XEzyF`)hfOz5TU3#@_x~9^-6(EswFczm~_?+h5CL-0iRBG4}S?@)&#D zwY=4DP1WN30I`@wO$tGCf#_^w=Xk_6U9-QtJI|?9u+ZMSAYEzphbrOUE7so2Kf%?t1If zTU)N_9y2UvJmbE$Om)Ulfjl)kHQg(>`9t#>Ib^z)x82E`_pBsvsgQY-Hkgaa=Qd3A z9T*W)`nP)Y!7eNdOaE5S|4z6g=?lJ!?ny8MGLPoZcQbD$^U5yslhR-R(%B%-*~OIrFfNHBkTLcZJJ(IU!c0kUOSwAqhHbV_@}x~ zm)AVO%)dCydFlKVb6#~Oe?iy7Ivbt0@MfJ;i`88nHtEp?yX;)p#vZdxx>NIck?PVx zPpB?A!q&66TaKnzov=xDMcWG1@xjAYSI(NRy4B~rdNi7{qD!MIjLx6@L!A?hEY4nH z(mQ59xZ3Dg)$YMY=MS7Q$>`|1A9N3 z_rAQYNMF!>>GeIjBfY+tUf(;N@4*Jn3D%&}>wEM=dVP;h;JKpB<{tA;j&ZZD6;3KMw;|;2-s&x&`sfgM! zQ2c1SPFp$q7R}%4W1SllrmX1F1|6T}PyS2Xq(>Id(s5_UoC8;x^w{w8ON`DR_@=fi zy6yp!-(7QBqhs0QFIkxdOhW*x@<7}h)G5xdPWP4TdFPF9P#qeyS+#d>H%Kf5W}mQH9xs@Se|{ns{MrS*xw{7covzqQXe_T780rk9PkbH7E?eyr*J z&eHp;6W=w*q~|rCuQ5}8q|bFGJv!_ajbjSB_LyMO^A_HEqS3LsA5Aklx?p!3qhlL; z+qw6eJv~giQ(CV3IwgYxZRvTr=BXOhS#?E0jq3Q&<*F;^UZT3SW4rko>r7eEr5}tm zI)BQ9wnj%5H)}lCG3QF{tJv@j2bw(jgHCwK=;-=RCdPF)bWiAU`F5$*NwM8RJ1+Bv z+dN$Bbl)W1(&s1YH(Nj7gy$#TS!C;zqK)a;E*;w?edkkrPn`WMw)=L`GCg;K+F2er zr-C{~za2cMi~8~I4(NyMHOITV$>zD;UPCfIv}J{EifEpUpX{{ysYXhc*esg;*b&(07-Mh$J)VrcrHcN) zS-@r9fA1#oiT~bBo-*;@yO|4zkgpx&c})L3p5?GT+sD98@K|^d911(b3fL7^!ftRF zl(ttvX)C|I@!#Wl9F(?D0l0kLOf)58D^P`yh4l-{UzQKE(D6_%Ni7 z{(C$xhL5v73$B3F*?*7crLd80#-w*4wsSQ9ck?)l_KhK&yyi(d2azA? z*KE?G!(Ja^bV1kNI$x8w@b=LrJyy3cVRUrCo-IblHWu2srUVjyX46 iY|>-Hn{ECZD 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 literal 0 HcmV?d00001 diff --git a/tests/integration_tests/integration_test.bash b/tests/integration_tests/integration_test.bash index f9a7dfdc..7b02f46b 100755 --- a/tests/integration_tests/integration_test.bash +++ b/tests/integration_tests/integration_test.bash @@ -31,3 +31,7 @@ EOF [[ $count -eq 6 ]] pytest tests/integration_tests/integration_plugin_api.py + +match=$(python src/supremm/supremm_testharness.py -i CgroupMemCategories --job-id=5894431 --acct-uid=545487 tests/integration_tests/5894431-1622570028/ | grep -q "INCONSISTENT"; echo $?) + +[[ $match -eq 0 ]] From 812f9634c41c9c0f0ca8990fc3881f6091e502c5 Mon Sep 17 00:00:00 2001 From: mzhou0 <84460416+mzhou0@users.noreply.github.com> Date: Tue, 20 Jul 2021 17:28:29 +0000 Subject: [PATCH 3/5] Disable pylint check for line The affected line causes an error in pylint for the check unbalanced-tuple-unpacking. This commit disables the check for that line, since an earlier if-statement handles cases where there is not enough data for the tuple to have three elements. --- src/supremm/plugins/CgroupMemCategories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/supremm/plugins/CgroupMemCategories.py b/src/supremm/plugins/CgroupMemCategories.py index 0a3c9ff1..97138daf 100644 --- a/src/supremm/plugins/CgroupMemCategories.py +++ b/src/supremm/plugins/CgroupMemCategories.py @@ -77,7 +77,7 @@ def results(self): # Classify the job's memory usage total = np.sum(list(self._data.itervalues()), 0) - first, middle, last = np.array_split(total, 3) + first, middle, last = np.array_split(total, 3) # pylint: disable=unbalanced-tuple-unpacking first, middle, last = np.median(first), np.median(middle), np.median(last) # Number of zeroes used for threshold. -1 for the leading digit, -2 for the .0 From 935c6d438648d989f5b4b4f5bee4b93b757c40c2 Mon Sep 17 00:00:00 2001 From: mzhou0 <84460416+mzhou0@users.noreply.github.com> Date: Tue, 20 Jul 2021 17:54:56 +0000 Subject: [PATCH 4/5] Remove unnecessary field from returned dict --- src/supremm/plugins/CgroupMemCategories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/supremm/plugins/CgroupMemCategories.py b/src/supremm/plugins/CgroupMemCategories.py index 97138daf..76e39310 100644 --- a/src/supremm/plugins/CgroupMemCategories.py +++ b/src/supremm/plugins/CgroupMemCategories.py @@ -73,7 +73,7 @@ def results(self): return {"error": ProcessingError.CPUSET_UNKNOWN} if len(self._data[0]) < self.MIN_DATAPOINTS: - return {"error": ProcessingError.INSUFFICIENT_DATA, "length": len(self._data[0])} + return {"error": ProcessingError.INSUFFICIENT_DATA} # Classify the job's memory usage total = np.sum(list(self._data.itervalues()), 0) From 00ddf794d40056e7af8abe3dd679d62718bdd707 Mon Sep 17 00:00:00 2001 From: mzhou0 <84460416+mzhou0@users.noreply.github.com> Date: Fri, 6 Aug 2021 14:28:50 +0000 Subject: [PATCH 5/5] Adjust constant threshold calculation --- src/supremm/plugins/CgroupMemCategories.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/supremm/plugins/CgroupMemCategories.py b/src/supremm/plugins/CgroupMemCategories.py index 76e39310..4758804d 100644 --- a/src/supremm/plugins/CgroupMemCategories.py +++ b/src/supremm/plugins/CgroupMemCategories.py @@ -80,9 +80,8 @@ def results(self): first, middle, last = np.array_split(total, 3) # pylint: disable=unbalanced-tuple-unpacking first, middle, last = np.median(first), np.median(middle), np.median(last) - # Number of zeroes used for threshold. -1 for the leading digit, -2 for the .0 - zeroes = len(str(middle)) - 3 - threshold = int('1'+'0'*zeroes) / 2 + # Threshold used to determine if the job is constant + threshold = middle / 2 if abs(middle - first) <= threshold and abs(last - middle) <= threshold: category = "CONSTANT"