From 90be791f7626e64dca0fded8e77a973cb0b177bd Mon Sep 17 00:00:00 2001 From: Andreas Perhab Date: Thu, 1 Jun 2023 15:17:18 +0200 Subject: [PATCH] inotify: add plugin to watch inotify limits --- plugins/system/example-graphs/inotify-day.png | Bin 0 -> 31722 bytes plugins/system/inotify | 174 ++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 plugins/system/example-graphs/inotify-day.png create mode 100755 plugins/system/inotify diff --git a/plugins/system/example-graphs/inotify-day.png b/plugins/system/example-graphs/inotify-day.png new file mode 100644 index 0000000000000000000000000000000000000000..e478d1456b2607bb5bb4d4b754402735c74c01d0 GIT binary patch literal 31722 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

Z}n)FPs1jq$4GSwqkPV; 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 BF_HiP literal 0 HcmV?d00001 diff --git a/plugins/system/inotify b/plugins/system/inotify new file mode 100755 index 00000000..d0d36ade --- /dev/null +++ b/plugins/system/inotify @@ -0,0 +1,174 @@ +#!/usr/bin/env bash + +: << EOF +=head1 NAME + +inotify - Shows per user usage of inotify + +=head1 CONFIGURATION + + [inotify] + user root + +=head1 AUTHOR + +Copyright (C) 2023 Andreas Perhab, WT-IO-IT GmbH + +=head1 LICENSE + +GPLv3 or later + +SPDX-License-Identifier: GPL-3.0-or-later + +=head1 MAGIC MARKERS + +#%# family=manual + +EOF +#set -x +# shellcheck source=/usr/share/munin/plugins/plugin.sh +. "$MUNIN_LIBDIR/plugins/plugin.sh" + +# keep cache file to support MUNIN_CAP_DIRTYCONFIG +CACHE_FILE=${MUNIN_PLUGSTATE}/numbers + +function fetch_numbers() { + if [[ -e $CACHE_FILE ]]; then + cat "$CACHE_FILE" + else + lsof -F puLftn0 -d 0-999999 -n 2>/dev/null | awk -F'\x00' ' + /^p[0-9]+\x00u[0-9]+\x00/ { + # e.g. + # p598480\x00u0\x00Lroot + # p3024879\x00u112\x00 + # marking a new process with ta_inode\x00ninotify\x00 following + user=substr($3, 2) + process=substr($1, 2) + if (user == "") { + # if login name is not present, add a uid... user + user="uid" substr($2, 2) + } + next + } + /^f[0-9]+\x00ta_inode\x00ninotify\x00$/ { + # e.g. + # f331\x00ta_inode\x00ninotify\x00 + # aggregate instances by (process ":" fd) + if ($2 != "ta_inode" || $3 != "ninotify") { + # double check that $2 and $3 are as expected (non gawk seems to ignore everything after \x00) + next + } + fd=substr($1, 2) + instance=process ":" fd + if (!users[user]) { + users[user]=1 + } + if (instances[user, instance]) { + instances[user, instance] += 1; + } else { + instances[user, instance] = 1; + } + if (!watches[user, instance]) { + fd_info = "grep -R \"^inotify wd:\" --count /proc/" process "/fdinfo/" fd " 2>/dev/null" + fd_info | getline watch_count + watches[user, instance] = watch_count + } + next + } + + END { + for (user in users) { + user_key = user + # make usernames safe for munin-node keys + gsub(/[-]/, "_", user_key) + watch_count = 0 + for (user_fd in watches) { + if (index(user_fd, user) == 1) { + watch_count += watches[user_fd] + } + } + instance_count = 0 + for (user_instance in instances) { + if (index(user_instance, user) == 1) { + instance_count += 1 + } + } + print user_key " " user " " instance_count " " watch_count + } + } + ' | tee "$CACHE_FILE" + fi +} + +if [[ $1 == "config" ]]; then + if [[ $MUNIN_CAP_MULTIGRAPH ]]; then + echo "multigraph inotify_instances" + echo "graph_title inotify instance usage" + echo "graph_info This graphs shows how many inotify instances each user has open" + else + echo "graph_title inotify usage" + echo "graph_info This graphs shows how many inotify instances and watches each user has open" + fi + echo "graph_args --base 1000 -r --lower-limit 0" + echo "graph_vlabel #" + echo "graph_scale no" + echo "graph_category system" + + # remember env setting (plugin-conf.d) before we override them + env_warning=${warning:-} + env_critical=${critical:-} + + max_user_instances=$(cat /proc/sys/fs/inotify/max_user_instances) + while read -r key username instances watches; do + echo "${key}_instances.label ${username} instances" + echo "${key}_instances.info instances used by processes of ${username}" + echo "${key}_instances.draw LINE" + # use max_user_instances - 5 as default warning (if none is defined in plugin-conf.d) + warning=${env_warning:-$((max_user_instances * 95 / 100))} + # use max_user_instances as default critical (if none is defined in plugin-conf.d) + critical=${env_critical:-$((max_user_instances * 98 / 100))} + print_warning "${key}_instances" + print_critical "${key}_instances" + done < <(fetch_numbers) + + if [[ $MUNIN_CAP_MULTIGRAPH ]]; then + echo "multigraph inotify_watches" + echo "graph_title inotify watch usage" + echo "graph_args --base 1000 -r --lower-limit 0" + echo "graph_vlabel #" + echo "graph_scale no" + echo "graph_info This graphs shows how many inotify watches each user has open" + echo "graph_category system" + fi + + max_user_watches=$(cat /proc/sys/fs/inotify/max_user_watches) + while read -r key username instances watches; do + echo "${key}_watches.label ${username} watches" + echo "${key}_watches.info watches used by processes of ${username}" + echo "${key}_watches.draw LINE" + # use max_user_watches - 5 as default warning (if none is defined in plugin-conf.d) + warning=${env_warning:-$((max_user_watches * 95 / 100))} + # use max_user_watches as default critical (if none is defined in plugin-conf.d) + critical=${env_critical:-$((max_user_watches * 98 / 100))} + print_warning "${key}_watches" + print_critical "${key}_watches" + done < <(fetch_numbers) + +fi +if [[ $1 != "config" || $MUNIN_CAP_DIRTYCONFIG ]]; then + if [[ $MUNIN_CAP_MULTIGRAPH ]]; then + echo "multigraph inotify_instances" + fi + while read -r key username instances watches; do + echo "${key}_instances.value ${instances}" + done < <(fetch_numbers) + if [[ $MUNIN_CAP_MULTIGRAPH ]]; then + echo "multigraph inotify_watches" + fi + while read -r key username instances watches; do + echo "${key}_watches.value ${watches}" + done < <(fetch_numbers) +fi +if [[ -e $CACHE_FILE ]]; then + rm "$CACHE_FILE" +fi