| #!/bin/sh |
| # |
| # Test Case 5 - sar |
| # |
| |
| export TCID="cpuhotplug05" |
| export TST_TOTAL=1 |
| export LC_TIME="POSIX" |
| |
| # Includes: |
| . test.sh |
| . cpuhotplug_testsuite.sh |
| . cpuhotplug_hotplug.sh |
| |
| cat <<EOF |
| Name: $TCID |
| Date: `date` |
| Desc: Does sar behave properly during CPU hotplug events? |
| |
| EOF |
| |
| usage() |
| { |
| cat << EOF |
| usage: $0 -c cpu -l loop -d directory |
| |
| OPTIONS |
| -c cpu which is specified for testing |
| -l number of cycle test |
| -d directory used to lay file |
| |
| EOF |
| exit 1 |
| } |
| |
| do_clean() |
| { |
| pid_is_valid ${SAR_PID} && kill_pid ${SAR_PID} |
| online_cpu "$CPU_TO_TEST" |
| } |
| |
| get_field() |
| { |
| echo "$1" | awk "{print \$$2}" |
| } |
| |
| while getopts c:l:d: OPTION; do |
| case $OPTION in |
| c) |
| CPU_TO_TEST=$OPTARG;; |
| l) |
| HOTPLUG05_LOOPS=$OPTARG;; |
| d) |
| TMP=$OPTARG;; |
| ?) |
| usage;; |
| esac |
| done |
| |
| LOOP_COUNT=1 |
| |
| tst_check_cmds sar |
| |
| if [ $(get_present_cpus_num) -lt 2 ]; then |
| tst_brkm TCONF "system doesn't have required CPU hotplug support" |
| fi |
| |
| if [ -z "$CPU_TO_TEST" ]; then |
| tst_brkm TBROK "usage: ${0##*} <CPU to offline>" |
| fi |
| |
| # Validate the specified CPU is available |
| if ! cpu_is_valid "${CPU_TO_TEST}" ; then |
| tst_brkm TCONF "cpu${CPU_TO_TEST} doesn't support hotplug" |
| fi |
| |
| # Check that the specified CPU is offline; if not, offline it |
| if cpu_is_online "${CPU_TO_TEST}" ; then |
| if ! offline_cpu ${CPU_TO_TEST} ; then |
| tst_brkm TBROK "CPU${CPU_TO_TEST} cannot be offlined" |
| fi |
| fi |
| |
| TST_CLEANUP=do_clean |
| |
| LOG_FILE="$TMP/log_$$" |
| |
| until [ $LOOP_COUNT -gt $HOTPLUG05_LOOPS ]; do |
| |
| # Start up SAR and give it a couple cycles to run |
| sar 1 0 >/dev/null 2>&1 & |
| sleep 2 |
| # "sar 1 0" is supported before 'sysstat-8.1.4(include sar)', |
| # after that use "sar 1" instead of. Use 'ps -C sar' to check. |
| if ps -C sar >/dev/null 2>&1; then |
| pkill sar |
| sar -P "$CPU_TO_TEST" 1 0 > "$LOG_FILE" & |
| else |
| sar -P "$CPU_TO_TEST" 1 > "$LOG_FILE" & |
| fi |
| sleep 2 |
| SAR_PID=$! |
| |
| # Since the CPU is offline, SAR should display all the 6 fields |
| # of CPU statistics as '0.00' |
| offline_status=$(tail -n 1 "$LOG_FILE") |
| if [ -z "$offline_status" ]; then |
| tst_brkm TBROK "SAR output file is empty" |
| fi |
| |
| for i in $(seq 3 8); do |
| field=$(get_field "$offline_status" "$i") |
| if [ "$field" != "0.00" ]; then |
| tst_brkm TBROK "Field $i is '$field', '0.00' expected" |
| fi |
| done |
| |
| # Online the CPU |
| if ! online_cpu ${CPU_TO_TEST}; then |
| tst_brkm TBROK "CPU${CPU_TO_TEST} cannot be onlined" |
| fi |
| |
| sleep 2 |
| |
| # Check that SAR registered the change in CPU online/offline states |
| online_status=$(tail -n 1 "$LOG_FILE") |
| check_passed=0 |
| for i in $(seq 3 8); do |
| field_online=$(get_field "$online_status" "$i") |
| |
| if [ "$field_online" != "0.00" ]; then |
| check_passed=1 |
| break |
| fi |
| done |
| |
| if [ $check_passed -eq 0 ]; then |
| tst_resm TFAIL "No change in the CPU statistics" |
| tst_exit |
| fi |
| |
| offline_cpu ${CPU_TO_TEST} |
| kill_pid ${SAR_PID} |
| |
| LOOP_COUNT=$((LOOP_COUNT+1)) |
| |
| done |
| |
| tst_resm TPASS "SAR updated statistics after the CPU was turned on." |
| |
| tst_exit |