ctdb-scripts: Only use /proc/meminfo for memory checks, not "free"
authorMartin Schwenke <martin@meltin.net>
Mon, 20 Jul 2015 10:50:56 +0000 (20:50 +1000)
committerAmitay Isaacs <amitay@samba.org>
Sat, 29 Aug 2015 15:06:25 +0000 (17:06 +0200)
No need to use 2 different sources of information for similar checks.
Also, output of free has been changed, whereas /proc/meminfo is a
kernel API, which will not change.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/config/events.d/05.system
ctdb/tests/eventscripts/scripts/local.sh
ctdb/tests/eventscripts/stubs/free [deleted file]

index b6303c0a324ce34e12f8fe34e5774de31c0d5c88..a089b18597fa66fb7496dd29fb6fa22608dea662 100644 (file)
@@ -64,18 +64,34 @@ monitor_filesystem_usage ()
 
 monitor_memory_usage ()
 {
-    # If monitoring free memory then calculate how much there is
-    if [ -n "$CTDB_MONITOR_FREE_MEMORY_WARN" -o \
-       -n "$CTDB_MONITOR_FREE_MEMORY" ] ; then
-       free_mem=$(free -m | awk '$2 == "buffers/cache:" { print $4 }')
+    if [ -z "$CTDB_MONITOR_FREE_MEMORY_WARN" -a \
+        -z "$CTDB_MONITOR_FREE_MEMORY" -a \
+        "$CTDB_CHECK_SWAP_IS_NOT_USED" != "yes" ] ; then
+       return
     fi
 
+    _meminfo=$(get_proc "meminfo")
+    set -- $(echo "$_meminfo" | awk '
+$1 == "MemFree:"      { memfree  += $2 / 1024 }
+$1 == "Cached:"       { memfree  += $2 / 1024 }
+$1 == "Buffers:"      { memfree  += $2 / 1024 }
+$1 == "MemTotal:"     { memtotal  = $2 / 1024 }
+$1 == "SwapFree:"     { swapfree  = $2 / 1024 }
+$1 == "SwapTotal:"    { swaptotal = $2 / 1024 }
+END {
+    print int(memfree), int(memtotal), int(swapfree) , int(swaptotal)
+}')
+    _mem_free="$1"
+    _mem_total="$2"
+    _swap_free="$3"
+    _swap_total="$4"
+
     # Shutdown CTDB when memory is below the configured limit
     if [ -n "$CTDB_MONITOR_FREE_MEMORY" ] ; then
-       if [ $free_mem -le $CTDB_MONITOR_FREE_MEMORY ] ; then
-           echo "CRITICAL: OOM - ${free_mem}MB free <= ${CTDB_MONITOR_FREE_MEMORY}MB (CTDB threshold)"
+       if [ $_mem_free -le $CTDB_MONITOR_FREE_MEMORY ] ; then
+           echo "CRITICAL: OOM - ${_mem_free}MB free <= ${CTDB_MONITOR_FREE_MEMORY}MB (CTDB threshold)"
            echo "CRITICAL: Shutting down CTDB!!!"
-           get_proc "meminfo"
+           echo "$_meminfo"
            ps auxfww
            set_proc "sysrq-trigger" "m"
            ctdb disable
@@ -86,17 +102,16 @@ monitor_memory_usage ()
 
     # Warn when low on memory
     if [ -n "$CTDB_MONITOR_FREE_MEMORY_WARN" ] ; then
-       if [ $free_mem -le $CTDB_MONITOR_FREE_MEMORY_WARN ] ; then
-           echo "WARNING: free memory is low - ${free_mem}MB free <=  ${CTDB_MONITOR_FREE_MEMORY_WARN}MB (CTDB threshold)"
+       if [ $_mem_free -le $CTDB_MONITOR_FREE_MEMORY_WARN ] ; then
+           echo "WARNING: free memory is low - ${_mem_free}MB free <=  ${CTDB_MONITOR_FREE_MEMORY_WARN}MB (CTDB threshold)"
        fi
     fi
 
     # We should never enter swap, so SwapTotal == SwapFree.
     if [ "$CTDB_CHECK_SWAP_IS_NOT_USED" = "yes" ] ; then
-       set -- $(get_proc "meminfo" | awk '$1 ~ /Swap(Total|Free):/ { print $2 }')
-       if [ "$1" != "$2" ] ; then
+       if [ "$_swap_total" != "$_swap_free" ] ; then
            echo We are swapping:
-           get_proc "meminfo"
+           echo "$_meminfo"
            ps auxfww
        fi
     fi
index d12713b56ec5d92e04c4715d21626d973aecc3b6..c50eeb5c7b2c942f0e6843807004859264f850dd 100644 (file)
@@ -344,19 +344,17 @@ setup_memcheck ()
 
     if [ "$1" = "bad" ] ; then
        _swap_free="   4352"
-       _mem_cached=" 112"
-       _mem_free=" 468"
+       _mem_cached="108568"
     else
        _swap_free="$_swap_total"
-       _mem_cached="1112"
-       _mem_free="1468"
+       _mem_cached="1139348"
     fi
 
     export FAKE_PROC_MEMINFO="\
 MemTotal:        3940712 kB
 MemFree:          225268 kB
 Buffers:          146120 kB
-Cached:          1139348 kB
+Cached:          ${_mem_cached} kB
 SwapCached:        56016 kB
 Active:          2422104 kB
 Inactive:        1019928 kB
@@ -370,12 +368,6 @@ SwapTotal:       ${_swap_total} kB
 SwapFree:        ${_swap_free} kB
 ..."
 
-    export FAKE_FREE_M="\
-             total       used       free     shared    buffers     cached
-Mem:          3848       3634        213          0        142       ${_mem_cached}
--/+ buffers/cache:       2379       ${_mem_free}
-Swap:         5719        246       5473"
-
     export CTDB_MONITOR_FREE_MEMORY
     export CTDB_MONITOR_FREE_MEMORY_WARN
     export CTDB_CHECK_SWAP_IS_NOT_USED
diff --git a/ctdb/tests/eventscripts/stubs/free b/ctdb/tests/eventscripts/stubs/free
deleted file mode 100755 (executable)
index 6453509..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-
-if [ "$1" = "-m" ] ; then
-    echo "$FAKE_FREE_M"
-    exit 0
-else
-    echo "free: not implemented - $*"
-    exit 1
-fi