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