glances_mem.py 6.6 KB
Newer Older
A
Alessio Sergi 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Glances - An eye on your system
#
# Copyright (C) 2014 Nicolargo <nicolas@nicolargo.com>
#
# Glances is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Glances is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
N
Nicolas Hennion 已提交
20 21 22
"""
Glances virtual memory plugin
"""
A
Alessio Sergi 已提交
23 24 25

# Import system libs
# Check for PSUtil already done in the glances_core script
26
from psutil import virtual_memory
A
Alessio Sergi 已提交
27 28

# from ..plugins.glances_plugin import GlancesPlugin
29
from glances.plugins.glances_plugin import GlancesPlugin
A
Alessio Sergi 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55


class Plugin(GlancesPlugin):
    """
    Glances's memory Plugin

    stats is a dict
    """

    def __init__(self):
        GlancesPlugin.__init__(self)

        # We want to display the stat in the curse interface
        self.display_curse = True
        # Set the message position
        # It is NOT the curse position but the Glances column/line
        # Enter -1 to right align
        self.column_curse = 2
        # Enter -1 to diplay bottom
        self.line_curse = 1

    def update(self):
        """
        Update MEM (RAM) stats
        """

56
        # Grab MEM using the PSUtil virtual_memory method
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
        vm_stats = virtual_memory()

        # Get all the memory stats (copy/paste of the PsUtil documentation)
        # total: total physical memory available.
        # available: the actual amount of available memory that can be given instantly to processes that request more memory in bytes; this is calculated by summing different memory values depending on the platform (e.g. free + buffers + cached on Linux) and it is supposed to be used to monitor actual memory usage in a cross platform fashion.
        # percent: the percentage usage calculated as (total - available) / total * 100.
        # used: memory used, calculated differently depending on the platform and designed for informational purposes only.
        # free: memory not being used at all (zeroed) that is readily available; note that this doesn’t reflect the actual memory available (use ‘available’ instead).
        # Platform-specific fields:
        # active: (UNIX): memory currently in use or very recently used, and so it is in RAM.
        # inactive: (UNIX): memory that is marked as not used.
        # buffers: (Linux, BSD): cache for things like file system metadata.
        # cached: (Linux, BSD): cache for various things.
        # wired: (BSD, OSX): memory that is marked to always stay in RAM. It is never moved to disk.
        # shared: (BSD): memory that may be simultaneously accessed by multiple processes.
        mem_stats = {}
        for mem in ['total', 'available', 'percent', 'used', 'free',
                    'active', 'inactive', 'buffers', 'cached',
                    'wired', 'shared']:
            if (hasattr(vm_stats, mem)):
                mem_stats[mem] = getattr(vm_stats, mem)

        # Use the 'free'/htop calculation
        # free=available+buffer+cached
        mem_stats['free'] = mem_stats['available']
        if (hasattr(mem_stats, 'buffer')):
            mem_stats['free'] += mem_stats['buffer']
        if (hasattr(mem_stats, 'cached')):
            mem_stats['free'] += mem_stats['cached']
        # used=total-free
        mem_stats['used'] = mem_stats['total'] - mem_stats['free']

        # Set the global variable to the new stats
        self.stats = mem_stats

        return self.stats
A
Alessio Sergi 已提交
93 94 95 96 97 98 99 100

    def msg_curse(self, args=None):
        """
        Return the dict to display in the curse interface
        """
        # Init the return message
        ret = []

101 102 103 104
        # Only process if stats exist...
        if (self.stats == {}):
            return ret

A
Alessio Sergi 已提交
105 106 107 108 109
        # Build the string message
        # Header
        msg = "{0:5} ".format(_("MEM"))
        ret.append(self.curse_add_line(msg, "TITLE"))
        # Percent memory usage
110
        msg = "{0:>6}%".format(format(self.stats['percent'] / 100, '.1'))
A
Alessio Sergi 已提交
111 112 113 114 115
        ret.append(self.curse_add_line(msg))
        # Active memory usage
        if ('active' in self.stats):
            msg = "  {0:8}".format(_("actif:"))
            ret.append(self.curse_add_line(msg, optional=True))
116
            msg = "{0:>7}".format(self.auto_unit(self.stats['active']))
A
Alessio Sergi 已提交
117 118 119 120
            ret.append(self.curse_add_line(msg, optional=True))
        # New line
        ret.append(self.curse_new_line())
        # Total memory usage
121
        msg = "{0:6}".format(_("total:"))
A
Alessio Sergi 已提交
122
        ret.append(self.curse_add_line(msg))
123
        msg = "{0:>7}".format(self.auto_unit(format(self.stats['total']), '.1%'))
A
Alessio Sergi 已提交
124 125 126 127 128
        ret.append(self.curse_add_line(msg))
        # Inactive memory usage
        if ('inactive' in self.stats):
            msg = "  {0:8}".format(_("inactif:"))
            ret.append(self.curse_add_line(msg, optional=True))
129
            msg = "{0:>7}".format(self.auto_unit(self.stats['inactive']))
A
Alessio Sergi 已提交
130 131 132 133
            ret.append(self.curse_add_line(msg, optional=True))
        # New line
        ret.append(self.curse_new_line())
        # Used memory usage
134
        msg = "{0:6}".format(_("used:"))
A
Alessio Sergi 已提交
135
        ret.append(self.curse_add_line(msg))
136
        msg = "{0:>7}".format(self.auto_unit(self.stats['used']))
A
Alessio Sergi 已提交
137
        ret.append(self.curse_add_line(
138 139
            msg, self.get_alert_log(self.stats['used'], 
            max=self.stats['total'])))
A
Alessio Sergi 已提交
140 141 142 143
        # Buffers memory usage
        if ('buffers' in self.stats):
            msg = "  {0:8}".format(_("buffers:"))
            ret.append(self.curse_add_line(msg, optional=True))
144
            msg = "{0:>7}".format(self.auto_unit(self.stats['buffers']))
A
Alessio Sergi 已提交
145 146 147 148
            ret.append(self.curse_add_line(msg, optional=True))
        # New line
        ret.append(self.curse_new_line())
        # Free memory usage
149
        msg = "{0:6}".format(_("free:"))
A
Alessio Sergi 已提交
150
        ret.append(self.curse_add_line(msg))
151
        msg = "{0:>7}".format(self.auto_unit(self.stats['free']))
A
Alessio Sergi 已提交
152 153
        ret.append(self.curse_add_line(msg))
        # Cached memory usage
N
Nicolas Hennion 已提交
154
        if ('cached' in self.stats):
A
Alessio Sergi 已提交
155 156
            msg = "  {0:8}".format(_("cached:"))
            ret.append(self.curse_add_line(msg, optional=True))
157
            msg = "{0:>7}".format(self.auto_unit(self.stats['cached']))
A
Alessio Sergi 已提交
158 159 160
            ret.append(self.curse_add_line(msg, optional=True))

        return ret