1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#!/bin/sh
# PCP QA Test No. 1158
# Exercise the BCC PMDA biotop module - install, remove and values.
#
# Copyright (c) 2018 Andreas Gerstmayr.
#
seq=`basename $0`
echo "QA output created by $seq"
. ./common.bcc
_pmdabcc_check
_bcc_check_ArgString || _notrun "bcc is broken (ArgString bug) on this platform"
# the biotop BCC module uses kprobes that might attach to kernel symbols
# that are not present ... add to the list below as required
#
for symbol in blk_account_io_done
do
grep " T $symbol\$" /proc/kallsyms >/dev/null || _notrun "kernel does not contain required $symbol symbol"
done
status=1 # failure is the default!
signal=$PCP_BINADM_DIR/pmsignal
write_size=`expr 20 \* 1024 \* 1024` # number of bytes to write into testfile
out_file="$PCP_TMPFILE_DIR/pcp-qa-$seq" # block device required here (no tmpfs)
# tolerance ... +- slop %
#
slop=20
_value_filter_bytes()
{
cat > $tmp.value
echo === input to _value_filter >>$seq_full
cat $tmp.value >> $seq_full
_found=false
_values=`awk '/inst.*value/ {print $NF}' $tmp.value`
for value in $_values
do
if _within_tolerance "Expecting ${write_size} +- $slop%" $value ${write_size} $slop%
then
echo "found value ${write_size} +- $slop%"
_found=true
break
fi
done
if ! $_found
then
echo "Failed to find writer process [expecting ${write_size} +- $slop%] in:"
cat $tmp.value
fi
}
_cleanup()
{
_pmdabcc_cleanup
$sudo rm -f "$out_file"
}
cat <<EOF >$tmp.conf
# Installed by PCP QA test $seq on `date`
[pmda]
modules = biotop
prefix = bcc.
[biotop]
module = biotop
cluster = 10
interval = 5
debug = True
EOF
_pmdabcc_try_compile $tmp.conf
_prepare_pmda bcc
trap "_cleanup; exit \$status" 0 1 2 3 15
_stop_auto_restart pmcd
# real QA test starts here
_pmdabcc_install <$tmp.conf
_pmdabcc_wait_for_metric
# Generate system activity for the BCC biotop module
echo Started dd at $(date) >> $seq_full
dd if=/dev/zero of=${out_file} bs=${write_size} count=1 oflag=direct 2>>$seq_full
# wait until PMDA refreshes BPF table containing dd
_pmdabcc_wait_for_value bcc.proc.io.perdev.comm '("dd"|"dmcrypt_write/\d+")'
echo "=== report metric values for pid ==="
pminfo -dfmtT bcc.proc.io.perdev.pid 2>&1 | tee -a $seq_full \
| _value_filter_nonzero
echo "=== report metric values for comm ==="
pminfo -dfmtT bcc.proc.io.perdev.comm 2>&1 | tee -a $seq_full \
| _value_filter_regex '("dd"|"dmcrypt_write/\d+")'
echo "=== report metric values for direction ==="
pminfo -dfmtT bcc.proc.io.perdev.direction 2>&1 | tee -a $seq_full \
| _value_filter_exact '"W"'
echo "=== report metric values for major ==="
pminfo -dfmtT bcc.proc.io.perdev.major 2>&1 | tee -a $seq_full \
| _value_filter_nonzero
echo "=== report metric values for minor ==="
pminfo -dfmtT bcc.proc.io.perdev.minor 2>&1 | tee -a $seq_full \
| _value_filter_any
echo "=== report metric values for disk ==="
pminfo -dfmtT bcc.proc.io.perdev.disk 2>&1 | tee -a $seq_full \
| _value_filter_any
echo "=== report metric values for io ==="
pminfo -dfmtT bcc.proc.io.perdev.io 2>&1 | tee -a $seq_full \
| _value_filter_nonzero
echo "=== report metric values for bytes ==="
pminfo -dfmtT bcc.proc.io.perdev.bytes 2>&1 | tee -a $seq_full \
| _value_filter_bytes
echo "=== report metric values for duration ==="
pminfo -dfmtT bcc.proc.io.perdev.duration 2>&1 | tee -a $seq_full \
| _value_filter_nonzero
_pmdabcc_remove
status=0
exit
|