]> git.ais-ucla.org Git - stats.ais-ucla.org.git/commitdiff
initial import to git
authorChristopher Milan <chrismilan@ucla.edu>
Sat, 15 Feb 2025 18:29:35 +0000 (18:29 +0000)
committerChristopher Milan <chrismilan@ucla.edu>
Sat, 15 Feb 2025 18:43:42 +0000 (18:43 +0000)
badges/cherf.gif [new file with mode: 0644]
badges/freebsd.gif [new file with mode: 0644]
badges/thttpd.gif [new file with mode: 0644]
bg.gif [new file with mode: 0644]
cpu.cgi [new file with mode: 0755]
gpu.cgi [new file with mode: 0755]
index.html [new file with mode: 0644]
mem.cgi [new file with mode: 0755]

diff --git a/badges/cherf.gif b/badges/cherf.gif
new file mode 100644 (file)
index 0000000..0bb260a
Binary files /dev/null and b/badges/cherf.gif differ
diff --git a/badges/freebsd.gif b/badges/freebsd.gif
new file mode 100644 (file)
index 0000000..cd41141
Binary files /dev/null and b/badges/freebsd.gif differ
diff --git a/badges/thttpd.gif b/badges/thttpd.gif
new file mode 100644 (file)
index 0000000..c1652c2
Binary files /dev/null and b/badges/thttpd.gif differ
diff --git a/bg.gif b/bg.gif
new file mode 100644 (file)
index 0000000..e0367fd
Binary files /dev/null and b/bg.gif differ
diff --git a/cpu.cgi b/cpu.cgi
new file mode 100755 (executable)
index 0000000..236f44d
--- /dev/null
+++ b/cpu.cgi
@@ -0,0 +1,43 @@
+#!/usr/bin/rrdcgi
+<RRD::SETENV TZ America/Los_Angeles>
+<html>
+<head><title>Cluster CPU Report</title></head>
+<body style="background-image: url('/bg.gif')">
+<h1>Cluster CPU Report</h1>
+<RRD::GRAPH cpu1h.png --title="CPU Usage, Last Hour"
+            -u 100 -l 0 -r -s -1hr -w 480 -h 240
+            DEF:tuser=/srv/stats/temescal/cpu.rrd:user:AVERAGE
+            DEF:tsystem=/srv/stats/temescal/cpu.rrd:system:AVERAGE
+            CDEF:t=tuser,tsystem,+,32,/
+            DEF:yuser=/srv/stats/ynez/cpu.rrd:user:AVERAGE
+            DEF:ysystem=/srv/stats/ynez/cpu.rrd:system:AVERAGE
+            CDEF:y=yuser,ysystem,+,64,/
+            DEF:suser=/srv/stats/serrano/cpu.rrd:user:AVERAGE
+            DEF:ssystem=/srv/stats/serrano/cpu.rrd:system:AVERAGE
+            CDEF:s=suser,ssystem,+,48,/
+            LINE2:t#a00000:"Temescal" LINE2:y#00a000:"Ynez" LINE2:s#0000a0:"Serrano">
+<RRD::GRAPH cpu1d.png --title="CPU Usage, Last Day"
+            -u 100 -l 0 -r -s -1d -w 960 -h 240
+            DEF:tuser=/srv/stats/temescal/cpu.rrd:user:AVERAGE
+            DEF:tsystem=/srv/stats/temescal/cpu.rrd:system:AVERAGE
+            CDEF:t=tuser,tsystem,+,32,/
+            DEF:yuser=/srv/stats/ynez/cpu.rrd:user:AVERAGE
+            DEF:ysystem=/srv/stats/ynez/cpu.rrd:system:AVERAGE
+            CDEF:y=yuser,ysystem,+,64,/
+            DEF:suser=/srv/stats/serrano/cpu.rrd:user:AVERAGE
+            DEF:ssystem=/srv/stats/serrano/cpu.rrd:system:AVERAGE
+            CDEF:s=suser,ssystem,+,48,/
+            LINE2:t#a00000:"Temescal" LINE2:y#00a000:"Ynez" LINE2:s#0000a0:"Serrano">
+<footer style="text-align:center">
+<hr />
+<a href="https://acme.com/software/thttpd/"><img src="/badges/thttpd.gif" alt="powered by thttpd" height="31" width="88"></a>
+<a href="https://www.freebsd.org/"><img src="/badges/freebsd.gif" alt="powered by FreeBSD" height="31" width="88"></a>
+<a href="https://github.com/ais-ucla/cherf/"><img src="/badges/cherf.gif" alt="powered by cherf" height="31" width="88"></a>
+<address>
+&copy; 2025 Christopher Milan
+<br />
+<a href="/">stats.ais-ucla.org</a>
+</address>
+</footer>
+</body>
+</html>
diff --git a/gpu.cgi b/gpu.cgi
new file mode 100755 (executable)
index 0000000..3a76efd
--- /dev/null
+++ b/gpu.cgi
@@ -0,0 +1,152 @@
+#!/usr/bin/rrdcgi
+<RRD::SETENV TZ America/Los_Angeles>
+<html>
+<head><title>Cluster GPU Report</title></head>
+<body style="background-image: url('/bg.gif')">
+<h1>Cluster GPU Report</h1>
+<RRD::GRAPH gpu1h.png --title="GPU Utilization, Last Hour"
+            -s -1hr -w 560 -h 240 -S 120s
+            DEF:tu0=/srv/stats/temescal/gpu.rrd:util0:AVERAGE
+            DEF:tu1=/srv/stats/temescal/gpu.rrd:util1:AVERAGE
+            DEF:tu2=/srv/stats/temescal/gpu.rrd:util2:AVERAGE
+            DEF:tu3=/srv/stats/temescal/gpu.rrd:util3:AVERAGE
+            DEF:yu0=/srv/stats/ynez/gpu.rrd:util0:AVERAGE
+            DEF:yu1=/srv/stats/ynez/gpu.rrd:util1:AVERAGE
+            DEF:yu2=/srv/stats/ynez/gpu.rrd:util2:AVERAGE
+            DEF:yu3=/srv/stats/ynez/gpu.rrd:util3:AVERAGE
+            DEF:su0=/srv/stats/serrano/gpu.rrd:util0:AVERAGE
+            DEF:su1=/srv/stats/serrano/gpu.rrd:util1:AVERAGE
+            DEF:su2=/srv/stats/serrano/gpu.rrd:util2:AVERAGE
+            DEF:su3=/srv/stats/serrano/gpu.rrd:util3:AVERAGE
+            VDEF:curtu0=tu0,LAST VDEF:curtu1=tu1,LAST VDEF:curtu2=tu2,LAST VDEF:curtu3=tu3,LAST VDEF:curyu0=yu0,LAST VDEF:curyu1=yu1,LAST VDEF:curyu2=yu2,LAST VDEF:curyu3=yu3,LAST VDEF:cursu0=su0,LAST VDEF:cursu1=su1,LAST VDEF:cursu2=su2,LAST VDEF:cursu3=su3,LAST
+            VDEF:avgtu0=tu0,AVERAGE VDEF:avgtu1=tu1,AVERAGE VDEF:avgtu2=tu2,AVERAGE VDEF:avgtu3=tu3,AVERAGE VDEF:avgyu0=yu0,AVERAGE VDEF:avgyu1=yu1,AVERAGE VDEF:avgyu2=yu2,AVERAGE VDEF:avgyu3=yu3,AVERAGE VDEF:avgsu0=su0,AVERAGE VDEF:avgsu1=su1,AVERAGE VDEF:avgsu2=su2,AVERAGE VDEF:avgsu3=su3,AVERAGE
+            VDEF:maxtu0=tu0,MAXIMUM VDEF:maxtu1=tu1,MAXIMUM VDEF:maxtu2=tu2,MAXIMUM VDEF:maxtu3=tu3,MAXIMUM VDEF:maxyu0=yu0,MAXIMUM VDEF:maxyu1=yu1,MAXIMUM VDEF:maxyu2=yu2,MAXIMUM VDEF:maxyu3=yu3,MAXIMUM VDEF:maxsu0=su0,MAXIMUM VDEF:maxsu1=su1,MAXIMUM VDEF:maxsu2=su2,MAXIMUM VDEF:maxsu3=su3,MAXIMUM
+            COMMENT:"                  Current  Average  Maximum                    Current  Average  Maximum\l"
+            AREA:tu0#FF0099:"Temescal GPU0":STACK GPRINT:curtu0:"%5.1lf %%" GPRINT:avgtu0:"%5.1lf %%" GPRINT:maxtu0:"%5.1lf %%"
+            AREA:tu1#FF0066:"Temescal GPU1":STACK GPRINT:curtu1:"%5.1lf %%" GPRINT:avgtu1:"%5.1lf %%" GPRINT:maxtu1:"%5.1lf %%\l"
+            AREA:tu2#FF0033:"Temescal GPU2":STACK GPRINT:curtu2:"%5.1lf %%" GPRINT:avgtu2:"%5.1lf %%" GPRINT:maxtu2:"%5.1lf %%"
+            AREA:tu3#FF0000:"Temescal GPU3":STACK GPRINT:curtu3:"%5.1lf %%" GPRINT:avgtu3:"%5.1lf %%" GPRINT:maxtu3:"%5.1lf %%\l"
+            AREA:yu0#66CC00:"Ynez GPU0    ":STACK GPRINT:curyu0:"%5.1lf %%" GPRINT:avgyu0:"%5.1lf %%" GPRINT:maxyu0:"%5.1lf %%"
+            AREA:yu1#66CC33:"Ynez GPU1    ":STACK GPRINT:curyu1:"%5.1lf %%" GPRINT:avgyu1:"%5.1lf %%" GPRINT:maxyu1:"%5.1lf %%\l"
+            AREA:yu2#66CC66:"Ynez GPU2    ":STACK GPRINT:curyu2:"%5.1lf %%" GPRINT:avgyu2:"%5.1lf %%" GPRINT:maxyu2:"%5.1lf %%"
+            AREA:yu3#66CC99:"Ynez GPU3    ":STACK GPRINT:curyu3:"%5.1lf %%" GPRINT:avgyu3:"%5.1lf %%" GPRINT:maxyu3:"%5.1lf %%\l"
+            AREA:su0#6600CC:"Serrano GPU0 ":STACK GPRINT:cursu0:"%5.1lf %%" GPRINT:avgsu0:"%5.1lf %%" GPRINT:maxsu0:"%5.1lf %%"
+            AREA:su1#6600FF:"Serrano GPU1 ":STACK GPRINT:cursu1:"%5.1lf %%" GPRINT:avgsu1:"%5.1lf %%" GPRINT:maxsu1:"%5.1lf %%\l"
+            AREA:su2#9900FF:"Serrano GPU2 ":STACK GPRINT:cursu2:"%5.1lf %%" GPRINT:avgsu2:"%5.1lf %%" GPRINT:maxsu2:"%5.1lf %%"
+            AREA:su3#9900CC:"Serrano GPU3 ":STACK GPRINT:cursu3:"%5.1lf %%" GPRINT:avgsu3:"%5.1lf %%" GPRINT:maxsu3:"%5.1lf %%\l">
+<RRD::GRAPH gpu_mem1h.png --title="VRAM Utilization, Last Hour"
+            -s -1hr -w 600 -h 240 -S 120s
+            DEF:tu0=/srv/stats/temescal/gpu.rrd:mem0:AVERAGE
+            DEF:tu1=/srv/stats/temescal/gpu.rrd:mem1:AVERAGE
+            DEF:tu2=/srv/stats/temescal/gpu.rrd:mem2:AVERAGE
+            DEF:tu3=/srv/stats/temescal/gpu.rrd:mem3:AVERAGE
+            DEF:yu0=/srv/stats/ynez/gpu.rrd:mem0:AVERAGE
+            DEF:yu1=/srv/stats/ynez/gpu.rrd:mem1:AVERAGE
+            DEF:yu2=/srv/stats/ynez/gpu.rrd:mem2:AVERAGE
+            DEF:yu3=/srv/stats/ynez/gpu.rrd:mem3:AVERAGE
+            DEF:su0=/srv/stats/serrano/gpu.rrd:mem0:AVERAGE
+            DEF:su1=/srv/stats/serrano/gpu.rrd:mem1:AVERAGE
+            DEF:su2=/srv/stats/serrano/gpu.rrd:mem2:AVERAGE
+            DEF:su3=/srv/stats/serrano/gpu.rrd:mem3:AVERAGE
+            VDEF:curtu0=tu0,LAST VDEF:curtu1=tu1,LAST VDEF:curtu2=tu2,LAST VDEF:curtu3=tu3,LAST VDEF:curyu0=yu0,LAST VDEF:curyu1=yu1,LAST VDEF:curyu2=yu2,LAST VDEF:curyu3=yu3,LAST VDEF:cursu0=su0,LAST VDEF:cursu1=su1,LAST VDEF:cursu2=su2,LAST VDEF:cursu3=su3,LAST
+            VDEF:avgtu0=tu0,AVERAGE VDEF:avgtu1=tu1,AVERAGE VDEF:avgtu2=tu2,AVERAGE VDEF:avgtu3=tu3,AVERAGE VDEF:avgyu0=yu0,AVERAGE VDEF:avgyu1=yu1,AVERAGE VDEF:avgyu2=yu2,AVERAGE VDEF:avgyu3=yu3,AVERAGE VDEF:avgsu0=su0,AVERAGE VDEF:avgsu1=su1,AVERAGE VDEF:avgsu2=su2,AVERAGE VDEF:avgsu3=su3,AVERAGE
+            VDEF:maxtu0=tu0,MAXIMUM VDEF:maxtu1=tu1,MAXIMUM VDEF:maxtu2=tu2,MAXIMUM VDEF:maxtu3=tu3,MAXIMUM VDEF:maxyu0=yu0,MAXIMUM VDEF:maxyu1=yu1,MAXIMUM VDEF:maxyu2=yu2,MAXIMUM VDEF:maxyu3=yu3,MAXIMUM VDEF:maxsu0=su0,MAXIMUM VDEF:maxsu1=su1,MAXIMUM VDEF:maxsu2=su2,MAXIMUM VDEF:maxsu3=su3,MAXIMUM
+            COMMENT:"                   Current   Average   Maximum                     Current   Average   Maximum\l"
+            LINE1:tu0#FF0099:"Temescal GPU0" GPRINT:curtu0:"%5.0lf %SB" GPRINT:avgtu0:"%5.0lf %SB" GPRINT:maxtu0:"%5.0lf %SB"
+            LINE1:tu1#FF0066:"Temescal GPU1" GPRINT:curtu1:"%5.0lf %SB" GPRINT:avgtu1:"%5.0lf %SB" GPRINT:maxtu1:"%5.0lf %SB\l"
+            LINE1:tu2#FF0033:"Temescal GPU2" GPRINT:curtu2:"%5.0lf %SB" GPRINT:avgtu2:"%5.0lf %SB" GPRINT:maxtu2:"%5.0lf %SB"
+            LINE1:tu3#FF0000:"Temescal GPU3" GPRINT:curtu3:"%5.0lf %SB" GPRINT:avgtu3:"%5.0lf %SB" GPRINT:maxtu3:"%5.0lf %SB\l"
+            LINE1:yu0#66CC00:"Ynez GPU0    " GPRINT:curyu0:"%5.0lf %SB" GPRINT:avgyu0:"%5.0lf %SB" GPRINT:maxyu0:"%5.0lf %SB"
+            LINE1:yu1#66CC33:"Ynez GPU1    " GPRINT:curyu1:"%5.0lf %SB" GPRINT:avgyu1:"%5.0lf %SB" GPRINT:maxyu1:"%5.0lf %SB\l"
+            LINE1:yu2#66CC66:"Ynez GPU2    " GPRINT:curyu2:"%5.0lf %SB" GPRINT:avgyu2:"%5.0lf %SB" GPRINT:maxyu2:"%5.0lf %SB"
+            LINE1:yu3#66CC99:"Ynez GPU3    " GPRINT:curyu3:"%5.0lf %SB" GPRINT:avgyu3:"%5.0lf %SB" GPRINT:maxyu3:"%5.0lf %SB\l"
+            LINE1:su0#6600CC:"Serrano GPU0 " GPRINT:cursu0:"%5.0lf %SB" GPRINT:avgsu0:"%5.0lf %SB" GPRINT:maxsu0:"%5.0lf %SB"
+            LINE1:su1#6600FF:"Serrano GPU1 " GPRINT:cursu1:"%5.0lf %SB" GPRINT:avgsu1:"%5.0lf %SB" GPRINT:maxsu1:"%5.0lf %SB\l"
+            LINE1:su2#9900FF:"Serrano GPU2 " GPRINT:cursu2:"%5.0lf %SB" GPRINT:avgsu2:"%5.0lf %SB" GPRINT:maxsu2:"%5.0lf %SB"
+            LINE1:su3#9900CC:"Serrano GPU3 " GPRINT:cursu3:"%5.0lf %SB" GPRINT:avgsu3:"%5.0lf %SB" GPRINT:maxsu3:"%5.0lf %SB\l">
+<RRD::GRAPH gpu_pow1h.png --title="GPU Power Draw, Last Hour"
+            -s -1hr -w 560 -h 240 -S 120s
+            DEF:tb0=/srv/stats/temescal/gpu.rrd:power0:AVERAGE
+            DEF:tb1=/srv/stats/temescal/gpu.rrd:power1:AVERAGE
+            DEF:tb2=/srv/stats/temescal/gpu.rrd:power2:AVERAGE
+            DEF:tb3=/srv/stats/temescal/gpu.rrd:power3:AVERAGE
+            DEF:yb0=/srv/stats/ynez/gpu.rrd:power0:AVERAGE
+            DEF:yb1=/srv/stats/ynez/gpu.rrd:power1:AVERAGE
+            DEF:yb2=/srv/stats/ynez/gpu.rrd:power2:AVERAGE
+            DEF:yb3=/srv/stats/ynez/gpu.rrd:power3:AVERAGE
+            DEF:sb0=/srv/stats/serrano/gpu.rrd:power0:AVERAGE
+            DEF:sb1=/srv/stats/serrano/gpu.rrd:power1:AVERAGE
+            DEF:sb2=/srv/stats/serrano/gpu.rrd:power2:AVERAGE
+            DEF:sb3=/srv/stats/serrano/gpu.rrd:power3:AVERAGE
+            CDEF:tu0=tb0,1000,/
+            CDEF:tu1=tb1,1000,/
+            CDEF:tu2=tb2,1000,/
+            CDEF:tu3=tb3,1000,/
+            CDEF:yu0=yb0,1000,/
+            CDEF:yu1=yb1,1000,/
+            CDEF:yu2=yb2,1000,/
+            CDEF:yu3=yb3,1000,/
+            CDEF:su0=sb0,1000,/
+            CDEF:su1=sb1,1000,/
+            CDEF:su2=sb2,1000,/
+            CDEF:su3=sb3,1000,/
+            VDEF:curtu0=tu0,LAST VDEF:curtu1=tu1,LAST VDEF:curtu2=tu2,LAST VDEF:curtu3=tu3,LAST VDEF:curyu0=yu0,LAST VDEF:curyu1=yu1,LAST VDEF:curyu2=yu2,LAST VDEF:curyu3=yu3,LAST VDEF:cursu0=su0,LAST VDEF:cursu1=su1,LAST VDEF:cursu2=su2,LAST VDEF:cursu3=su3,LAST
+            VDEF:avgtu0=tu0,AVERAGE VDEF:avgtu1=tu1,AVERAGE VDEF:avgtu2=tu2,AVERAGE VDEF:avgtu3=tu3,AVERAGE VDEF:avgyu0=yu0,AVERAGE VDEF:avgyu1=yu1,AVERAGE VDEF:avgyu2=yu2,AVERAGE VDEF:avgyu3=yu3,AVERAGE VDEF:avgsu0=su0,AVERAGE VDEF:avgsu1=su1,AVERAGE VDEF:avgsu2=su2,AVERAGE VDEF:avgsu3=su3,AVERAGE
+            VDEF:maxtu0=tu0,MAXIMUM VDEF:maxtu1=tu1,MAXIMUM VDEF:maxtu2=tu2,MAXIMUM VDEF:maxtu3=tu3,MAXIMUM VDEF:maxyu0=yu0,MAXIMUM VDEF:maxyu1=yu1,MAXIMUM VDEF:maxyu2=yu2,MAXIMUM VDEF:maxyu3=yu3,MAXIMUM VDEF:maxsu0=su0,MAXIMUM VDEF:maxsu1=su1,MAXIMUM VDEF:maxsu2=su2,MAXIMUM VDEF:maxsu3=su3,MAXIMUM
+            COMMENT:"                  Current  Average  Maximum                    Current  Average  Maximum\l"
+            AREA:tu0#FF0099:"Temescal GPU0":STACK GPRINT:curtu0:"%4.0lf %SW" GPRINT:avgtu0:"%4.0lf %SW" GPRINT:maxtu0:"%4.0lf %SW"
+            AREA:tu1#FF0066:"Temescal GPU1":STACK GPRINT:curtu1:"%4.0lf %SW" GPRINT:avgtu1:"%4.0lf %SW" GPRINT:maxtu1:"%4.0lf %SW\l"
+            AREA:tu2#FF0033:"Temescal GPU2":STACK GPRINT:curtu2:"%4.0lf %SW" GPRINT:avgtu2:"%4.0lf %SW" GPRINT:maxtu2:"%4.0lf %SW"
+            AREA:tu3#FF0000:"Temescal GPU3":STACK GPRINT:curtu3:"%4.0lf %SW" GPRINT:avgtu3:"%4.0lf %SW" GPRINT:maxtu3:"%4.0lf %SW\l"
+            AREA:yu0#66CC00:"Ynez GPU0    ":STACK GPRINT:curyu0:"%4.0lf %SW" GPRINT:avgyu0:"%4.0lf %SW" GPRINT:maxyu0:"%4.0lf %SW"
+            AREA:yu1#66CC33:"Ynez GPU1    ":STACK GPRINT:curyu1:"%4.0lf %SW" GPRINT:avgyu1:"%4.0lf %SW" GPRINT:maxyu1:"%4.0lf %SW\l"
+            AREA:yu2#66CC66:"Ynez GPU2    ":STACK GPRINT:curyu2:"%4.0lf %SW" GPRINT:avgyu2:"%4.0lf %SW" GPRINT:maxyu2:"%4.0lf %SW"
+            AREA:yu3#66CC99:"Ynez GPU3    ":STACK GPRINT:curyu3:"%4.0lf %SW" GPRINT:avgyu3:"%4.0lf %SW" GPRINT:maxyu3:"%4.0lf %SW\l"
+            AREA:su0#6600CC:"Serrano GPU0 ":STACK GPRINT:cursu0:"%4.0lf %SW" GPRINT:avgsu0:"%4.0lf %SW" GPRINT:maxsu0:"%4.0lf %SW"
+            AREA:su1#6600FF:"Serrano GPU1 ":STACK GPRINT:cursu1:"%4.0lf %SW" GPRINT:avgsu1:"%4.0lf %SW" GPRINT:maxsu1:"%4.0lf %SW\l"
+            AREA:su2#9900FF:"Serrano GPU2 ":STACK GPRINT:cursu2:"%4.0lf %SW" GPRINT:avgsu2:"%4.0lf %SW" GPRINT:maxsu2:"%4.0lf %SW"
+            AREA:su3#9900CC:"Serrano GPU3 ":STACK GPRINT:cursu3:"%4.0lf %SW" GPRINT:avgsu3:"%4.0lf %SW" GPRINT:maxsu3:"%4.0lf %SW\l">
+<br />
+<RRD::GRAPH gpu1wk.png --title="GPU Utilization, Last Week"
+            -s -1wk -w 1200 -h 240
+            DEF:tu0=/srv/stats/temescal/gpu.rrd:util0:AVERAGE
+            DEF:tu1=/srv/stats/temescal/gpu.rrd:util1:AVERAGE
+            DEF:tu2=/srv/stats/temescal/gpu.rrd:util2:AVERAGE
+            DEF:tu3=/srv/stats/temescal/gpu.rrd:util3:AVERAGE
+            DEF:yu0=/srv/stats/ynez/gpu.rrd:util0:AVERAGE
+            DEF:yu1=/srv/stats/ynez/gpu.rrd:util1:AVERAGE
+            DEF:yu2=/srv/stats/ynez/gpu.rrd:util2:AVERAGE
+            DEF:yu3=/srv/stats/ynez/gpu.rrd:util3:AVERAGE
+            DEF:su0=/srv/stats/serrano/gpu.rrd:util0:AVERAGE
+            DEF:su1=/srv/stats/serrano/gpu.rrd:util1:AVERAGE
+            DEF:su2=/srv/stats/serrano/gpu.rrd:util2:AVERAGE
+            DEF:su3=/srv/stats/serrano/gpu.rrd:util3:AVERAGE
+            VDEF:curtu0=tu0,LAST VDEF:curtu1=tu1,LAST VDEF:curtu2=tu2,LAST VDEF:curtu3=tu3,LAST VDEF:curyu0=yu0,LAST VDEF:curyu1=yu1,LAST VDEF:curyu2=yu2,LAST VDEF:curyu3=yu3,LAST VDEF:cursu0=su0,LAST VDEF:cursu1=su1,LAST VDEF:cursu2=su2,LAST VDEF:cursu3=su3,LAST
+            VDEF:avgtu0=tu0,AVERAGE VDEF:avgtu1=tu1,AVERAGE VDEF:avgtu2=tu2,AVERAGE VDEF:avgtu3=tu3,AVERAGE VDEF:avgyu0=yu0,AVERAGE VDEF:avgyu1=yu1,AVERAGE VDEF:avgyu2=yu2,AVERAGE VDEF:avgyu3=yu3,AVERAGE VDEF:avgsu0=su0,AVERAGE VDEF:avgsu1=su1,AVERAGE VDEF:avgsu2=su2,AVERAGE VDEF:avgsu3=su3,AVERAGE
+            VDEF:maxtu0=tu0,MAXIMUM VDEF:maxtu1=tu1,MAXIMUM VDEF:maxtu2=tu2,MAXIMUM VDEF:maxtu3=tu3,MAXIMUM VDEF:maxyu0=yu0,MAXIMUM VDEF:maxyu1=yu1,MAXIMUM VDEF:maxyu2=yu2,MAXIMUM VDEF:maxyu3=yu3,MAXIMUM VDEF:maxsu0=su0,MAXIMUM VDEF:maxsu1=su1,MAXIMUM VDEF:maxsu2=su2,MAXIMUM VDEF:maxsu3=su3,MAXIMUM
+            COMMENT:"                  Current  Average  Maximum                    Current  Average  Maximum                    Current  Average  Maximum                    Current  Average  Maximum\l"
+            AREA:tu0#FF0099:"Temescal GPU0":STACK GPRINT:curtu0:"%5.1lf %%" GPRINT:avgtu0:"%5.1lf %%" GPRINT:maxtu0:"%5.1lf %%"
+            AREA:tu1#FF0066:"Temescal GPU1":STACK GPRINT:curtu1:"%5.1lf %%" GPRINT:avgtu1:"%5.1lf %%" GPRINT:maxtu1:"%5.1lf %%"
+            AREA:tu2#FF0033:"Temescal GPU2":STACK GPRINT:curtu2:"%5.1lf %%" GPRINT:avgtu2:"%5.1lf %%" GPRINT:maxtu2:"%5.1lf %%"
+            AREA:tu3#FF0000:"Temescal GPU3":STACK GPRINT:curtu3:"%5.1lf %%" GPRINT:avgtu3:"%5.1lf %%" GPRINT:maxtu3:"%5.1lf %%\l"
+            AREA:yu0#66CC00:"Ynez GPU0    ":STACK GPRINT:curyu0:"%5.1lf %%" GPRINT:avgyu0:"%5.1lf %%" GPRINT:maxyu0:"%5.1lf %%"
+            AREA:yu1#66CC33:"Ynez GPU1    ":STACK GPRINT:curyu1:"%5.1lf %%" GPRINT:avgyu1:"%5.1lf %%" GPRINT:maxyu1:"%5.1lf %%"
+            AREA:yu2#66CC66:"Ynez GPU2    ":STACK GPRINT:curyu2:"%5.1lf %%" GPRINT:avgyu2:"%5.1lf %%" GPRINT:maxyu2:"%5.1lf %%"
+            AREA:yu3#66CC99:"Ynez GPU3    ":STACK GPRINT:curyu3:"%5.1lf %%" GPRINT:avgyu3:"%5.1lf %%" GPRINT:maxyu3:"%5.1lf %%\l"
+            AREA:su0#6600CC:"Serrano GPU0 ":STACK GPRINT:cursu0:"%5.1lf %%" GPRINT:avgsu0:"%5.1lf %%" GPRINT:maxsu0:"%5.1lf %%"
+            AREA:su1#6600FF:"Serrano GPU1 ":STACK GPRINT:cursu1:"%5.1lf %%" GPRINT:avgsu1:"%5.1lf %%" GPRINT:maxsu1:"%5.1lf %%"
+            AREA:su2#9900FF:"Serrano GPU2 ":STACK GPRINT:cursu2:"%5.1lf %%" GPRINT:avgsu2:"%5.1lf %%" GPRINT:maxsu2:"%5.1lf %%"
+            AREA:su3#9900CC:"Serrano GPU3 ":STACK GPRINT:cursu3:"%5.1lf %%" GPRINT:avgsu3:"%5.1lf %%" GPRINT:maxsu3:"%5.1lf %%\l">
+<footer style="text-align:center">
+<hr />
+<a href="https://acme.com/software/thttpd/"><img src="/badges/thttpd.gif" alt="powered by thttpd" height="31" width="88"></a>
+<a href="https://www.freebsd.org/"><img src="/badges/freebsd.gif" alt="powered by FreeBSD" height="31" width="88"></a>
+<a href="https://github.com/ais-ucla/cherf/"><img src="/badges/cherf.gif" alt="powered by cherf" height="31" width="88"></a>
+<address>
+&copy; 2025 Christopher Milan
+<br />
+<a href="/">stats.ais-ucla.org</a>
+</address>
+</footer>
+</body>
+</html>
diff --git a/index.html b/index.html
new file mode 100644 (file)
index 0000000..e954df5
--- /dev/null
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="UTF-8">
+  <title>AIS-UCLA Server Stats</title>
+</head>
+<body style="background-image: url('/bg.gif')">
+  <main>
+    <h1>AIS-UCLA Server Stats</h1>
+    <ul>
+      <li><a href=/cpu.cgi>CPU Report</a></li>
+      <li><a href=/mem.cgi>Memory Report</a></li>
+      <li><a href=/gpu.cgi>GPU Report</a></li>
+    </ul>
+  </main>
+  <footer style="text-align: center">
+    <hr />
+    <a href="https://acme.com/software/thttpd/"><img src="/badges/thttpd.gif" alt="powered by thttpd" height="31" width="88"></a>
+    <a href="https://www.freebsd.org/"><img src="/badges/freebsd.gif" alt="powered by FreeBSD" height="31" width="88"></a>
+    <a href="https://github.com/ais-ucla/cherf/"><img src="/badges/cherf.gif" alt="powered by cherf" height="31" width="88"></a>
+    <address>
+      &copy; 2025 Christopher Milan
+      <br />
+      <a href="/">stats.ais-ucla.org</a>
+    </address>
+  </footer>
+</body>
diff --git a/mem.cgi b/mem.cgi
new file mode 100755 (executable)
index 0000000..286a922
--- /dev/null
+++ b/mem.cgi
@@ -0,0 +1,87 @@
+#!/usr/bin/rrdcgi
+<RRD::SETENV TZ America/Los_Angeles>
+<html>
+<head><title>Cluster Memory Report</title></head>
+<body style="background-image: url('/bg.gif')">
+<h1>Cluster Memory Report</h1>
+<RRD::GRAPH tmem1h.png --title="Temescal Memory Usage, Last Hour"
+            -l 0 -s -1hr -w 480 -h 240 -b 1024
+            DEF:tot=/srv/stats/temescal/mem.rrd:total:AVERAGE
+            DEF:free=/srv/stats/temescal/mem.rrd:free:AVERAGE
+            DEF:avail=/srv/stats/temescal/mem.rrd:avail:AVERAGE
+            CDEF:t=tot,1024,*
+            CDEF:f=free,1024,*
+            CDEF:a=avail,1024,*
+            CDEF:u=t,a,-
+            CDEF:c=a,f,-
+            AREA:u#a00000:"Used"
+            AREA:c#0000a0:"Cache/Buffer":STACK
+            AREA:f#00a000:"Free":STACK>
+<RRD::GRAPH ymem1h.png --title="Ynez Memory Usage, Last Hour"
+            -l 0 -s -1hr -w 480 -h 240 -b 1024
+            DEF:tot=/srv/stats/ynez/mem.rrd:total:AVERAGE
+            DEF:free=/srv/stats/ynez/mem.rrd:free:AVERAGE
+            DEF:avail=/srv/stats/ynez/mem.rrd:avail:AVERAGE
+            CDEF:t=tot,1024,*
+            CDEF:f=free,1024,*
+            CDEF:a=avail,1024,*
+            CDEF:u=t,a,-
+            CDEF:c=a,f,-
+            AREA:u#a00000:"Used"
+            AREA:c#0000a0:"Cache/Buffer":STACK
+            AREA:f#00a000:"Free":STACK>
+<RRD::GRAPH smem1h.png --title="Serrano Memory Usage, Last Hour"
+            -l 0 -s -1hr -w 480 -h 240 -b 1024
+            DEF:tot=/srv/stats/serrano/mem.rrd:total:AVERAGE
+            DEF:free=/srv/stats/serrano/mem.rrd:free:AVERAGE
+            DEF:avail=/srv/stats/serrano/mem.rrd:avail:AVERAGE
+            CDEF:t=tot,1024,*
+            CDEF:f=free,1024,*
+            CDEF:a=avail,1024,*
+            CDEF:u=t,a,-
+            CDEF:c=a,f,-
+            AREA:u#a00000:"Used"
+            AREA:c#0000a0:"Cache/Buffer":STACK
+            AREA:f#00a000:"Free":STACK>
+<RRD::GRAPH mem1d.png --title="Memory Usage, Last Day"
+            -l 0 -r -s -1d -w 960 -h 240 -b 1024
+            DEF:ttot=/srv/stats/temescal/mem.rrd:total:AVERAGE
+            DEF:tfree=/srv/stats/temescal/mem.rrd:free:AVERAGE
+            DEF:tavail=/srv/stats/temescal/mem.rrd:avail:AVERAGE
+            CDEF:tt=ttot,1024,*
+            CDEF:tf=tfree,1024,*
+            CDEF:ta=tavail,1024,*
+            DEF:ytot=/srv/stats/ynez/mem.rrd:total:AVERAGE
+            DEF:yfree=/srv/stats/ynez/mem.rrd:free:AVERAGE
+            DEF:yavail=/srv/stats/ynez/mem.rrd:avail:AVERAGE
+            CDEF:yt=ytot,1024,*
+            CDEF:yf=yfree,1024,*
+            CDEF:ya=yavail,1024,*
+            DEF:stot=/srv/stats/serrano/mem.rrd:total:AVERAGE
+            DEF:sfree=/srv/stats/serrano/mem.rrd:free:AVERAGE
+            DEF:savail=/srv/stats/serrano/mem.rrd:avail:AVERAGE
+            CDEF:st=stot,1024,*
+            CDEF:sf=sfree,1024,*
+            CDEF:sa=savail,1024,*
+            LINE2:tt#a00000:"Temescal MemTotal"
+            LINE2:tf#a00000:"Temescal MemFree"
+            LINE2:tf#a00000:"Temescal MemAvail"
+            LINE2:yt#00a000:"Ynez MemTotal"
+            LINE2:yf#00a000:"Ynez MemFree"
+            LINE2:ya#00a000:"Ynez MemAvail"
+            LINE2:st#0000a0:"Serrano MemTotal"
+            LINE2:sf#0000a0:"Serrano MemFree"
+            LINE2:sa#0000a0:"Serrano MemAvail">
+<footer style="text-align:center">
+<hr />
+<a href="https://acme.com/software/thttpd/"><img src="/badges/thttpd.gif" alt="powered by thttpd" height="31" width="88"></a>
+<a href="https://www.freebsd.org/"><img src="/badges/freebsd.gif" alt="powered by FreeBSD" height="31" width="88"></a>
+<a href="https://github.com/ais-ucla/cherf/"><img src="/badges/cherf.gif" alt="powered by cherf" height="31" width="88"></a>
+<address>
+&copy; 2025 Christopher Milan
+<br />
+<a href="/">stats.ais-ucla.org</a>
+</address>
+</footer>
+</body>
+</html>