Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • iml-open-source/icinga-checks
1 result
Select Git revision
Show changes
Commits on Source (3)
...@@ -15,12 +15,13 @@ ...@@ -15,12 +15,13 @@
# 2020-07-17 v1.0 <axel.hahn@iml.unibe.ch> # 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 # 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-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 # shellcheck source=/dev/null
. "$( dirname "$0" )/inc_pluginfunctions" || exit 1 . "$( dirname "$0" )/inc_pluginfunctions" || exit 1
export self_APPVERSION=1.2 export self_APPVERSION=1.3
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# FUNCTIONS # FUNCTIONS
...@@ -39,6 +40,27 @@ function getDisks(){ ...@@ -39,6 +40,27 @@ function getDisks(){
_diskInfo "NAME,TYPE" | grep "disk" | awk '{ print $1 }' | sed "s#[^a-z0-9]##g" _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 # UNUSED get a list of local partitions
# function getPartitions(){ # function getPartitions(){
# _diskInfo "NAME,TYPE" | grep "part" | awk '{ print $1 }' | sed "s#[^a-z0-9]##g" # _diskInfo "NAME,TYPE" | grep "part" | awk '{ print $1 }' | sed "s#[^a-z0-9]##g"
...@@ -63,18 +85,32 @@ $_self -m MODE ...@@ -63,18 +85,32 @@ $_self -m MODE
OPTIONS: OPTIONS:
-m MODE set mode for type of output (required)
-h or --help show this help. -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: PARAMETERS:
MODE MODE
io read I/Os, write I/Os, discard I/0s io read I/Os, write I/Os, discard I/0s
measure measure write and read speed
ticks read ticks, write ticks, discard ticks ticks read ticks, write ticks, discard ticks
wait total wait time for all requests 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: EXAMPLE:
$_self -m io
$_self -m io
$_self -m measure
$_self -m measure -d /mnt/data -s 10M
EOF EOF
} }
...@@ -98,6 +134,22 @@ ph.require bc lsblk ...@@ -98,6 +134,22 @@ ph.require bc lsblk
# --- set mode # --- set mode
sMode=$( ph.getValueWithParam '' m "$@") 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 # --- labels and its columns in /sys/block/$myDisk/stat
# Name units description # Name units description
...@@ -160,9 +212,14 @@ do ...@@ -160,9 +212,14 @@ do
column=${aColums[$index]} column=${aColums[$index]}
value=$( echo $diskdata | cut -f $column -d " " ) 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" # echo " $label $iDelta per sec ... total: $value" >> "$tmpfile1"
printf "%30s %10d \n" "$label:" "$iDelta" >> "$tmpfile1" printf "%30s %10d \n" "$label:" "$iDelta" >> "$tmpfile1"
...@@ -171,12 +228,13 @@ done ...@@ -171,12 +228,13 @@ done
# --- add total # --- add total
echo >>"$tmpfile1" echo >>"$tmpfile1"
echo "--- TOTAL" >> "$tmpfile1" echo "--- MAX" >> "$tmpfile1"
for index in ${!aNames[*]} for index in ${!aNames[*]}
do do
label="${aNames[$index]}" label="${aNames[$index]}"
value=${aTotals[$index]} # value=${aTotals[$index]}
value=${aMax[$index]}
# echo " $label: $value" >> $tmpfile1 # echo " $label: $value" >> $tmpfile1
printf "%30s %10d \n" "$label:" "$value" >> "$tmpfile1" printf "%30s %10d \n" "$label:" "$value" >> "$tmpfile1"
ph.perfadd "$label" "$value" ph.perfadd "$label" "$value"
......
...@@ -21,13 +21,13 @@ From this repository you need next to this script: ...@@ -21,13 +21,13 @@ From this repository you need next to this script:
```txt ```txt
______________________________________________________________________ ______________________________________________________________________
CHECK_DISK-IO CHECK_DISK-IO
v1.2 v1.3
Check dis io and latency
(c) Institute for Medical Education - University of Bern (c) Institute for Medical Education - University of Bern
Licence: GNU GPL 3 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 Disk infos based on /sys/block/[NAME]/stat
...@@ -43,18 +43,32 @@ check_disk-io -m MODE ...@@ -43,18 +43,32 @@ check_disk-io -m MODE
OPTIONS: OPTIONS:
-m MODE set mode for type of output (required)
-h or --help show this help. -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: PARAMETERS:
MODE MODE
io read I/Os, write I/Os, discard I/0s io read I/Os, write I/Os, discard I/0s
measure measure write and read speed
ticks read ticks, write ticks, discard ticks ticks read ticks, write ticks, discard ticks
wait total wait time for all requests 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: 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 ...@@ -64,28 +78,36 @@ check_disk-io -m io
## Examples ## Examples
### Disk io
`$ check_disk-io -m io` returns `$ check_disk-io -m io` returns
```txt ```txt
OK: Disk data ... read I/Os, write I/Os, discard I/0s, number of I/Os currently in flight 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 --- nvme0n1
disk-nvme0n1-ReadIO: 3 disk-nvme0n1-ReadIO: 401
disk-nvme0n1-WriteIO: 16 disk-nvme0n1-WriteIO: 61
disk-nvme0n1-DiscardIO: 4 disk-nvme0n1-DiscardIO: 0
disk-nvme0n1-FlightIO: 0 disk-nvme0n1-FlightIO: 0
--- TOTAL --- MAX
ReadIO: 3 ReadIO: 401
WriteIO: 16 WriteIO: 61
DiscardIO: 4 DiscardIO: 0
FlightIO: 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.
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
# 2023-09-05 v1.14 <axel.hahn@unibe.ch> ph.require - show error below status line # 2023-09-05 v1.14 <axel.hahn@unibe.ch> ph.require - show error below status line
# 2023-09-14 v1.15 <axel.hahn@unibe.ch> add ph.showtimer; fix broken pipe messages in journallog # 2023-09-14 v1.15 <axel.hahn@unibe.ch> add ph.showtimer; fix broken pipe messages in journallog
# 2024-05-30 v1.16 <axel.hahn@unibe.ch> updatate link to online help (Daux replaces "-"" to "_") # 2024-05-30 v1.16 <axel.hahn@unibe.ch> updatate link to online help (Daux replaces "-"" to "_")
# 2025-04-01 v1.17 <axel.hahn@unibe.ch> update check for zero in ph.toUnit()
# ====================================================================== # ======================================================================
...@@ -329,7 +330,7 @@ function ph.toUnit(){ ...@@ -329,7 +330,7 @@ function ph.toUnit(){
local _digits=${3:-0} local _digits=${3:-0}
local _dots local _dots
if [ "$_value" -eq "0" ]; then if [ "$_value" = "0" ]; then
echo "0" echo "0"
return 0 return 0
fi fi
......