2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/other/cpufreq-avg
2011-12-18 15:10:20 +01:00

144 lines
3.3 KiB
Bash
Executable File

#!/bin/sh
#
# Plugin to measure average CPU frequency for each CPU/core.
#
# Contributed by Mark Edwards
#
# Usage: Place in /etc/munin/plugins (or link it there using ln -s)
#
# Parameters understood:
#
# config (required)
# autoconf (optional - used by munin-config)
#
# $Log$
#
# Revision 0.2 2010/01/04 16:37:00 medwards
# Minor bugfixes in config section
#
# Revision 0.1 2010/01/04 16:13:00 medwards
# First version
#
#
#
# Magic markers - optional - used by installation scripts and
# munin-config:
#
#%# family=auto
#%# capabilities=autoconf
if [ "$1" = "autoconf" ]; then
if [ -r /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state ]; then
echo yes
exit 0
else
echo no
exit 1
fi
fi
cpu_count=`grep -c "^processor" /proc/cpuinfo`
if [ "$1" = "config" ]; then
echo 'graph_title Average CPU Frequency'
up_lim=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq`
low_lim=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq`
up_lim=`expr $up_lim \* 1000` # Convert to Hz
low_lim=`expr $low_lim \* 1000` # Convert to Hz
echo "graph_args -u $up_lim -l $low_lim -r --base 1000"
echo 'graph_vlabel Hz'
echo 'graph_category system'
cpu=0
while [ $cpu -lt $cpu_count ]
do
echo "cpu_$cpu.label CPU $cpu"
echo "cpu_$cpu.type GAUGE"
echo "cpu_$cpu.info Hz"
cpu=`expr $cpu + 1`
done
exit 0
fi
# Run measurements
cpu=0
while [ $cpu -lt $cpu_count ]
do
time_in_state=`cat /sys/devices/system/cpu/cpu$cpu/cpufreq/stats/time_in_state`
# Check/create statefile(s)
statefile="/var/lib/munin/plugin-state/cpufreq-avg_cpu$cpu.state"
if [ ! -r "$statefile" ]
then
echo "$time_in_state" > $statefile
if [ "$?" -ne "0" ]
then
exit ${1}
else
cpu=`expr $cpu + 1`
continue
fi
fi
state=`cat $statefile`
# Calculated total time since last state
total_time=0
total_time=$(
echo "$time_in_state" | {
i=0
while read line
do
this_freq=`echo $line | awk '{ print $1; }'`
this_time=`echo $line | awk '{ print $2; }'`
this_time_state=`echo "$state" | grep $this_freq | awk '{ print $2; }'`
if [ $this_time -ge $this_time_state ] # Only measure if state is valid
then
time_diff=`expr $this_time - $this_time_state` # Calculate time since last state
total_time=`expr $total_time + $time_diff`
fi
i=`expr $i + 1`
done
echo $total_time
}
)
# Measure average CPU frequency if total time calculation was successful
frequency=0
frequency=$(
echo "$time_in_state" | {
i=0
while read line
do
this_freq=`echo $line | awk '{ print $1; }'`
this_time=`echo $line | awk '{ print $2; }'`
this_time_state=`echo "$state" | grep $this_freq | awk '{ print $2; }'`
this_freq=`expr $this_freq \* 1000` # Convert to Hz
this_time=`expr $this_time - $this_time_state` # Calculate time since last state
if [ $total_time -gt 0 ]
then
calc=`echo "($this_time / $total_time) * $this_freq" | bc -l`
frequency=`echo "$frequency + $calc" | bc -l`
fi
i=`expr $i + 1`
done
echo $frequency
}
)
# Round result to an integer and return it
frequency=`echo "scale=0 ; ($frequency+0.5)/1" | bc -l`
if [ $frequency -gt 0 ]
then
echo "cpu_$cpu.value $frequency"
fi
# Update statefile
echo "$time_in_state" > $statefile
cpu=`expr $cpu + 1`
done
exit 0