15f35090dSAndrew Geissler#!/bin/bash
295ac1b8dSAndrew Geissler#
3*92b42cb3SPatrick Williams# Copyright OpenEmbedded Contributors
4*92b42cb3SPatrick Williams#
5*92b42cb3SPatrick Williams# SPDX-License-Identifier: MIT
6*92b42cb3SPatrick Williams#
795ac1b8dSAndrew Geissler# oe-time-dd-test records how much time it takes to
895ac1b8dSAndrew Geissler# write <count> number of kilobytes to the filesystem.
995ac1b8dSAndrew Geissler# It also records the number of processes that are in
1095ac1b8dSAndrew Geissler# running (R), uninterruptible sleep (D) and interruptible
1195ac1b8dSAndrew Geissler# sleep (S) state from the output of "top" command.
1295ac1b8dSAndrew Geissler# The purporse of this script is to find which part of
1395ac1b8dSAndrew Geissler# the build system puts stress on the filesystem io and
1495ac1b8dSAndrew Geissler# log all the processes.
1595ac1b8dSAndrew Geisslerusage() {
165f35090dSAndrew Geissler	echo "$0 is used to detect i/o latency and runs commands to display host information."
175f35090dSAndrew Geissler	echo "The following commands are run in order:"
185f35090dSAndrew Geissler	echo "1) top -c -b -n1 -w 512"
195f35090dSAndrew Geissler	echo "2) iostat -y -z -x 5 1"
205f35090dSAndrew Geissler	echo "3) tail -30 tmp*/log/cooker/*/console-latest.log to gather cooker log."
215f35090dSAndrew Geissler	echo " "
225f35090dSAndrew Geissler	echo "Options:"
235f35090dSAndrew Geissler	echo "-c | --count <amount>		dd (transfer) <amount> KiB of data within specified timeout to detect latency."
245f35090dSAndrew Geissler	echo "				Must enable -t option."
255f35090dSAndrew Geissler	echo "-t | --timeout <time>		timeout in seconds for the <count> amount of data to be transferred."
265f35090dSAndrew Geissler	echo "-l | --log-only			run the commands without performing the data transfer."
275f35090dSAndrew Geissler	echo "-h | --help			show help"
285f35090dSAndrew Geissler
2995ac1b8dSAndrew Geissler}
3095ac1b8dSAndrew Geissler
315f35090dSAndrew Geisslerrun_cmds() {
320903674eSAndrew Geissler    echo "start: top output"
33c926e17cSAndrew Geissler	top -c -b -n1 -w 512
340903674eSAndrew Geissler	echo "end: top output"
350903674eSAndrew Geissler	echo "start: iostat"
360903674eSAndrew Geissler	iostat -y -z -x 5 1
370903674eSAndrew Geissler	echo "end: iostat"
380903674eSAndrew Geissler	echo "start: cooker log"
39c926e17cSAndrew Geissler	tail -30 tmp*/log/cooker/*/console-latest.log
400903674eSAndrew Geissler	echo "end: cooker log"
415f35090dSAndrew Geissler}
425f35090dSAndrew Geissler
435f35090dSAndrew Geisslerif [ $# -lt 1 ]; then
445f35090dSAndrew Geissler	usage
455f35090dSAndrew Geissler	exit 1
465f35090dSAndrew Geisslerfi
475f35090dSAndrew Geissler
485f35090dSAndrew Geisslerre_c='^[0-9]+$'
495f35090dSAndrew Geissler#re_t='^[0-9]+([.][0-9]+)?$'
505f35090dSAndrew Geissler
515f35090dSAndrew Geisslerwhile [[ $# -gt 0 ]]; do
525f35090dSAndrew Geissler	key="$1"
535f35090dSAndrew Geissler
545f35090dSAndrew Geissler	case $key in
555f35090dSAndrew Geissler		-c|--count)
565f35090dSAndrew Geissler			COUNT=$2
575f35090dSAndrew Geissler			shift
585f35090dSAndrew Geissler			shift
595f35090dSAndrew Geissler			if ! [[ $COUNT =~ $re_c ]] || [[ $COUNT -le 0 ]] ; then
605f35090dSAndrew Geissler				usage
615f35090dSAndrew Geissler				exit 1
625f35090dSAndrew Geissler			fi
635f35090dSAndrew Geissler			;;
645f35090dSAndrew Geissler		-t|--timeout)
655f35090dSAndrew Geissler			TIMEOUT=$2
665f35090dSAndrew Geissler			shift
675f35090dSAndrew Geissler			shift
685f35090dSAndrew Geissler			if ! [[ $TIMEOUT =~ $re_c ]] || [[ $TIMEOUT -le 0 ]] ; then
695f35090dSAndrew Geissler				usage
705f35090dSAndrew Geissler				exit 1
715f35090dSAndrew Geissler			fi
725f35090dSAndrew Geissler			;;
735f35090dSAndrew Geissler		-l|--log-only)
745f35090dSAndrew Geissler			LOG_ONLY="true"
755f35090dSAndrew Geissler			shift
765f35090dSAndrew Geissler			shift
775f35090dSAndrew Geissler			;;
785f35090dSAndrew Geissler		-h|--help)
795f35090dSAndrew Geissler			usage
805f35090dSAndrew Geissler			exit 0
815f35090dSAndrew Geissler			;;
825f35090dSAndrew Geissler		*)
835f35090dSAndrew Geissler			usage
845f35090dSAndrew Geissler			exit 1
855f35090dSAndrew Geissler			;;
865f35090dSAndrew Geissler	esac
875f35090dSAndrew Geisslerdone
885f35090dSAndrew Geissler
895f35090dSAndrew Geissler
905f35090dSAndrew Geisslerif [ "$LOG_ONLY" = "true" ] ; then
915f35090dSAndrew Geissler    uptime
925f35090dSAndrew Geissler    run_cmds
935f35090dSAndrew Geissler    exit
945f35090dSAndrew Geisslerfi
955f35090dSAndrew Geissler
965f35090dSAndrew Geisslerif [ -z ${TIMEOUT+x} ] || [ -z ${COUNT+x} ] ; then
975f35090dSAndrew Geissler    usage
985f35090dSAndrew Geissler    exit 1
995f35090dSAndrew Geisslerfi
1005f35090dSAndrew Geissler
1015f35090dSAndrew Geissleruptime
1025f35090dSAndrew Geisslerecho "Timeout used: ${TIMEOUT}"
1035f35090dSAndrew Geisslertimeout ${TIMEOUT} dd if=/dev/zero of=oe-time-dd-test.dat bs=1024 count=${COUNT} conv=fsync
1045f35090dSAndrew Geisslerif [ $? -ne 0 ]; then
1055f35090dSAndrew Geissler    run_cmds
106c926e17cSAndrew Geisslerfi
107