From d625e513bac1ee17ea18f89283da2fe1d03f0fce Mon Sep 17 00:00:00 2001 From: Alexey Avramov Date: Tue, 12 Jun 2018 23:31:06 +0900 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=BF=D1=86=D0=B8=D1=8F=20print=5Fsleep?= =?UTF-8?q?=5Fpediods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- nohang | 46 ++++++++++++++++++++++++++++++++++------------ nohang.conf | 8 ++++++++ 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c95752f..4ad1ece 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ https://2ch.hk/s/res/2310304.html#2311483, https://archive.li/idixk - по умолчанию высокий приоритет процесса `nice -20`, может регулироваться через конфиг - предотвращение самоубийства с помощью `self_oom_score_adj = -1000` - возможность задания `oom_score_min` для предотвращения убийства невиновных -- verbosity: опциональность печати параметров конфига при старте программы, опциональность печати результатов проверки памяти +- verbosity: опциональность печати параметров конфига при старте программы, опциональность печати результатов проверки памяти и времени между проверками пяти - возможность предотвращения избыточного убийства процессов с помощью задания миниального `oom_score` для убиваемых процессов и установка минимальной задержки просле отправки сигналов (параметры конфига `min_delay_after_sigkill` и `min_delay_after_sigterm`) - наличие `man` страницы - наличие установщика для пользователей `systemd` diff --git a/nohang b/nohang index 107f789..aad6031 100755 --- a/nohang +++ b/nohang @@ -125,7 +125,6 @@ def find_victim_and_send_signal(signal): func_decrease_oom_score_adj(oom_score_adj_before, oom_score_adj_after) oom_list = [] - for i in os.listdir('/proc'): if i.isdigit() is not True: continue @@ -161,9 +160,18 @@ def find_victim_and_send_signal(signal): print(' Operation not permitted') else: - print(' oom_score {} < oom_score_min {}'.format(oom_score, oom_score_min)) + # спать всегда или только при успешной отправке сигнала? + if signal is 9: + if print_sleep_pediods: + print(' sleep', min_delay_after_sigkill) + sleep(min_delay_after_sigterm) + else: + if print_sleep_pediods: + print(' sleep', min_delay_after_sigterm) + sleep(min_delay_after_sigterm) + ########################################################################################### @@ -191,7 +199,6 @@ mem_total = int(mem_list[0].split(':')[1].split(' ')[-2]) # еще найти позиции VmRSS & VmSwap - ########################################################################################### # - получение пути к конфигу @@ -236,7 +243,6 @@ print('Path to nohang config file:', config) # - парсинг конфига с получением словаря параметров - try: with open(config) as f: config_dict = dict() @@ -267,7 +273,6 @@ except IndexError: # - извлечение параметров из словаря, проверка наличия всех необходимых параметров - if 'print_config' in config_dict: print_config = config_dict['print_config'] if print_config == 'True': @@ -285,7 +290,6 @@ else: print('print_config not in config, exit!') exit() - if 'print_mem_check_results' in config_dict: print_mem_check_results = config_dict['print_mem_check_results'] if print_mem_check_results == 'True': @@ -303,6 +307,23 @@ else: print('print_mem_check_results not in config, exit!') exit() +if 'print_sleep_pediods' in config_dict: + print_sleep_pediods = config_dict['print_sleep_pediods'] + if print_sleep_pediods == 'True': + print_sleep_pediods = True + elif print_sleep_pediods == 'False': + print_sleep_pediods = False + else: + print( + 'invalid print_sleep_pediods value {} (should be True or False), exit!'.format( + print_sleep_pediods + ) + ) + exit() +else: + print('print_sleep_pediods not in config, exit!') + exit() + if 'mlockall' in config_dict: mlockall = config_dict['mlockall'] if mlockall == 'True': @@ -555,6 +576,7 @@ else: if print_config: print('print_config: {}'.format(print_config)) print('print_mem_check_results: {}'.format(print_mem_check_results)) + print('print_sleep_pediods: {}'.format(print_sleep_pediods)) print('mlockall: {} ({})'.format(mlockall, mla_res)) print('self_nice: {} ({})'.format(self_nice, self_nice_result)) print('self_oom_score_adj: {} ({})'.format(self_oom_score_adj, self_oom_score_adj_result)) @@ -580,7 +602,7 @@ if print_config: -# для рассчета ширины столбцов mem и zram +# для рассчета ширины столбцов при печати mem и zram mem_len = len(str(round(mem_total / 1024.0))) @@ -676,7 +698,6 @@ while True: ) ) find_victim_and_send_signal(9) - sleep(min_delay_after_sigkill) continue @@ -691,7 +712,6 @@ while True: ) ) find_victim_and_send_signal(9) - sleep(min_delay_after_sigkill) continue @@ -711,7 +731,6 @@ while True: ) ) find_victim_and_send_signal(15) - sleep(min_delay_after_sigterm) # MEM ZRAM TERM @@ -725,12 +744,14 @@ while True: ) ) find_victim_and_send_signal(15) - sleep(min_delay_after_sigterm) + # задание периода в зависимости от рейтов и уровней доступной памяти t_mem = mem_available / 1000000.0 / rate_mem + t_swap = swap_free / 10000000.0 / rate_swap + t_zram = (mem_total * 0.8 - mem_used_zram) / 1000000.0 / rate_zram if t_zram < 0.01: t_zram = 0.01 @@ -743,8 +764,9 @@ while True: else: t = t_mem_zram - try: + if print_sleep_pediods: + print('sleep', round(t, 2)) sleep(t) except KeyboardInterrupt: exit() diff --git a/nohang.conf b/nohang.conf index e0004af..a6dfd32 100644 --- a/nohang.conf +++ b/nohang.conf @@ -19,6 +19,12 @@ print_config = True print_mem_check_results = True + Печатать ли время сна между проверками памяти и после отправки + сигналов. Можно установить в значение True для дебага. + Допустимые значения: True и False + +print_sleep_pediods = False + ##################################################################### II. САМОЗАЩИТА ПРОЦЕССА @@ -138,6 +144,8 @@ min_delay_after_sigkill = 3 decrease_oom_score_adj = False + Допустимые значения - целые числа из диапазона [0; 1000] + oom_score_adj_before = 10 oom_score_adj_after = 5