xref: /freebsd/sys/contrib/openzfs/cmd/zpool/zpool.d/iostat (revision 716fd348e01c5f2ba125f878a634a753436c2994)
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