Skip to content

Instantly share code, notes, and snippets.

@asimihsan
Created April 8, 2014 12:14
Show Gist options
  • Save asimihsan/10115750 to your computer and use it in GitHub Desktop.
Save asimihsan/10115750 to your computer and use it in GitHub Desktop.
Memory monitoring
#!/usr/bin/env python
import datetime
import logging
import logging.handlers
import os
import socket
import sys
import time
import psutil
logger = logging.getLogger('memory-monitor')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(message)s')
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
log_dir = r'/var/log'
if not os.path.isdir(log_dir):
os.makedirs(log_dir)
fh = logging.handlers.RotatingFileHandler(os.path.join(log_dir, 'memory-monitor'),
maxBytes=1024 * 1024 * 50,
backupCount=10)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
def _virtual_memory():
mem = psutil.virtual_memory()
logger.info("\tvirtual_memory\t\t{available=%sKB, percent_used=%s%%, used=%sKB, free=%sKB, "
"total=%sKB}" %
(mem.available / 1024, mem.percent, mem.used / 1024, mem.free / 1024,
mem.total / 1024))
logger.info("\tvirtual_memory\t\t{active=%sKB, inactive=%sKB, buffers=%sKB, cached=%sKB}" %
(mem.active / 1024, mem.inactive / 1024, mem.buffers / 1024, mem.cached / 1024))
def _swap_memory():
mem = psutil.swap_memory()
logger.info("\tswap_memory\t\t{free=%sKB, percent_used=%s%%, used=%sKB, sin=%sKB, sout=%sKB, "
"total=%sKB}" %
(mem.free / 1024, mem.percent, mem.used / 1024, mem.sin / 1024,
mem.sout / 1024, mem.total))
def _process_memory():
processes = [process for process in psutil.process_iter()]
processes.sort(key=lambda p: p.memory_info_ex().rss, reverse=True)
logger.info("\tprocess_memory")
for process in processes:
try:
mem = process.memory_info_ex()
smaps = process.memory_maps()
try:
smaps_heap = [s for s in smaps if s.path == '[heap]'][0]
except IndexError:
continue
try:
smaps_anon = [s for s in smaps if s.path == '[anon]'][0]
except IndexError:
continue
try:
smaps_stack = [s for s in smaps if s.path == '[stack]'][0]
except IndexError:
continue
logger.info("\t\t{pid=%s, ppid=%s, name=%s, cmdline=%s, rss=%sKB, vms=%sKB, "
"shared=%sKB, heap_rss=%sKB, heap_pss=%sKB, anon_rss=%sKB, anon_pss=%sKB, "
"stack_rss=%sKB, stack_pss=%sKB}" %
(process.pid, process.ppid(), process.name(), process.cmdline()[:2],
mem.rss / 1024, mem.vms / 1024, mem.shared / 1024,
smaps_heap.rss / 1024,
smaps_heap.pss / 1024,
smaps_anon.rss / 1024,
smaps_anon.pss / 1024,
smaps_stack.rss / 1024,
smaps_stack.pss / 1024,
))
except psutil.NoSuchProcess:
continue
def get_running_lock(process_name):
global lock_socket
lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
try:
lock_socket.bind('\0' + process_name)
return True
except socket.error:
return False
def main(interval=10.0):
if not get_running_lock('memory-monitor'):
print("already running")
sys.exit(0)
logger.debug("starting")
while True:
logger.info("datetime: %s" % datetime.datetime.now().isoformat(" "))
start = time.time()
_virtual_memory()
_swap_memory()
_process_memory()
time.sleep(interval - (time.time() - start))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment