diff --git a/plugins/other/ksm_ b/plugins/other/ksm_ new file mode 100755 index 00000000..4e9c42b6 --- /dev/null +++ b/plugins/other/ksm_ @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# -*- encoding: UTF-8 -*- +# +# ksm +# +# Plugin to monitor ksm - Kernel Samepage Merging. +# +# Author: Markus Heberling +# +# v1.0 2011-04-05 - First version +# +# Usage: place in /etc/munin/plugins/ (or link it there using ln -s) +# +# Parameters understood: +# +# config (required) +# autoconf (optional - used by munin-config) +# +# Magic markers - optional - used by installation scripts and +# munin-config: +# +#%# capabilities=autoconf suggest +#%# family=auto + +########################################################### +category = 'system' # 'upgrades' +title = 'Kernel Samepage Merging' # 'Upgradeable packages' +########################################################### + +import os +import sys +import warnings + +def autoconf(): + if os.path.exists('/sys/kernel/mm/ksm/run'): + for line in open('/sys/kernel/mm/ksm/run'): + if line.strip() == '1': + print 'yes' + sys.exit(0) + print 'no (/sys/kernel/mm/ksm/run must be present and value must be 1)' + sys.exit(0) + +def suggest(): + print 'pages_absolute' + print 'pages_relative' + print 'full_scans' + sys.exit(0) + + +def config(): + if('ksm_pages_absolute' in sys.argv[0]): + print 'graph_category %s' % (category) + print 'graph_title %s Pages Absolute' % (title) + print 'graph_order pages_unshared pages_volatile pages_shared pages_sharing' + print 'pages_shared.info how many shared pages are being used' + print 'pages_sharing.info how many more sites are sharing them i.e. how much saved' + print 'pages_unshared.info how many pages unique but repeatedly checked for merging' + print 'pages_volatile.info how many pages changing too fast to be placed in a tree' + print 'pages_shared.label pages_shared' + print 'pages_sharing.label pages_sharing' + print 'pages_unshared.label pages_unshared' + print 'pages_volatile.label pages_volatile' + print 'pages_shared.draw AREASTACK' + print 'pages_sharing.draw AREASTACK' + print 'pages_unshared.draw AREASTACK' + print 'pages_volatile.draw AREASTACK' + elif('ksm_pages_relative' in sys.argv[0]): + print 'graph_category %s' % (category) + print 'graph_title %s Pages Relative' % (title) + print 'pages_sharing_shared.info ratio of sharing to shared pages' + print 'pages_unshared_sharing.info ratio of unshared to sharing pages' + print 'pages_sharing_shared.label pages_sharing_shared' + print 'pages_unshared_sharing.label pages_unshared_sharing' + print 'pages_sharing_shared.cdef pages_sharing_shared,100,*' + print 'pages_unshared_sharing.cdef pages_unshared_sharing,100,*' + elif('ksm_full_scans' in sys.argv[0]): + print 'graph_category %s' % (category) + print 'graph_title %s Full Scans' % (title) + print 'full_scans.info how many times all mergeable areas have been scanned' + print 'full_scans.label full_scans' + sys.exit(0) + +if len(sys.argv) > 1: + if sys.argv[1] == 'autoconf': + autoconf() + elif sys.argv[1] == 'config': + config() + elif sys.argv[1] == 'suggest': + suggest() + elif sys.argv[1]: + print('unknown argument "' + sys.argv[1] + '"') + sys.exit(1) + +pages_shared=int(open('/sys/kernel/mm/ksm/pages_shared').read()) +pages_sharing=int(open('/sys/kernel/mm/ksm/pages_sharing').read()) +pages_unshared=int(open('/sys/kernel/mm/ksm/pages_unshared').read()) +pages_volatile=int(open('/sys/kernel/mm/ksm/pages_volatile').read()) +full_scans=int(open('/sys/kernel/mm/ksm/full_scans').read()) + +if('ksm_pages_absolute' in sys.argv[0]): + print 'pages_shared.value %i' % pages_shared + print 'pages_sharing.value %i' % pages_sharing + print 'pages_unshared.value %i' % pages_unshared + print 'pages_volatile.value %i' % pages_volatile +elif('ksm_pages_relative' in sys.argv[0]): + print 'pages_sharing_shared.value %f' % (float(pages_sharing)/float(pages_shared) if pages_shared>0 else 0) + print 'pages_unshared_sharing.value %f' % (float(pages_unshared)/float(pages_sharing) if pages_sharing>0 else 0) +elif('ksm_full_scans' in sys.argv[0]): + print 'full_scans.value %i' % full_scans