Created
April 8, 2014 12:14
-
-
Save asimihsan/10115750 to your computer and use it in GitHub Desktop.
Memory monitoring
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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