Skip to content
Snippets Groups Projects
Commit 4b554489 authored by Hahn Axel (hahn)'s avatar Hahn Axel (hahn)
Browse files

check_disk-io: new param to measure current disk speed

parent 21dabe4c
No related branches found
No related tags found
1 merge request!306OP#7938 Icinga Check Disk Performance messen https://projects.iml.unibe.ch/work_packages/7938
......@@ -15,12 +15,13 @@
# 2020-07-17 v1.0 <axel.hahn@iml.unibe.ch>
# 2023-07-27 v1.1 <axel.hahn@unibe.ch> shell fixes; remove unsupported warn and critical
# 2025-02-10 v1.2 <axel.hahn@unibe.ch> harden sourcing files
# 2025-04-02 v1.3 <axel.hahn@unibe.ch> add mode "measure" for read write speed
# ======================================================================
# shellcheck source=/dev/null
. "$( dirname "$0" )/inc_pluginfunctions" || exit 1
export self_APPVERSION=1.2
export self_APPVERSION=1.3
# ----------------------------------------------------------------------
# FUNCTIONS
......@@ -39,6 +40,27 @@ function getDisks(){
_diskInfo "NAME,TYPE" | grep "disk" | awk '{ print $1 }' | sed "s#[^a-z0-9]##g"
}
function measureline(){
local mydevice="$1"
local bsize="$2"
local mode="$3"
local out="$4"
local timer
local speed
timer=$( tail -1 <<< "${out}" | cut -f 3 -d ",")
speed=$( tail -1 <<< "${out}" | cut -f 4 -d ",")
info+=" $mode $speed"
# printf "%-25s %-10s %-10s %-15s %10s\n" "$mydevice" "$mode" "$bsize" "$timer" "$speed"
# perf="$( sed "s#\ \([.]\).*#\1#g" <<< "$speed" )"
perf="$( awk '{ print $1 " " $2 }' <<< "$speed" | sed "s#\ \(.\).*#\1#g" )"
perf="$( ph.toUnit "$perf" "M" )"
ph.perfadd "$mode" "$perf"
}
# UNUSED get a list of local partitions
# function getPartitions(){
# _diskInfo "NAME,TYPE" | grep "part" | awk '{ print $1 }' | sed "s#[^a-z0-9]##g"
......@@ -63,18 +85,32 @@ $_self -m MODE
OPTIONS:
-m MODE set mode for type of output (required)
-h or --help show this help.
-m MODE set mode for type of output (required)
-d DIR for measure: set a directory, default: "/tmp"
-s SIZE for measure: set a size, default: "100M"
PARAMETERS:
MODE
io read I/Os, write I/Os, discard I/0s
measure measure write and read speed
ticks read ticks, write ticks, discard ticks
wait total wait time for all requests
DIR
Directory to perform read and write test.
SIZE
Block size for dd command: a number followed multiplicative suffix.
c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000, M=1024*1024, xM=M,
GB=1000*1000*1000, G=1024*1024*1024, and so on for T, P, E, Z, Y, R, Q
EXAMPLE:
$_self -m io
$_self -m io
$_self -m measure
$_self -m measure -d /mnt/data -s 10M
EOF
}
......@@ -98,6 +134,22 @@ ph.require bc lsblk
# --- set mode
sMode=$( ph.getValueWithParam '' m "$@")
if [ "$sMode" = "measure" ]; then
sDir=$( ph.getValueWithParam '/tmp' d "$@")
bsize=$( ph.getValueWithParam '100M' s "$@")
target="${sDir}/$( tr -cd 'a-f0-9' <<< /dev/urandom | head -c 32 )"
info="Disk speed in ${sDir} using $bsize - "
measureline "${sDir}" "$bsize" "WRITE" "$( dd if=/dev/zero of="${target}" bs=$bsize count=1 oflag=dsync 2>&1 )"
measureline "${sDir}" "$bsize" "READ" "$( dd if="${target}" of=/dev/null bs=$bsize count=1 oflag=dsync 2>&1 )"
rm -f "${target}"
ph.status "$info"
ph.exit
fi
# --- labels and its columns in /sys/block/$myDisk/stat
# Name units description
......@@ -160,9 +212,14 @@ do
column=${aColums[$index]}
value=$( echo $diskdata | cut -f $column -d " " )
iDelta=$(ph.perfdeltaspeed "$label" $value)
iDelta=$(ph.perfdeltaspeed "$label" "$value")
typeset -i aTotals[$index]=${aTotals[$index]}+$iDelta
# typeset -i aTotals["$index"]=${aTotals["$index"]}+$iDelta
typeset -i aMax["$index"]
if [ -z "${aMax["$index"]}" ] || [ ${aMax["$index"]} -lt $iDelta ]; then
aMax["$index"]=$iDelta
fi
# echo " $label $iDelta per sec ... total: $value" >> "$tmpfile1"
printf "%30s %10d \n" "$label:" "$iDelta" >> "$tmpfile1"
......@@ -171,12 +228,13 @@ done
# --- add total
echo >>"$tmpfile1"
echo "--- TOTAL" >> "$tmpfile1"
echo "--- MAX" >> "$tmpfile1"
for index in ${!aNames[*]}
do
label="${aNames[$index]}"
value=${aTotals[$index]}
# value=${aTotals[$index]}
value=${aMax[$index]}
# echo " $label: $value" >> $tmpfile1
printf "%30s %10d \n" "$label:" "$value" >> "$tmpfile1"
ph.perfadd "$label" "$value"
......
......@@ -21,13 +21,13 @@ From this repository you need next to this script:
```txt
______________________________________________________________________
CHECK_DISK-IO
v1.2
Check dis io and latency
CHECK_DISK-IO
v1.3
(c) Institute for Medical Education - University of Bern
Licence: GNU GPL 3
https://os-docs.iml.unibe.ch/icinga-checks/Checks/check_disk_io.html
______________________________________________________________________
Disk infos based on /sys/block/[NAME]/stat
......@@ -43,18 +43,32 @@ check_disk-io -m MODE
OPTIONS:
-m MODE set mode for type of output (required)
-h or --help show this help.
-m MODE set mode for type of output (required)
-d DIR for measure: set a directory, default: "/tmp"
-s SIZE for measure: set a size, default: "100M"
PARAMETERS:
MODE
io read I/Os, write I/Os, discard I/0s
measure measure write and read speed
ticks read ticks, write ticks, discard ticks
wait total wait time for all requests
DIR
Directory to perform read and write test.
SIZE
Block size for dd command: a number followed multiplicative suffix.
c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000, M=1024*1024, xM=M,
GB=1000*1000*1000, G=1024*1024*1024, and so on for T, P, E, Z, Y, R, Q
EXAMPLE:
check_disk-io -m io
check_disk-io -m io
check_disk-io -m measure
check_disk-io -m measure -d /mnt/data -s 10M
```
......@@ -64,28 +78,36 @@ check_disk-io -m io
## Examples
### Disk io
`$ check_disk-io -m io` returns
```txt
OK: Disk data ... read I/Os, write I/Os, discard I/0s, number of I/Os currently in flight
--- sda
disk-sda-ReadIO: 0
disk-sda-WriteIO: 0
disk-sda-DiscardIO: 0
disk-sda-FlightIO: 0
--- nvme0n1
disk-nvme0n1-ReadIO: 3
disk-nvme0n1-WriteIO: 16
disk-nvme0n1-DiscardIO: 4
disk-nvme0n1-ReadIO: 401
disk-nvme0n1-WriteIO: 61
disk-nvme0n1-DiscardIO: 0
disk-nvme0n1-FlightIO: 0
--- TOTAL
ReadIO: 3
WriteIO: 16
DiscardIO: 4
--- MAX
ReadIO: 401
WriteIO: 61
DiscardIO: 0
FlightIO: 0
|readio=3;; writeio=16;; discardio=4;; flightio=0;;
|readio=401;; writeio=61;; discardio=0;; flightio=0;;
```
### Measure
The mode `measure` writes a randomly generated filename with `dd` and reads the file afterwards. From the output is the of the command we fetch the speed in MB/s or GB/s.
```txt
$ check_disk-io -m measure
OK: Disk speed in /tmp using 100M - WRITE 952 MB/s READ 4.1 GB/s
|write=952;; read=4198.4;;
```
By default the check is done in /tmp with 100MB generated random data. You can set another directory eg. to perform a check on a mounted filesystem.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment