diff --git a/pm b/pm new file mode 100755 index 0000000..a96527b --- /dev/null +++ b/pm @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 + +from ctypes import CDLL +from time import sleep +from sys import argv, exit +import os +import logging + + +""" +--target /system.slice +--period 2 +--log-file ./psi.log +""" + + +separate_log = True +log_file = './psi-monitor.log' + +period = 2 + + +cpu_file = "./cpu" +memory_file = "./memory" +io_file = "./io" + +""" + +""" + + +# + +try: + target = argv[1] # '.' + print('Set target to {}'.format(argv[1])) +except IndexError: + print('Set target to SYSTEM_WIDE to monitor /proc/pressure') + target = 'SYSTEM_WIDE' + +# target = 'SYSTEM_WIDE' + + +if target == 'SYSTEM_WIDE': + cpu_file = "/proc/pressure/cpu" + memory_file = "/proc/pressure/memory" + io_file = "/proc/pressure/io" +else: + cpu_file = target + "/cpu.pressure" + memory_file = target + "/memory.pressure" + io_file = target + "/io.pressure" + +############################################################################### + + +def mlockall(): + + MCL_CURRENT = 1 + MCL_FUTURE = 2 + MCL_ONFAULT = 4 + + libc = CDLL('libc.so.6', use_errno=True) + + result = libc.mlockall( + MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT + ) + if result != 0: + result = libc.mlockall( + MCL_CURRENT | MCL_FUTURE + ) + if result != 0: + pass + else: + pass + else: + pass + + +def psi_file_mem_to_metrics(psi_path): + + with open(psi_path) as f: + psi_list = f.readlines() + # print(psi_list) + some_list, full_list = psi_list[0].split(' '), psi_list[1].split(' ') + # print(some_list, full_list) + some_avg10 = some_list[1].split('=')[1] + some_avg60 = some_list[2].split('=')[1] + some_avg300 = some_list[3].split('=')[1] + + full_avg10 = full_list[1].split('=')[1] + full_avg60 = full_list[2].split('=')[1] + full_avg300 = full_list[3].split('=')[1] + + return (some_avg10, some_avg60, some_avg300, + full_avg10, full_avg60, full_avg300) + + +def psi_file_cpu_to_metrics(psi_path): + + with open(psi_path) as f: + psi_list = f.readlines() + # print(psi_list) + some_list = psi_list[0].split(' ') + # print(some_list, full_list) + some_avg10 = some_list[1].split('=')[1] + some_avg60 = some_list[2].split('=')[1] + some_avg300 = some_list[3].split('=')[1] + + return (some_avg10, some_avg60, some_avg300) + + +def log(*msg): + """ + """ + print(*msg) + if separate_log: + logging.info(*msg) + + +############################################################################### + + +logging.basicConfig( + filename=log_file, + level=logging.INFO, + format="%(asctime)s: %(message)s") + + +mlockall() + + + + + +try: + (c_some_avg10, c_some_avg60, c_some_avg300 + ) = psi_file_cpu_to_metrics(cpu_file) + + (m_some_avg10, m_some_avg60, m_some_avg300, + m_full_avg10, m_full_avg60, m_full_avg300 + ) = psi_file_mem_to_metrics(memory_file) + + (i_some_avg10, i_some_avg60, i_some_avg300, + i_full_avg10, i_full_avg60, i_full_avg300 + ) = psi_file_mem_to_metrics(io_file) +except Exception: + log('Cannot open pressure files') + log('Exit') + exit() + + + + + +""" +if not os.path.exists('/proc/pressure'): + print('PSI path does not exist. Exit.') + exit() +""" + + +log('Starting psi-monitor, target: {}, period: {}'.format(target, period)) +log('----------------------------------------------------------------------' + '--------------------------------------------') +log(' some cpu pressure || some memory pressure | full memory pressure ||' + ' some io pressure | full io pressure') +log('---------------------||----------------------|----------------------||' + '----------------------|---------------------') +log(' avg10 avg60 avg300 || avg10 avg60 avg300 | avg10 avg60 avg300 ||' + ' avg10 avg60 avg300 | avg10 avg60 avg300') +log('------ ------ ------ || ------ ------ ------ | ------ ------ ------ ||' + ' ------ ------ ------ | ------ ------ ------') + + +while True: + + (c_some_avg10, c_some_avg60, c_some_avg300 + ) = psi_file_cpu_to_metrics(cpu_file) + + (m_some_avg10, m_some_avg60, m_some_avg300, + m_full_avg10, m_full_avg60, m_full_avg300 + ) = psi_file_mem_to_metrics(memory_file) + + (i_some_avg10, i_some_avg60, i_some_avg300, + i_full_avg10, i_full_avg60, i_full_avg300 + ) = psi_file_mem_to_metrics(io_file) + + log('{} {} {} || {} {} {} | {} {} {} || {} {} {} | {} {} {}'.format( + + c_some_avg10.rjust(6), + c_some_avg60.rjust(6), + c_some_avg300.rjust(6), + + m_some_avg10.rjust(6), + m_some_avg60.rjust(6), + m_some_avg300.rjust(6), + m_full_avg10.rjust(6), + m_full_avg60.rjust(6), + m_full_avg300.rjust(6), + + i_some_avg10.rjust(6), + i_some_avg60.rjust(6), + i_some_avg300.rjust(6), + i_full_avg10.rjust(6), + i_full_avg60.rjust(6), + i_full_avg300.rjust(6) + + )) + + try: + sleep(period) + except KeyboardInterrupt: + log('Exit') + exit()