From ca5e1a53d896eae25177a0d818d9de677ed2f96c Mon Sep 17 00:00:00 2001 From: Alexey Avramov Date: Thu, 13 Dec 2018 21:29:10 +0900 Subject: [PATCH] print stat after corrective actions --- nohang | 51 ++++++++++++++++++++++++++++++++++++++++++++------- nohang.conf | 7 +++++-- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/nohang b/nohang index 7a40217..11d7441 100755 --- a/nohang +++ b/nohang @@ -1,16 +1,22 @@ #!/usr/bin/env python3 """A daemon that prevents OOM in Linux systems.""" +from time import sleep, time +start_time = time() import os from operator import itemgetter -from time import sleep, time from argparse import ArgumentParser from sys import stdout from signal import SIGKILL, SIGTERM -start_time = time() sig_dict = {SIGKILL: 'SIGKILL', SIGTERM: 'SIGTERM'} +''' +nm = 30 +nc = nm + 1 +''' + +stat_dict = dict() ########################################################################## @@ -119,15 +125,15 @@ def rline1(path): for line in f: return line[:-1] - +''' def write(path, string): """Write string to path.""" with open(path, 'w') as f: f.write(string) - +''' def kib_to_mib(num): - """Convert Kib values to Mib values.""" + """Convert KiB values to MiB values.""" return round(num / 1024.0) @@ -137,7 +143,7 @@ def percent(num): def just_percent_mem(num): - """Pls, put description here...""" + """convert num to percent and justify""" return str(round(num * 100, 1)).rjust(4, ' ') @@ -396,7 +402,7 @@ def find_victim_and_send_signal(signal): """ Find victim with highest badness and send SIGTERM/SIGKILL """ - print() + #print() pid, victim_badness = fattest() name = pid_to_name(pid) @@ -500,6 +506,16 @@ def find_victim_and_send_signal(signal): victim_info, command, exit_status, round(response_time * 1000)) + + # update stat_dict + key = "Run the command '{}'".format(command) + if key not in stat_dict: + stat_dict.update({key: 1}) + else: + new_value = stat_dict[key] + 1 + stat_dict.update({key: new_value}) + + print(mem_info) print(etc_info) if gui_notifications: @@ -513,6 +529,14 @@ def find_victim_and_send_signal(signal): send_result = '\033[32mOK\033[0m; response time: {} ms'.format( round(response_time * 1000)) + # update stat_dict + key = 'Send {} to {}'.format(sig_dict[signal], name) + if key not in stat_dict: + stat_dict.update({key: 1}) + else: + new_value = stat_dict[key] + 1 + stat_dict.update({key: new_value}) + if gui_notifications: send_notify(signal, name, pid) @@ -530,6 +554,10 @@ def find_victim_and_send_signal(signal): victim_info, sig_dict[signal], send_result) print(mem_info) print(preventing_oom_message) + print('Duration of work: {} sec; number of corrective actions:'.format( + round(time() - start_time))) + for key in stat_dict: + print(' - {}: {}'.format(key, stat_dict[key])) else: @@ -1352,6 +1380,15 @@ while True: human(mem_used_zram, mem_len), just_percent_mem(mem_used_zram / mem_total))) + ''' + if nc > nm: + nc = 0 + print('MemAvailable, MiB:', human(mem_available, mem_len)) + else: + nc += 1 + ''' + + # если swap_min_sigkill задан в абсолютной величине и Swap_total = 0 if swap_total > swap_min_sigkill_kb: # If swap_min_sigkill is absolute swap_sigkill_pc = percent(swap_min_sigkill_kb / (swap_total + 0.1)) diff --git a/nohang.conf b/nohang.conf index 75c93b7..56e0fd9 100644 --- a/nohang.conf +++ b/nohang.conf @@ -101,8 +101,8 @@ min_badness = 10 Valid values are non-negative floating-point numbers. -min_delay_after_sigterm = 0.5 -min_delay_after_sigkill = 2 +min_delay_after_sigterm = 0.1 +min_delay_after_sigkill = 0.5 Процессы браузера chromium обычно имеют oom_score_adj 200 или 300. Это приводит к тому, что процессы хрома умирают @@ -158,7 +158,9 @@ regex_matching = False Example: @PROCESSNAME_RE -100 /// ^Xorg$ + @PROCESSNAME_RE -500 /// ^sshd$ + @PROCESSNAME_RE 300 /// ^(chromium|firefox)$ @@ -169,6 +171,7 @@ regex_matching = False re_match_cmdline = False @CMDLINE_RE 300 /// -childID|--type=renderer + @CMDLINE_RE -200 /// ^/usr/lib/virtualbox