mirror of
https://github.com/munin-monitoring/contrib.git
synced 2018-11-08 00:59:34 +01:00
144 lines
3.3 KiB
Bash
Executable File
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 |