slitaz-forge annotate chub/web/lib/makegraphs @ rev 713

makegraphs: tune cpuinfo
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jan 15 08:07:41 2021 +0000 (2021-01-15)
parents 061a079077a3
children
rev   line source
pankso@134 1 #!/bin/sh
pankso@134 2 #*/5 * * * * /home/slitaz/www/chub/lib/makegraphs >/dev/null
pankso@134 3
pankso@134 4 # RRD database directory
pankso@134 5 rrdlog="/home/slitaz/www/chub/log/rrd"
pankso@134 6
pankso@134 7 # Images directory
pankso@134 8 rrdgraph="/home/slitaz/www/chub/images/rrd"
pankso@134 9
pankso@134 10 # Colors
pankso@134 11 rrdcolors="--color SHADEA#FFFFFF --color SHADEB#FFFFFF --color BACK#FFFFFF"
pankso@134 12 rrdgraphargs="-aPNG -i -z --alt-y-grid -w 600 -h 100 -r $rrdcolors"
pankso@134 13
pankso@134 14 [ -d $rrdlog ] || mkdir -p $rrdlog
pankso@134 15 [ -d $rrdgraph ] || mkdir -p $rrdgraph
pankso@134 16
pankso@134 17 updatecpudata() {
pankso@134 18 [ -e "$rrdlog/cpu.rrd" ] || rrdtool create $rrdlog/cpu.rrd --step=300 \
pankso@134 19 DS:user:COUNTER:600:0:500000000 \
pankso@134 20 DS:nice:COUNTER:600:0:500000000 \
pankso@134 21 DS:system:COUNTER:600:0:500000000 \
pankso@134 22 DS:idle:COUNTER:600:0:500000000 \
pankso@134 23 DS:iowait:COUNTER:600:0:500000000 \
pankso@134 24 DS:irq:COUNTER:600:0:500000000 \
pankso@134 25 DS:softirq:COUNTER:600:0:500000000 \
pascal@339 26 DS:celsius:GAUGE:600:0:100000 \
pankso@134 27 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
pankso@134 28 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@134 29 grep '^cpu' /proc/stat | while read cpu user nice system idle iowait irq softirq misc; do
pankso@134 30 celsius=$(find /sys | grep /temp._input | xargs cat | \
pankso@134 31 awk '{ if ($0 > max) max=$0 } END { print max/1 }')
pankso@134 32 rrdtool update $rrdlog/cpu.rrd \
pankso@134 33 -t celsius:nice:user:system:idle:iowait:irq:softirq \
pankso@134 34 N:$celsius:$nice:$user:$system:$idle:$iowait:$irq:$softirq
pankso@134 35 break
pankso@134 36 done
pankso@134 37 }
pankso@134 38
pankso@134 39 updatecpugraph() {
pankso@134 40 period=$1
pascal@713 41 info="$(grep '^model name' /etc/cpuinfo | cut -d: -f2 \
pankso@134 42 | sed 's/ * / /g' | awk '
pankso@134 43 { s=$0 ; n++ }
pankso@134 44 END { if (n > 1) printf " %dx",n; print s }')"
pankso@134 45 rrdtool graph "$rrdgraph/cpu-$period.png" --start -1$period \
pankso@134 46 $rrdgraphargs -l 0 -u 100 -t "cpu usage per $period [$info ]" \
pankso@134 47 DEF:user=$rrdlog/cpu.rrd:user:AVERAGE \
pankso@134 48 DEF:system=$rrdlog/cpu.rrd:system:AVERAGE \
pankso@134 49 DEF:idle=$rrdlog/cpu.rrd:idle:AVERAGE \
pankso@134 50 DEF:nice=$rrdlog/cpu.rrd:nice:AVERAGE \
pankso@134 51 DEF:celsius=$rrdlog/cpu.rrd:celsius:AVERAGE \
pankso@134 52 'CDEF:total=user,system,idle,nice,+,+,+' \
pankso@134 53 'CDEF:userpct=100,user,total,/,*' \
pankso@134 54 'CDEF:systempct=100,system,total,/,*' \
pankso@134 55 'CDEF:idlepct=100,idle,total,/,*' \
pankso@134 56 'CDEF:nicepct=100,nice,total,/,*' \
pankso@134 57 'CDEF:temp=celsius,1000,/' \
pankso@134 58 'AREA:userpct#0000FF:user cpu usage' \
pankso@134 59 'STACK:nicepct#C0C0FF:nice cpu usage' \
pankso@134 60 'STACK:systempct#FF0000:system cpu usage' \
pankso@134 61 'STACK:idlepct#00FF00:idle cpu usage' \
pankso@134 62 'LINE1:temp#000000:temperature\g' \
pankso@134 63 'GPRINT:temp:MAX:max %2.0lfC\j'
pankso@134 64 }
pankso@134 65
pankso@134 66 updatememgraph() {
pankso@134 67 period=$1
pankso@134 68 info="$(free | awk '\
pankso@134 69 { \
pankso@134 70 if (/Mem:/) { \
pankso@134 71 if ($2 < 10000) printf "%d KB",$2; \
pankso@134 72 else if ($2 < 10000000) printf "%d MB",$2/1024; \
pankso@134 73 else printf "%d GB",$2/1024/1024; \
pankso@134 74 } \
pankso@134 75 }')"
pankso@134 76 info2="$(free | awk '\
pankso@134 77 { \
pankso@134 78 if (/Swap:/) { \
pankso@134 79 if ($2 < 10000) printf "%d KB",$2; \
pankso@134 80 else if ($2 < 10000000) printf "%d MB",$2/1024; \
pankso@134 81 else printf "%d GB",$2/1024/1024; \
pankso@134 82 } \
pankso@134 83 }')"
pankso@134 84 rrdtool graph "$rrdgraph/memory-$period.png" --start -1$period \
pankso@134 85 $rrdgraphargs -l 0 -u 100 \
pankso@134 86 -t "memory usage per $period [ $info + $info2 swap ]" \
pankso@134 87 DEF:used=$rrdlog/mem.rrd:memused:AVERAGE \
pankso@134 88 DEF:free=$rrdlog/mem.rrd:memfree:AVERAGE \
pankso@134 89 DEF:shared=$rrdlog/mem.rrd:memshared:AVERAGE \
pankso@134 90 DEF:buffer=$rrdlog/mem.rrd:membuffers:AVERAGE \
pankso@134 91 DEF:cache=$rrdlog/mem.rrd:memcache:AVERAGE \
pankso@134 92 DEF:swused=$rrdlog/mem.rrd:swapused:AVERAGE \
pankso@134 93 DEF:swfree=$rrdlog/mem.rrd:swapfree:AVERAGE \
pankso@134 94 'CDEF:total=used,free,+' \
pankso@134 95 'CDEF:used2=used,buffer,cache,shared,+,+,-' \
pankso@134 96 'CDEF:usedpct=100,used2,total,/,*' \
pankso@134 97 'CDEF:sharedpct=100,shared,total,/,*' \
pankso@134 98 'CDEF:bufferpct=100,buffer,total,/,*' \
pankso@134 99 'CDEF:cachepct=100,cache,total,/,*' \
pankso@134 100 'CDEF:freepct=100,free,total,/,*' \
pankso@134 101 'CDEF:swtotal=swused,swfree,+' \
pankso@134 102 'CDEF:swusedpct=100,swused,swtotal,/,*' \
pankso@134 103 'AREA:usedpct#0000FF:used memory' \
pankso@134 104 'STACK:sharedpct#FF7F00:shared memory' \
pankso@134 105 'STACK:bufferpct#FF00FF:buffered memory' \
pankso@134 106 'STACK:cachepct#FFFF00:cached memory' \
pankso@134 107 'STACK:freepct#00FF00:free memory' \
pankso@134 108 'LINE2:swusedpct#FF0000:used swap\j'
pankso@134 109 }
pankso@134 110
pankso@134 111 updatememdata () {
pankso@134 112 [ -e "$rrdlog/mem.rrd" ] ||
pankso@134 113 rrdtool create "$rrdlog/mem.rrd" --step=300 \
pankso@134 114 DS:memused:ABSOLUTE:600:0:5000000000 \
pankso@134 115 DS:memfree:ABSOLUTE:600:0:5000000000 \
pankso@134 116 DS:memshared:ABSOLUTE:600:0:5000000000 \
pankso@134 117 DS:membuffers:ABSOLUTE:600:0:5000000000 \
pankso@134 118 DS:memcache:ABSOLUTE:600:0:5000000000 \
pankso@134 119 DS:swapused:ABSOLUTE:600:0:5000000000 \
pankso@134 120 DS:swapfree:ABSOLUTE:600:0:5000000000 \
pankso@134 121 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
pankso@134 122 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@134 123
pankso@134 124 while read tag count unit; do
pankso@134 125 case "$tag" in
pankso@134 126 MemTotal:) memtotal=$count;;
pankso@134 127 MemFree:) memfree=$count
pankso@134 128 memused=$(($memtotal - $memfree))
pankso@134 129 memshared=0;;
pankso@134 130 MemShared:) memshared=$count;;
pankso@134 131 Buffers:) membuffers=$count;;
pankso@134 132 Cached:) memcache=$count;;
pankso@134 133 SwapTotal:) swaptotal=$count;;
pankso@134 134 SwapFree:) swapfree=$count
pankso@134 135 swapused=$(( $swaptotal - $swapfree));;
pankso@134 136 esac
pankso@134 137 done < /proc/meminfo
pankso@134 138
pankso@134 139 rrdtool update "$rrdlog/mem.rrd" \
pankso@134 140 -t memused:memfree:memshared:membuffers:memcache:swapused:swapfree \
pankso@134 141 "N:$memused:$memfree:$memshared:$membuffers:$memcache:$swapused:$swapfree"
pankso@134 142 }
pankso@134 143
pankso@134 144 getmax() {
pankso@134 145 rrdtool fetch $rrdlog/$1.rrd AVERAGE | awk '\
pankso@134 146 BEGIN {max=0} \
pankso@134 147 /^[0-9]/ { \
pankso@134 148 if ($2 != "nan" && $2 > max) max=$2; \
pankso@134 149 if ($3 != "nan" && $3 > max) max=$3; \
pankso@134 150 } \
pankso@134 151 END { print max }' | sed 's/,/./'
pankso@134 152 }
pankso@134 153
pankso@134 154 updatediskgraph() {
pankso@134 155 period=$1
pascal@698 156 [ "$period" = "day" ] && maxdisk="$(getmax disk)"
pankso@134 157 info=""
pankso@134 158 [ -r $2 ] &&
pankso@134 159 info="[ $(fdisk -l 2> /dev/null | grep "^Disk $2:" | \
pankso@134 160 sed "s|Disk $2: \(.*\), .*|\1|") ]"
pankso@134 161 if [ -e /sys/block/${2#/dev/}/device/iodone_cnt ]; then
pankso@134 162 err=$(printf "%d\n" $(cat /sys/block/${2#/dev/}/device/ioerr_cnt) )
pankso@134 163 done=$(printf "%d\n" $(cat /sys/block/${2#/dev/}/device/iodone_cnt) )
pankso@134 164 rate=$(echo | awk "BEGIN { printf \"%.0e\\n\",$err/$done }")
pankso@134 165 [ $err -eq 0 ] && rate="0"
pankso@134 166 # --right-axis-label "I/O state %"
pascal@334 167 # BUG workaround: swap readsect and writesect :-/
pankso@134 168 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
pankso@134 169 $rrdgraphargs -t "disk access per $period $info" \
pankso@134 170 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
pankso@134 171 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
pankso@134 172 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
pankso@134 173 DEF:req=$rrdlog/iodisk.rrd:req:AVERAGE \
pankso@134 174 DEF:done=$rrdlog/iodisk.rrd:done:AVERAGE \
pankso@134 175 DEF:err=$rrdlog/iodisk.rrd:err:AVERAGE \
pankso@134 176 "CDEF:readpct=100,read,$maxdisk,/,*" \
pankso@134 177 "CDEF:writepct=100,write,$maxdisk,/,*" \
pankso@134 178 "CDEF:errpct=100,err,req,/,*" \
pankso@134 179 "CDEF:donepct=100,done,req,/,*" \
pankso@134 180 "CDEF:errrate=err,done,/" \
pascal@334 181 'AREA:readpct#0000FF:sectors written from disk' \
pankso@134 182 "COMMENT:I/O error rate $rate" \
pascal@334 183 'STACK:writepct#00FF00:sectors read to disk' \
pankso@134 184 'LINE2:donepct#FFFF00:% I/O complete' \
pankso@134 185 'LINE2:errpct#FF0000:% I/O error\j'
pankso@134 186 else
pankso@134 187 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
pankso@134 188 $rrdgraphargs -t "disk access per $period $info" \
pankso@134 189 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
pankso@134 190 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
pankso@134 191 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
pankso@134 192 "CDEF:readpct=100,read,$maxdisk,/,*" \
pankso@134 193 "CDEF:writepct=100,write,$maxdisk,/,*" \
pascal@334 194 'AREA:readpct#0000FF:sectors written from disk' \
pascal@334 195 'STACK:writepct#00FF00:sectors read to disk'
pankso@134 196 fi
pankso@134 197 }
pankso@134 198
pankso@134 199 updatediskdata() {
pankso@134 200 dev=$1
pankso@134 201 [ -e "$rrdlog/disk.rrd" ] ||
pankso@134 202 rrdtool create "$rrdlog/disk.rrd" --step=300 \
pankso@134 203 DS:readsect:COUNTER:600:0:5000000000 \
pankso@134 204 DS:writesect:COUNTER:600:0:5000000000 \
pankso@134 205 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
pankso@134 206 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@134 207 [ -e "$rrdlog/iodisk.rrd" ] ||
pankso@134 208 rrdtool create "$rrdlog/iodisk.rrd" --step=300 \
pankso@134 209 DS:done:GAUGE:600:0:U DS:err:GAUGE:600:0:U \
pankso@134 210 DS:req:GAUGE:600:0:U \
pankso@134 211 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
pankso@134 212 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@134 213
pankso@134 214 while read major minor name readreq readsect writereq writesect misc; do
pankso@134 215 [ $major = $(( 0x$(stat -c %t $dev) )) ] || continue
pankso@134 216 [ $minor = $(( 0x$(stat -c %T $dev) )) ] || continue
pankso@134 217 rrdtool update "$rrdlog/disk.rrd" -t readsect:writesect \
pankso@134 218 N:$readsect:$writesect
pankso@134 219 done < /proc/diskstats
pankso@134 220 disk=${dev:0:8}
pankso@134 221 dir=/sys/block/${disk#/dev/}/device
pankso@134 222 done=$(printf "%d\n" $(cat $dir/iodone_cnt 2> /dev/null) )
pankso@134 223 err=$(printf "%d\n" $(cat $dir/ioerr_cnt 2> /dev/null) )
pankso@134 224 req=$(printf "%d\n" $(cat $dir/iorequest_cnt 2> /dev/null) )
pankso@134 225 rrdtool update "$rrdlog/iodisk.rrd" -t done:err:req N:$done:$err:$req
pankso@134 226 }
pankso@134 227
pankso@134 228 updateifgraph() {
pankso@134 229 interface=$1
pankso@134 230 period=$2
pankso@134 231 rrdtool graph "$rrdgraph/$interface-$period.png" --start -1$period \
pankso@134 232 $rrdgraphargs -t "traffic on $interface graph per $period" \
pankso@134 233 --logarithmic -A -v "Bytes/second" --units=si \
pankso@134 234 DEF:incoming=$rrdlog/$interface.rrd:incoming:AVERAGE \
pankso@134 235 DEF:outgoing=$rrdlog/$interface.rrd:outgoing:AVERAGE \
pankso@134 236 'AREA:incoming#00FF00:incoming traffic' \
pankso@134 237 'GPRINT:incoming:MAX:max input%8.3lf %sBps' \
pankso@134 238 'GPRINT:outgoing:MAX:max output%8.3lf %sBps' \
pankso@134 239 'LINE1:outgoing#0000FF:outgoing traffic\j'
pankso@134 240 }
pankso@134 241
pankso@134 242 netframes() {
pankso@134 243 ifconfig $1 | grep "$2 packets" | sed -re "s/.*$3:([0-9]+).*/\1/g"
pankso@134 244 }
pankso@134 245
pankso@134 246 netstats() {
pankso@134 247 ifconfig $1 | grep bytes | sed -re "s/.*$2 bytes:([0-9]+).*/\1/g"
pankso@134 248 }
pankso@134 249
pankso@134 250 updateifdata() {
pankso@134 251 interface=$1
pankso@134 252 [ -e "$rrdlog/$interface.rrd" ] ||
pankso@134 253 rrdtool create "$rrdlog/$interface.rrd" --step=300 \
pankso@134 254 DS:incoming:COUNTER:600:0:U \
pankso@134 255 DS:outgoing:COUNTER:600:0:U \
pankso@134 256 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
pankso@134 257 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@134 258 [ -e "$rrdlog/packets-$interface.rrd" ] ||
pankso@134 259 rrdtool create "$rrdlog/packets-$interface.rrd" --step=300 \
pankso@134 260 DS:in:COUNTER:600:0:U DS:out:COUNTER:600:0:U \
pankso@134 261 DS:inerr:COUNTER:600:0:U DS:outerr:COUNTER:600:0:U \
pankso@134 262 DS:indrop:COUNTER:600:0:U DS:outdrop:COUNTER:600:0:U \
pankso@134 263 DS:inov:COUNTER:600:0:U DS:outov:COUNTER:600:0:U \
pankso@134 264 DS:frame:COUNTER:600:0:U DS:carrier:COUNTER:600:0:U \
pankso@134 265 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
pankso@134 266 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@134 267 rx=$(netstats $interface RX)
pankso@134 268 tx=$(netstats $interface TX)
pankso@134 269 rrdtool update "$rrdlog/$interface.rrd" -t incoming:outgoing \
pankso@134 270 N:${rx:-U}:${tx:-U}
pankso@134 271 rx=$(netframes $interface RX packets)
pankso@134 272 tx=$(netframes $interface TX packets)
pankso@134 273 rxerr=$(netframes $interface RX errors)
pankso@134 274 txerr=$(netframes $interface TX errors)
pankso@134 275 rxdrop=$(netframes $interface RX dropped)
pankso@134 276 txdrop=$(netframes $interface TX dropped)
pankso@134 277 rxov=$(netframes $interface RX overruns)
pankso@134 278 txov=$(netframes $interface TX overruns)
pankso@134 279 frame=$(netframes $interface RX frame)
pankso@134 280 carrier=$(netframes $interface TX carrier)
pankso@134 281 rrdtool update "$rrdlog/packets-$interface.rrd" \
pankso@134 282 -t in:out:inerr:outerr:indrop:outdrop:inov:outov:frame:carrier \
pankso@134 283 N:${rx:-U}:${tx:-U}:${rxerr:-U}:${txerr:-U}:${rxdrop:-U}:${txdrop:-U}:${rxov:-U}:${txov:-U}:${frame:-U}:${carrier:-U}
pankso@134 284 }
pankso@134 285
pankso@134 286 getdisk()
pankso@134 287 {
pankso@134 288 local d
pankso@134 289 local i
pankso@134 290 d=$(stat -c %04D $1)
pankso@134 291 for i in /dev/* ; do
pascal@698 292 [ $(stat -c "%02t%02T" $i) = $d ] || continue
pankso@134 293 echo $i
pankso@134 294 break
pankso@134 295 done
pankso@134 296 }
pankso@134 297
pankso@134 298 ###
pankso@134 299 ### System graphs
pankso@134 300 ###
pankso@134 301
pankso@134 302 updatecpudata
pankso@134 303 updatecpugraph day
pankso@134 304 updatecpugraph week
pankso@134 305 updatecpugraph month
pankso@134 306 updatecpugraph year
pankso@134 307
pankso@134 308 updatememdata
pankso@134 309 updatememgraph day
pankso@134 310 updatememgraph week
pankso@134 311 updatememgraph month
pankso@134 312 updatememgraph year
pankso@134 313
pankso@134 314 if [ -e /proc/diskstats ]; then
pankso@134 315 disk=$(getdisk $0)
pankso@134 316 updatediskdata $disk
pankso@134 317 updatediskgraph day ${disk:0:8}
pankso@134 318 updatediskgraph week ${disk:0:8}
pankso@134 319 updatediskgraph month ${disk:0:8}
pankso@134 320 updatediskgraph year ${disk:0:8}
pankso@134 321 fi
pankso@134 322
pankso@134 323 iface=$(/sbin/route -n | awk '{ if (/^0.0.0.0/) print $8 }')
pankso@134 324 updateifdata $iface
pankso@134 325 updateifgraph $iface day
pankso@134 326 updateifgraph $iface week
pankso@134 327 updateifgraph $iface month
pankso@134 328 updateifgraph $iface year