1eda14cbcSMatt Macy#!/bin/sh 2eda14cbcSMatt Macy# 3eda14cbcSMatt Macy# Display most relevant iostat bandwidth/latency numbers. The output is 4eda14cbcSMatt Macy# dependent on the name of the script/symlink used to call it. 5eda14cbcSMatt Macy# 6eda14cbcSMatt Macy 7eda14cbcSMatt Macyhelpstr=" 8eda14cbcSMatt Macyiostat: Show iostat values since boot (summary page). 9eda14cbcSMatt Macyiostat-1s: Do a single 1-second iostat sample and show values. 10eda14cbcSMatt Macyiostat-10s: Do a single 10-second iostat sample and show values." 11eda14cbcSMatt Macy 12dae17134SMartin Matuskascript="${0##*/}" 13eda14cbcSMatt Macyif [ "$1" = "-h" ] ; then 14eda14cbcSMatt Macy echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2- 15eda14cbcSMatt Macy exit 16eda14cbcSMatt Macyfi 17eda14cbcSMatt Macy 18*716fd348SMartin Matuska# Sometimes, UPATH ends up /dev/(null). 19*716fd348SMartin Matuska# That should be corrected, but for now... 20*716fd348SMartin Matuska# shellcheck disable=SC2154 21*716fd348SMartin Matuskaif [ ! -b "$VDEV_UPATH" ]; then 22*716fd348SMartin Matuska somepath="${VDEV_PATH}" 23*716fd348SMartin Matuskaelse 24*716fd348SMartin Matuska somepath="${VDEV_UPATH}" 25*716fd348SMartin Matuskafi 26*716fd348SMartin Matuska 27eda14cbcSMatt Macyif [ "$script" = "iostat-1s" ] ; then 28eda14cbcSMatt Macy # Do a single one-second sample 29eda14cbcSMatt Macy interval=1 30eda14cbcSMatt Macy # Don't show summary stats 31eda14cbcSMatt Macy brief="yes" 32eda14cbcSMatt Macyelif [ "$script" = "iostat-10s" ] ; then 33eda14cbcSMatt Macy # Do a single ten-second sample 34eda14cbcSMatt Macy interval=10 35eda14cbcSMatt Macy # Don't show summary stats 36eda14cbcSMatt Macy brief="yes" 37eda14cbcSMatt Macyfi 38eda14cbcSMatt Macy 39*716fd348SMartin Matuskaif [ -f "$somepath" ] ; then 40eda14cbcSMatt Macy # We're a file-based vdev, iostat doesn't work on us. Do nothing. 41eda14cbcSMatt Macy exit 42eda14cbcSMatt Macyfi 43eda14cbcSMatt Macy 44eda14cbcSMatt Macyif [ "$(uname)" = "FreeBSD" ]; then 45eda14cbcSMatt Macy out=$(iostat -dKx \ 46eda14cbcSMatt Macy ${interval:+"-w $interval"} \ 47eda14cbcSMatt Macy ${interval:+"-c 1"} \ 48*716fd348SMartin Matuska "$somepath" | tail -n 2) 49eda14cbcSMatt Macyelse 50eda14cbcSMatt Macy out=$(iostat -kx \ 51eda14cbcSMatt Macy ${brief:+"-y"} \ 52eda14cbcSMatt Macy ${interval:+"$interval"} \ 53eda14cbcSMatt Macy ${interval:+"1"} \ 54*716fd348SMartin Matuska "$somepath" | grep -v '^$' | tail -n 2) 55eda14cbcSMatt Macyfi 56eda14cbcSMatt Macy 57eda14cbcSMatt Macy 58eda14cbcSMatt Macy# Sample output (we want the last two lines): 59eda14cbcSMatt Macy# 60eda14cbcSMatt Macy# Linux 2.6.32-642.13.1.el6.x86_64 (centos68) 03/09/2017 _x86_64_ (6 CPU) 61eda14cbcSMatt Macy# 62eda14cbcSMatt Macy# avg-cpu: %user %nice %system %iowait %steal %idle 63eda14cbcSMatt Macy# 0.00 0.00 0.00 0.00 0.00 100.00 64eda14cbcSMatt Macy# 65eda14cbcSMatt Macy# Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util 66eda14cbcSMatt Macy# sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 67eda14cbcSMatt Macy# 68eda14cbcSMatt Macy 69eda14cbcSMatt Macy# Get the column names 70eda14cbcSMatt Macycols=$(echo "$out" | head -n 1) 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy# Get the values and tab separate them to make them cut-able. 73dae17134SMartin Matuskavals=$(echo "$out" | tail -n 1 | tr -s '[:space:]' '\t') 74eda14cbcSMatt Macy 75eda14cbcSMatt Macyi=0 76eda14cbcSMatt Macyfor col in $cols ; do 77eda14cbcSMatt Macy i=$((i+1)) 78eda14cbcSMatt Macy # Skip the first column since it's just the device name 79e92ffd9bSMartin Matuska if [ "$i" -eq 1 ]; then 80eda14cbcSMatt Macy continue 81eda14cbcSMatt Macy fi 82eda14cbcSMatt Macy 83eda14cbcSMatt Macy # Get i'th value 84eda14cbcSMatt Macy val=$(echo "$vals" | cut -f "$i") 85eda14cbcSMatt Macy echo "$col=$val" 86eda14cbcSMatt Macydone 87