Minor fixes
This commit is contained in:
parent
4d75418a01
commit
cbe46d9682
442
src/nohang
442
src/nohang
@ -100,7 +100,6 @@ def memload():
|
||||
mem_available_index = mem_list_names.index('MemAvailable')
|
||||
except ValueError:
|
||||
errprint('Your Linux kernel is too old, Linux 3.14+ required\nExit')
|
||||
swap_total_index = mem_list_names.index('SwapTotal')
|
||||
swap_free_index = mem_list_names.index('SwapFree')
|
||||
|
||||
def check_mem_and_swap():
|
||||
@ -110,13 +109,10 @@ def memload():
|
||||
if n == mem_available_index:
|
||||
mem_available = int(line.split(':')[1][:-4])
|
||||
continue
|
||||
if n == swap_total_index:
|
||||
swap_total = int(line.split(':')[1][:-4])
|
||||
continue
|
||||
if n == swap_free_index:
|
||||
swap_free = int(line.split(':')[1][:-4])
|
||||
break
|
||||
return mem_available, swap_total, swap_free
|
||||
return mem_available, swap_free
|
||||
|
||||
def print_mem(mem_available, swap_free):
|
||||
print('\033MMemAvailable: {} MiB, SwapFree: {} MiB '
|
||||
@ -146,7 +142,7 @@ def memload():
|
||||
|
||||
while True:
|
||||
try:
|
||||
mem_available, swap_total, swap_free = check_mem_and_swap()
|
||||
mem_available, swap_free = check_mem_and_swap()
|
||||
x = mem_available + swap_free
|
||||
if x <= 1024 * 40: # 40 MiB
|
||||
print_mem(mem_available, swap_free)
|
||||
@ -275,9 +271,7 @@ def re_pid_environ(pid):
|
||||
try:
|
||||
with open('/proc/' + pid + '/environ', 'rb') as f:
|
||||
env = f.read().decode('utf-8', 'ignore')
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return None
|
||||
|
||||
if display_env in env and dbus_env in env and user_env in env:
|
||||
@ -772,11 +766,7 @@ def pid_to_rss(pid):
|
||||
try:
|
||||
rss = int(rline1(
|
||||
'/proc/{}/statm'.format(pid)).split(' ')[1]) * SC_PAGESIZE
|
||||
except IndexError:
|
||||
rss = None
|
||||
except FileNotFoundError:
|
||||
rss = None
|
||||
except ProcessLookupError:
|
||||
except (IndexError, FileNotFoundError, ProcessLookupError):
|
||||
rss = None
|
||||
return rss
|
||||
|
||||
@ -787,11 +777,7 @@ def pid_to_vm_size(pid):
|
||||
try:
|
||||
vm_size = int(rline1(
|
||||
'/proc/{}/statm'.format(pid)).partition(' ')[0]) * SC_PAGESIZE
|
||||
except IndexError:
|
||||
vm_size = None
|
||||
except FileNotFoundError:
|
||||
vm_size = None
|
||||
except ProcessLookupError:
|
||||
except (IndexError, FileNotFoundError, ProcessLookupError):
|
||||
vm_size = None
|
||||
return vm_size
|
||||
|
||||
@ -904,7 +890,7 @@ def pid_to_cgroup_v1(pid):
|
||||
if index == cgroup_v1_index:
|
||||
cgroup_v1 = '/' + line.partition('/')[2][:-1]
|
||||
return cgroup_v1
|
||||
except FileNotFoundError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -918,7 +904,7 @@ def pid_to_cgroup_v2(pid):
|
||||
if index == cgroup_v2_index:
|
||||
cgroup_v2 = line[3:-1]
|
||||
return cgroup_v2
|
||||
except FileNotFoundError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -957,21 +943,17 @@ def get_victim_id(pid):
|
||||
try:
|
||||
return rline1('/proc/' + pid + '/stat').rpartition(
|
||||
')')[2].split(' ')[20] + '_pid' + pid
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
def pid_to_state(pid):
|
||||
"""
|
||||
""" ПЕРЕПИСАТЬ НАХРЕН - С БИН ЧТЕНИЕМ И НУЛЕВЫМ БУФЕРОМ==
|
||||
"""
|
||||
try:
|
||||
with open('/proc/' + pid + '/stat', 'rb') as f:
|
||||
return f.read(40).decode('utf-8', 'ignore').rpartition(')')[2][1]
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
except IndexError:
|
||||
with open('/proc/' + pid + '/stat', 'rb') as f:
|
||||
@ -984,9 +966,7 @@ def pid_to_name(pid):
|
||||
try:
|
||||
with open('/proc/{}/comm'.format(pid), 'rb', buffering=0) as f:
|
||||
return f.read().decode('utf-8', 'ignore')[:-1]
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -998,9 +978,7 @@ def pid_to_ppid(pid):
|
||||
for n, line in enumerate(f):
|
||||
if n is ppid_index:
|
||||
return line.split('\t')[1].strip()
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
except UnicodeDecodeError:
|
||||
with open('/proc/' + pid + '/status', 'rb') as f:
|
||||
@ -1044,9 +1022,7 @@ def pid_to_cmdline(pid):
|
||||
with open('/proc/' + pid + '/cmdline', 'rb') as f:
|
||||
return f.read().decode('utf-8', 'ignore').replace(
|
||||
'\x00', ' ').rstrip()
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -1061,9 +1037,7 @@ def pid_to_environ(pid):
|
||||
with open('/proc/' + pid + '/environ', 'rb') as f:
|
||||
return f.read().decode('utf-8', 'ignore').replace(
|
||||
'\x00', ' ').rstrip()
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -1072,11 +1046,7 @@ def pid_to_realpath(pid):
|
||||
"""
|
||||
try:
|
||||
return os.path.realpath('/proc/{}/exe'.format(pid))
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
return ''
|
||||
except PermissionError:
|
||||
except (FileNotFoundError, ProcessLookupError, PermissionError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -1085,11 +1055,7 @@ def pid_to_cwd(pid):
|
||||
"""
|
||||
try:
|
||||
return os.path.realpath('/proc/{}/cwd'.format(pid))
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
return ''
|
||||
except PermissionError:
|
||||
except (FileNotFoundError, ProcessLookupError, PermissionError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -1099,9 +1065,7 @@ def pid_to_uid(pid):
|
||||
with open('/proc/{}/status'.format(pid), 'rb', buffering=0) as f:
|
||||
f_list = f.read().decode('utf-8', 'ignore').split('\n')
|
||||
return f_list[uid_index].split('\t')[2]
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return ''
|
||||
|
||||
|
||||
@ -1235,9 +1199,7 @@ def pid_to_badness(pid, oom_score):
|
||||
|
||||
return badness, oom_score
|
||||
|
||||
except FileNotFoundError:
|
||||
return None, None
|
||||
except ProcessLookupError:
|
||||
except (FileNotFoundError, ProcessLookupError):
|
||||
return None, None
|
||||
|
||||
|
||||
@ -1275,13 +1237,7 @@ def pid_to_status(pid):
|
||||
|
||||
return name, state, ppid, uid, vm_size, vm_rss, vm_swap
|
||||
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
|
||||
except ProcessLookupError:
|
||||
return None
|
||||
|
||||
except ValueError:
|
||||
except (FileNotFoundError, ProcessLookupError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
@ -1308,24 +1264,13 @@ 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
|
||||
)
|
||||
|
||||
libc = CDLL(None, use_errno=True)
|
||||
result = libc.mlockall(MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT)
|
||||
if result != 0:
|
||||
result = libc.mlockall(
|
||||
MCL_CURRENT | MCL_FUTURE
|
||||
)
|
||||
result = libc.mlockall(MCL_CURRENT | MCL_FUTURE)
|
||||
if result != 0:
|
||||
log('WARNING: cannot lock all memory: [Errno {}]'.format(result))
|
||||
else:
|
||||
pass
|
||||
# log('All memory locked with MCL_CURRENT | MCL_FUTURE')
|
||||
else:
|
||||
pass
|
||||
# log('All memory locked with MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT')
|
||||
log('WARNING: cannot lock process memory: [Errno {}]'.format(
|
||||
result))
|
||||
|
||||
|
||||
def update_stat_dict(key):
|
||||
@ -1358,25 +1303,25 @@ def print_stat_dict():
|
||||
def find_psi_metrics_value(psi_path, psi_metrics):
|
||||
"""
|
||||
"""
|
||||
foo = read_path(psi_path)
|
||||
foooo = read_path(psi_path)
|
||||
|
||||
if foo is None:
|
||||
if foooo is None:
|
||||
return None
|
||||
|
||||
try:
|
||||
|
||||
if psi_metrics == 'some_avg10':
|
||||
return float(foo.split('\n')[0].split(' ')[1].split('=')[1])
|
||||
return float(foooo.split('\n')[0].split(' ')[1].split('=')[1])
|
||||
if psi_metrics == 'some_avg60':
|
||||
return float(foo.split('\n')[0].split(' ')[2].split('=')[1])
|
||||
return float(foooo.split('\n')[0].split(' ')[2].split('=')[1])
|
||||
if psi_metrics == 'some_avg300':
|
||||
return float(foo.split('\n')[0].split(' ')[3].split('=')[1])
|
||||
return float(foooo.split('\n')[0].split(' ')[3].split('=')[1])
|
||||
if psi_metrics == 'full_avg10':
|
||||
return float(foo.split('\n')[1].split(' ')[1].split('=')[1])
|
||||
return float(foooo.split('\n')[1].split(' ')[1].split('=')[1])
|
||||
if psi_metrics == 'full_avg60':
|
||||
return float(foo.split('\n')[1].split(' ')[2].split('=')[1])
|
||||
return float(foooo.split('\n')[1].split(' ')[2].split('=')[1])
|
||||
if psi_metrics == 'full_avg300':
|
||||
return float(foo.split('\n')[1].split(' ')[3].split('=')[1])
|
||||
return float(foooo.split('\n')[1].split(' ')[3].split('=')[1])
|
||||
|
||||
except Exception as e:
|
||||
if debug_psi:
|
||||
@ -1466,21 +1411,30 @@ def check_zram():
|
||||
def format_time(t):
|
||||
"""
|
||||
"""
|
||||
t = int(t)
|
||||
total_s = int(t)
|
||||
|
||||
if t < 60:
|
||||
return '{}s'.format(t)
|
||||
if total_s < 60:
|
||||
return '{}s'.format(round(t, 1))
|
||||
|
||||
if t > 3600:
|
||||
h = t // 3600
|
||||
s0 = t - h * 3600
|
||||
m = s0 // 60
|
||||
s = s0 % 60
|
||||
return '{}h {}min {}s'.format(h, m, s)
|
||||
if total_s < 3600:
|
||||
total_m = total_s // 60
|
||||
mod_s = total_s % 60
|
||||
return '{}min {}s'.format(total_m, mod_s)
|
||||
|
||||
m = t // 60
|
||||
s = t % 60
|
||||
return '{}min {}s'.format(m, s)
|
||||
if total_s < 86400:
|
||||
total_m = total_s // 60
|
||||
mod_s = total_s % 60
|
||||
total_h = total_m // 60
|
||||
mod_m = total_m % 60
|
||||
return '{}h {}min {}s'.format(total_h, mod_m, mod_s)
|
||||
|
||||
total_m = total_s // 60
|
||||
mod_s = total_s % 60
|
||||
total_h = total_m // 60
|
||||
mod_m = total_m % 60
|
||||
total_d = total_h // 24
|
||||
mod_h = total_h % 24
|
||||
return '{}d {}h {}min {}s'.format(total_d, mod_h, mod_m, mod_s)
|
||||
|
||||
|
||||
def string_to_float_convert_test(string):
|
||||
@ -1577,13 +1531,8 @@ def is_alive(pid):
|
||||
rss = f.read().decode().split(' ')[1]
|
||||
if rss != '0':
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
except ProcessLookupError:
|
||||
return False
|
||||
except NotADirectoryError:
|
||||
return False
|
||||
except PermissionError:
|
||||
except (FileNotFoundError, ProcessLookupError, NotADirectoryError,
|
||||
PermissionError):
|
||||
return False
|
||||
|
||||
|
||||
@ -1593,7 +1542,7 @@ def alive_pid_list():
|
||||
pid_list = []
|
||||
for pid in os.listdir('/proc'):
|
||||
|
||||
if pid[0].isdecimal() is False:
|
||||
if not pid[0].isdecimal():
|
||||
continue
|
||||
|
||||
if is_alive(pid):
|
||||
@ -1611,24 +1560,16 @@ def pid_to_oom_score(pid):
|
||||
try:
|
||||
with open('/proc/{}/oom_score'.format(pid), 'rb', buffering=0) as f:
|
||||
return int(f.read())
|
||||
except FileNotFoundError:
|
||||
return 0
|
||||
except ProcessLookupError:
|
||||
return 0
|
||||
except NotADirectoryError:
|
||||
except (FileNotFoundError, ProcessLookupError, NotADirectoryError):
|
||||
return 0
|
||||
|
||||
|
||||
def pid_to_oom_score_adj(pid):
|
||||
try:
|
||||
with open('/proc/{}/oom_score_adj'.format(pid), 'rb', buffering=0
|
||||
) as f:
|
||||
with open(
|
||||
'/proc/{}/oom_score_adj'.format(pid), 'rb', buffering=0) as f:
|
||||
return int(f.read())
|
||||
except FileNotFoundError:
|
||||
return 0
|
||||
except ProcessLookupError:
|
||||
return 0
|
||||
except NotADirectoryError:
|
||||
except (FileNotFoundError, ProcessLookupError, NotADirectoryError):
|
||||
return 0
|
||||
|
||||
|
||||
@ -1639,7 +1580,7 @@ def badness_pid_list():
|
||||
for pid in os.listdir('/proc'):
|
||||
o = pid_to_oom_score(pid)
|
||||
if o >= 1:
|
||||
if pid[0].isdecimal() is False:
|
||||
if not pid[0].isdecimal():
|
||||
continue
|
||||
if pid == self_pid or pid == '1':
|
||||
continue
|
||||
@ -1810,9 +1751,7 @@ def find_victim(_print_proc_table):
|
||||
str(vm_rss).rjust(5),
|
||||
str(vm_swap).rjust(6),
|
||||
name.ljust(15),
|
||||
extra_table_line
|
||||
)
|
||||
)
|
||||
extra_table_line))
|
||||
|
||||
pid_badness_list.append((pid, badness))
|
||||
|
||||
@ -1839,15 +1778,12 @@ def find_victim(_print_proc_table):
|
||||
log('Found {} tasks with non-zero VmRSS (except init and self)'.format(
|
||||
real_proc_num))
|
||||
|
||||
log(
|
||||
'Process with highest badness (found in {}ms):\n PID: {}, Na'
|
||||
log('Process with highest badness (found in {}ms):\n PID: {}, Na'
|
||||
'me: {}, badness: {}'.format(
|
||||
round((monotonic() - ft1) * 1000),
|
||||
pid,
|
||||
victim_name,
|
||||
victim_badness
|
||||
)
|
||||
)
|
||||
victim_badness))
|
||||
|
||||
return pid, victim_badness, victim_name, victim_id
|
||||
|
||||
@ -1900,14 +1836,8 @@ def find_victim_info(pid, victim_badness, name):
|
||||
oom_score = pid_to_oom_score(pid)
|
||||
oom_score_adj = pid_to_oom_score_adj(pid)
|
||||
|
||||
except IndexError:
|
||||
x = 'The victim died in the search process: IndexError'
|
||||
log(x)
|
||||
update_stat_dict(x)
|
||||
print_stat_dict()
|
||||
return None
|
||||
except ValueError:
|
||||
x = 'The victim died in the search process: ValueError'
|
||||
except (IndexError, ValueError):
|
||||
x = 'Selected process died before corrective action'
|
||||
log(x)
|
||||
update_stat_dict(x)
|
||||
print_stat_dict()
|
||||
@ -1922,7 +1852,7 @@ def find_victim_info(pid, victim_badness, name):
|
||||
victim_cgroup_v2 = pid_to_cgroup_v2(pid)
|
||||
|
||||
except FileNotFoundError:
|
||||
x = 'The victim died in the search process: FileNotFoundError'
|
||||
x = 'Selected process died before corrective action'
|
||||
log(x)
|
||||
update_stat_dict(x)
|
||||
print_stat_dict()
|
||||
@ -1930,7 +1860,7 @@ def find_victim_info(pid, victim_badness, name):
|
||||
|
||||
ancestry = pid_to_ancestry(pid, max_victim_ancestry_depth)
|
||||
|
||||
if print_victim_cmdline is False:
|
||||
if not print_victim_cmdline:
|
||||
cmdline = ''
|
||||
c1 = ''
|
||||
else:
|
||||
@ -1962,25 +1892,19 @@ def find_victim_info(pid, victim_badness, name):
|
||||
uid,
|
||||
nssid, pid_to_name(nssid),
|
||||
victim_lifetime,
|
||||
|
||||
victim_badness,
|
||||
oom_score,
|
||||
oom_score_adj,
|
||||
|
||||
vm_size,
|
||||
vm_rss,
|
||||
detailed_rss_info,
|
||||
vm_swap,
|
||||
|
||||
victim_cgroup_v1,
|
||||
victim_cgroup_v2,
|
||||
|
||||
ancestry,
|
||||
c1, cmdline,
|
||||
realpath,
|
||||
cwd
|
||||
|
||||
)
|
||||
cwd)
|
||||
|
||||
return victim_info
|
||||
|
||||
@ -2081,20 +2005,14 @@ def check_zram_ex():
|
||||
"""
|
||||
mem_used_zram = check_zram()
|
||||
|
||||
if mem_available <= hard_threshold_min_mem_kb:
|
||||
ma_hard_threshold_exceded = True
|
||||
else:
|
||||
ma_hard_threshold_exceded = False
|
||||
ma_hard_threshold_exceded = bool(
|
||||
mem_available <= hard_threshold_min_mem_kb)
|
||||
|
||||
if mem_available <= soft_threshold_min_mem_kb:
|
||||
ma_soft_threshold_exceded = True
|
||||
else:
|
||||
ma_soft_threshold_exceded = False
|
||||
ma_soft_threshold_exceded = bool(
|
||||
mem_available <= soft_threshold_min_mem_kb)
|
||||
|
||||
if mem_available <= warning_threshold_min_mem_kb:
|
||||
ma_warning_threshold_exceded = True
|
||||
else:
|
||||
ma_warning_threshold_exceded = False
|
||||
ma_warning_threshold_exceded = bool(
|
||||
mem_available <= warning_threshold_min_mem_kb)
|
||||
|
||||
if (mem_used_zram >= hard_threshold_max_zram_kb and
|
||||
ma_hard_threshold_exceded):
|
||||
@ -2140,25 +2058,18 @@ def check_zram_ex():
|
||||
return None, None, mem_used_zram
|
||||
|
||||
|
||||
def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
def check_psi_ex(psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
mem_available):
|
||||
"""
|
||||
"""
|
||||
ma_hard_threshold_exceded = bool(
|
||||
mem_available <= hard_threshold_min_mem_kb)
|
||||
|
||||
if mem_available <= hard_threshold_min_mem_kb:
|
||||
ma_hard_threshold_exceded = True
|
||||
else:
|
||||
ma_hard_threshold_exceded = False
|
||||
ma_soft_threshold_exceded = bool(
|
||||
mem_available <= soft_threshold_min_mem_kb)
|
||||
|
||||
if mem_available <= soft_threshold_min_mem_kb:
|
||||
ma_soft_threshold_exceded = True
|
||||
else:
|
||||
ma_soft_threshold_exceded = False
|
||||
|
||||
if mem_available <= warning_threshold_min_mem_kb:
|
||||
ma_warning_threshold_exceded = True
|
||||
else:
|
||||
ma_warning_threshold_exceded = False
|
||||
ma_warning_threshold_exceded = bool(
|
||||
mem_available <= warning_threshold_min_mem_kb)
|
||||
|
||||
if not (ma_warning_threshold_exceded or ma_soft_threshold_exceded or
|
||||
ma_hard_threshold_exceded) or swap_total == 0:
|
||||
@ -2168,7 +2079,7 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
'lds of available memory is exceeded')
|
||||
|
||||
return (None, None,
|
||||
psi_t0, psi_kill_exceeded_timer,
|
||||
psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0)
|
||||
|
||||
delta0 = monotonic() - x0
|
||||
@ -2185,14 +2096,12 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
psi_metrics, psi_path, psi_avg_value))
|
||||
|
||||
if psi_avg_value is None:
|
||||
return (None, None, psi_t0, -0.0001, -0.0001, x0)
|
||||
return (None, None, -0.0001, -0.0001, x0)
|
||||
|
||||
psi_post_action_delay_timer = monotonic() - last_action_dict['t'] # psi_t0
|
||||
psi_post_action_delay_timer = monotonic() - last_action_dict['t']
|
||||
|
||||
if psi_post_action_delay_timer >= psi_post_action_delay:
|
||||
psi_post_action_delay_exceeded = True
|
||||
else:
|
||||
psi_post_action_delay_exceeded = False
|
||||
psi_post_action_delay_exceeded = bool(
|
||||
psi_post_action_delay_timer >= psi_post_action_delay)
|
||||
|
||||
if psi_avg_value >= hard_threshold_max_psi:
|
||||
sigkill_psi_exceeded = True
|
||||
@ -2218,8 +2127,7 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
'eded: {}, hard_psi_excess_duration: {}'.format(
|
||||
ma_hard_threshold_exceded,
|
||||
sigkill_psi_exceeded,
|
||||
round(psi_kill_exceeded_timer, 1)
|
||||
))
|
||||
round(psi_kill_exceeded_timer, 1)))
|
||||
|
||||
if (sigkill_psi_exceeded and psi_kill_exceeded_timer >=
|
||||
psi_excess_duration and psi_post_action_delay_exceeded and
|
||||
@ -2227,9 +2135,9 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
|
||||
mem_info = 'Memory status that requires corrective actions:\n MemAv' \
|
||||
'ailable [{} MiB, {} %] <= hard_threshold_min_mem [{} MiB' \
|
||||
', {} %]\n PSI avg value ({}) >= hard_threshold_max_psi ' \
|
||||
'({})\n PSI avg value exceeded psi_excess_duration (valu' \
|
||||
'e={}s) for {}s'.format(
|
||||
', {} %]\n Current PSI metric value ({}) >= hard_thresho' \
|
||||
'ld_max_psi ({})\n PSI metric value exceeded psi_excess_' \
|
||||
'duration ({}s) for {}s'.format(
|
||||
kib_to_mib(mem_available),
|
||||
percent(mem_available / mem_total),
|
||||
kib_to_mib(hard_threshold_min_mem_kb),
|
||||
@ -2237,10 +2145,9 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
psi_avg_value,
|
||||
hard_threshold_max_psi,
|
||||
psi_excess_duration,
|
||||
round(psi_kill_exceeded_timer, 1)
|
||||
)
|
||||
round(psi_kill_exceeded_timer, 1))
|
||||
|
||||
return (SIGKILL, mem_info, psi_t0, psi_kill_exceeded_timer,
|
||||
return (SIGKILL, mem_info, psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0)
|
||||
|
||||
if psi_avg_value >= soft_threshold_max_psi:
|
||||
@ -2262,8 +2169,7 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
'eded: {}, soft_psi_excess_duration: {}'.format(
|
||||
ma_soft_threshold_exceded,
|
||||
sigterm_psi_exceeded,
|
||||
round(psi_term_exceeded_timer, 1)
|
||||
))
|
||||
round(psi_term_exceeded_timer, 1)))
|
||||
|
||||
if (sigterm_psi_exceeded and psi_term_exceeded_timer >=
|
||||
psi_excess_duration and psi_post_action_delay_exceeded and
|
||||
@ -2271,9 +2177,9 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
|
||||
mem_info = 'Memory status that requires corrective actions:\n MemA' \
|
||||
'vailable [{} MiB, {} %] <= soft_threshold_min_mem [{} M' \
|
||||
'iB, {} %]\n PSI avg value ({}) >= soft_threshold_max_p' \
|
||||
'si ({})\n PSI avg value exceeded psi_excess_duration (' \
|
||||
'value={}s) for {}s'.format(
|
||||
'iB, {} %]\n Current PSI metric value ({}) >= soft_thre' \
|
||||
'shold_max_psi ({})\n PSI metric value exceeded psi_exc' \
|
||||
'ess_duration ({}s) for {}s'.format(
|
||||
kib_to_mib(mem_available),
|
||||
percent(mem_available / mem_total),
|
||||
kib_to_mib(soft_threshold_min_mem_kb),
|
||||
@ -2281,20 +2187,19 @@ def check_psi_ex(psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
psi_avg_value,
|
||||
soft_threshold_max_psi,
|
||||
psi_excess_duration,
|
||||
round(psi_term_exceeded_timer, 1)
|
||||
)
|
||||
round(psi_term_exceeded_timer, 1))
|
||||
|
||||
return (SIGTERM, mem_info, psi_t0, psi_kill_exceeded_timer,
|
||||
return (SIGTERM, mem_info, psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0)
|
||||
|
||||
if low_memory_warnings_enabled:
|
||||
|
||||
if (psi_avg_value >= warning_threshold_max_psi and
|
||||
ma_warning_threshold_exceded):
|
||||
return ('WARN', None, psi_t0, psi_kill_exceeded_timer,
|
||||
return ('WARN', None, psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0)
|
||||
|
||||
return (None, None, psi_t0, psi_kill_exceeded_timer,
|
||||
return (None, None, psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0)
|
||||
|
||||
|
||||
@ -2303,7 +2208,7 @@ def is_victim_alive(victim_id):
|
||||
We do not have a reliable sign of the end of the release of memory:
|
||||
https://github.com/rfjakob/earlyoom/issues/128#issuecomment-507023717
|
||||
"""
|
||||
starttime, pid = victim_id.split('_pid')
|
||||
_, pid = victim_id.split('_pid')
|
||||
new_victim_id = get_victim_id(pid)
|
||||
if victim_id != new_victim_id:
|
||||
return 0
|
||||
@ -2385,7 +2290,6 @@ def is_post_oom_delay_exceeded():
|
||||
def implement_corrective_action(
|
||||
threshold,
|
||||
mem_info_list,
|
||||
psi_t0,
|
||||
psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer,
|
||||
x0,
|
||||
@ -2401,7 +2305,7 @@ def implement_corrective_action(
|
||||
post_oom_delay_exceeded = is_post_oom_delay_exceeded()
|
||||
if not post_oom_delay_exceeded:
|
||||
log(separator_out)
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
time0 = monotonic()
|
||||
|
||||
@ -2461,7 +2365,7 @@ def implement_corrective_action(
|
||||
|
||||
log(separator_out)
|
||||
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
if fff is None:
|
||||
|
||||
@ -2471,27 +2375,27 @@ def implement_corrective_action(
|
||||
|
||||
log(separator_out)
|
||||
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
pid, victim_badness, name, victim_id = fff
|
||||
|
||||
post_oom_delay_exceeded = is_post_oom_delay_exceeded()
|
||||
if not post_oom_delay_exceeded:
|
||||
log(separator_out)
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
log('Recheck memory levels...')
|
||||
|
||||
(masf_threshold, masf_info, mem_available, hard_threshold_min_swap_kb,
|
||||
soft_threshold_min_swap_kb, swap_free, swap_total) = check_mem_swap_ex()
|
||||
(masf_threshold, masf_info, mem_available, _, _, swap_free, _
|
||||
) = check_mem_swap_ex()
|
||||
|
||||
if zram_checking_enabled:
|
||||
zram_threshold, zram_info, mem_used_zram = check_zram_ex()
|
||||
zram_threshold, zram_info, _ = check_zram_ex()
|
||||
|
||||
if CHECK_PSI:
|
||||
(psi_threshold, psi_info, psi_t0, psi_kill_exceeded_timer,
|
||||
(psi_threshold, psi_info, psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0) = check_psi_ex(
|
||||
psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
mem_available)
|
||||
|
||||
if (masf_threshold is SIGKILL or zram_threshold is SIGKILL or
|
||||
@ -2527,7 +2431,7 @@ def implement_corrective_action(
|
||||
else:
|
||||
log('Thresholds is not exceeded now')
|
||||
log(separator_out)
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
for i in mem_info_list:
|
||||
log(i)
|
||||
@ -2535,7 +2439,7 @@ def implement_corrective_action(
|
||||
if new_threshold is None or new_threshold == 'WARN':
|
||||
log('Thresholds is not exceeded now')
|
||||
log(separator_out)
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
threshold = new_threshold
|
||||
|
||||
@ -2560,7 +2464,7 @@ def implement_corrective_action(
|
||||
|
||||
log(separator_out)
|
||||
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
if victim_badness >= min_badness:
|
||||
|
||||
@ -2573,7 +2477,7 @@ def implement_corrective_action(
|
||||
|
||||
log(separator_out)
|
||||
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
log_meminfo()
|
||||
|
||||
@ -2626,7 +2530,7 @@ def implement_corrective_action(
|
||||
post_oom_delay_exceeded = is_post_oom_delay_exceeded()
|
||||
if not post_oom_delay_exceeded:
|
||||
log(separator_out)
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
if soft_match:
|
||||
|
||||
@ -2684,18 +2588,9 @@ def implement_corrective_action(
|
||||
|
||||
print_stat_dict()
|
||||
|
||||
except FileNotFoundError:
|
||||
|
||||
vwd = True
|
||||
key = 'Cannot send a signal: FileNotFoundError'
|
||||
update_stat_dict(key)
|
||||
print_stat_dict()
|
||||
log(key)
|
||||
|
||||
except ProcessLookupError:
|
||||
|
||||
vwd = True
|
||||
key = 'Cannot send a signal: ProcessLookupError'
|
||||
key = 'Selected process died before corrective action'
|
||||
update_stat_dict(key)
|
||||
print_stat_dict()
|
||||
log(key)
|
||||
@ -2707,8 +2602,7 @@ def implement_corrective_action(
|
||||
update_stat_dict(key)
|
||||
print_stat_dict()
|
||||
log('Sleep {}s'.format(post_soft_action_delay))
|
||||
sleep(post_soft_action_delay)
|
||||
# do not send signal twice!
|
||||
sleep(10)
|
||||
|
||||
if not vwd:
|
||||
if victim_id not in v_dict:
|
||||
@ -2759,7 +2653,7 @@ def implement_corrective_action(
|
||||
sleep(post_zombie_delay)
|
||||
break
|
||||
|
||||
mem_available, swap_total, swap_free = check_mem_and_swap()
|
||||
mem_available, _, swap_free = check_mem_and_swap()
|
||||
ma_mib = int(mem_available) / 1024.0
|
||||
sf_mib = int(swap_free) / 1024.0
|
||||
log('Memory status after implementing a corrective act'
|
||||
@ -2806,7 +2700,7 @@ def implement_corrective_action(
|
||||
|
||||
log(separator_out)
|
||||
|
||||
return psi_t0
|
||||
return None
|
||||
|
||||
|
||||
def sleep_after_check_mem():
|
||||
@ -3133,8 +3027,6 @@ SC_CLK_TCK = os.sysconf(os.sysconf_names['SC_CLK_TCK'])
|
||||
|
||||
SC_PAGESIZE = os.sysconf(os.sysconf_names['SC_PAGESIZE'])
|
||||
|
||||
conf_err_mess = 'Invalid config. Exit.'
|
||||
|
||||
sig_list = [SIGTERM, SIGINT, SIGQUIT, SIGHUP]
|
||||
|
||||
sig_dict = {
|
||||
@ -3149,11 +3041,7 @@ self_pid = str(os.getpid())
|
||||
|
||||
self_uid = os.geteuid()
|
||||
|
||||
if self_uid == 0:
|
||||
root = True
|
||||
else:
|
||||
root = False
|
||||
|
||||
root = bool(self_uid == 0)
|
||||
|
||||
last_action_dict = dict()
|
||||
|
||||
@ -3295,19 +3183,11 @@ except ValueError:
|
||||
|
||||
config = os.path.abspath(config)
|
||||
|
||||
print('Starting nohang with the config: {}'.format(config))
|
||||
print('Starting nohang with config {}'.format(config))
|
||||
|
||||
|
||||
# separator_in = '>>' + '=' * 75 + '>>'
|
||||
# separator_out = '<<' + '=' * 75 + '<<'
|
||||
|
||||
|
||||
# separator_in = '>>=== implement_corrective_action() ==================>>'
|
||||
# separator_out = '<<=== exit from implement_corrective_action() ========<<'
|
||||
|
||||
|
||||
separator_in = '>----- implement_corrective_action() ------------------>'
|
||||
separator_out = '<----- exit from implement_corrective_action() --------<'
|
||||
separator_in = '>>=== STARTING implement_corrective_action() ====>>'
|
||||
separator_out = '<<=== FINISHING implement_corrective_action() ===<<'
|
||||
|
||||
|
||||
###############################################################################
|
||||
@ -3493,20 +3373,10 @@ try:
|
||||
badness_adj_re_environ_list.append((badness_adj, reg_exp))
|
||||
|
||||
|
||||
except PermissionError:
|
||||
errprint('PermissionError', conf_err_mess)
|
||||
exit(1)
|
||||
except UnicodeDecodeError:
|
||||
errprint('UnicodeDecodeError', conf_err_mess)
|
||||
exit(1)
|
||||
except IsADirectoryError:
|
||||
errprint('IsADirectoryError', conf_err_mess)
|
||||
exit(1)
|
||||
except IndexError:
|
||||
errprint('IndexError', conf_err_mess)
|
||||
exit(1)
|
||||
except FileNotFoundError:
|
||||
errprint('FileNotFoundError', conf_err_mess)
|
||||
except (PermissionError, UnicodeDecodeError, IsADirectoryError, IndexError,
|
||||
FileNotFoundError) as e:
|
||||
errprint(e)
|
||||
errprint('Invalid config. Exit.')
|
||||
exit(1)
|
||||
|
||||
|
||||
@ -3644,10 +3514,7 @@ except Exception as e:
|
||||
log('WARNING: PSI metrics are not provided by the kernel: {}'.format(
|
||||
e))
|
||||
|
||||
if PSI_KERNEL_OK and psi_checking_enabled:
|
||||
CHECK_PSI = True
|
||||
else:
|
||||
CHECK_PSI = False
|
||||
CHECK_PSI = bool(PSI_KERNEL_OK and psi_checking_enabled)
|
||||
|
||||
zram_checking_enabled = conf_parse_bool('zram_checking_enabled')
|
||||
|
||||
@ -3873,10 +3740,7 @@ else:
|
||||
|
||||
if 'warning_exe' in config_dict:
|
||||
warning_exe = config_dict['warning_exe']
|
||||
if warning_exe != '':
|
||||
check_warning_exe = True
|
||||
else:
|
||||
check_warning_exe = False
|
||||
check_warning_exe = bool(warning_exe != '')
|
||||
else:
|
||||
missing_config_key('warning_exe')
|
||||
|
||||
@ -3929,12 +3793,7 @@ else:
|
||||
|
||||
over_sleep = min_sleep
|
||||
sensitivity_test_time = over_sleep / 4
|
||||
|
||||
|
||||
if max_sleep == min_sleep:
|
||||
stable_sleep = True
|
||||
else:
|
||||
stable_sleep = False
|
||||
stable_sleep = bool(max_sleep == min_sleep)
|
||||
|
||||
|
||||
if print_proc_table_flag:
|
||||
@ -4047,7 +3906,6 @@ mem_info = None
|
||||
|
||||
|
||||
psi_kill_exceeded_timer = psi_term_exceeded_timer = -0.0001
|
||||
psi_t0 = monotonic()
|
||||
psi_threshold = zram_threshold = zram_info = psi_info = None
|
||||
|
||||
|
||||
@ -4133,39 +3991,30 @@ while True:
|
||||
zram_threshold, zram_info, mem_used_zram = check_zram_ex()
|
||||
|
||||
if CHECK_PSI:
|
||||
(psi_threshold, psi_info, psi_t0, psi_kill_exceeded_timer,
|
||||
(psi_threshold, psi_info, psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer, x0) = check_psi_ex(
|
||||
psi_t0, psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
psi_kill_exceeded_timer, psi_term_exceeded_timer, x0,
|
||||
mem_available)
|
||||
|
||||
if print_mem_check_results:
|
||||
|
||||
if CHECK_PSI:
|
||||
psi_avg_value = find_psi_metrics_value(psi_path, psi_metrics)
|
||||
if monotonic() - psi_t0 >= psi_post_action_delay:
|
||||
psi_post_action_delay_exceeded = True
|
||||
else:
|
||||
psi_post_action_delay_exceeded = False
|
||||
|
||||
psi_post_action_delay_exceeded = bool(
|
||||
monotonic() >= psi_post_action_delay)
|
||||
if print_mem_check_results:
|
||||
psi_avg_string = 'PSI: {} | '.format(
|
||||
str(psi_avg_value).rjust(6))
|
||||
|
||||
wt1 = monotonic()
|
||||
|
||||
delta = (mem_available + swap_free) - new_mem
|
||||
|
||||
t_cycle = wt1 - wt2
|
||||
|
||||
report_delta = wt1 - report0
|
||||
|
||||
if report_delta >= min_mem_report_interval:
|
||||
|
||||
mem_report = True
|
||||
new_mem = mem_available + swap_free
|
||||
|
||||
report0 = wt1
|
||||
|
||||
else:
|
||||
mem_report = False
|
||||
|
||||
@ -4175,8 +4024,7 @@ while True:
|
||||
|
||||
speed = delta / 1024.0 / report_delta
|
||||
speed_info = ' | dMem: {} M/s'.format(
|
||||
str(round(speed)).rjust(5)
|
||||
)
|
||||
str(round(speed)).rjust(5))
|
||||
|
||||
# Calculate 'swap-column' width
|
||||
swap_len = len(str(round(swap_total / 1024.0)))
|
||||
@ -4187,9 +4035,7 @@ while True:
|
||||
psi_avg_string,
|
||||
human(mem_available, mem_len),
|
||||
just_percent_mem(mem_available / mem_total),
|
||||
speed_info
|
||||
)
|
||||
)
|
||||
speed_info))
|
||||
|
||||
elif swap_total > 0 and mem_used_zram == 0:
|
||||
log('{}MemAvail: {} M, {} % | SwapFree: {} M, {} %{}'.format(
|
||||
@ -4198,9 +4044,7 @@ while True:
|
||||
just_percent_mem(mem_available / mem_total),
|
||||
human(swap_free, swap_len),
|
||||
just_percent_swap(swap_free / (swap_total + 0.1)),
|
||||
speed_info
|
||||
)
|
||||
)
|
||||
speed_info))
|
||||
|
||||
else:
|
||||
log('{}MemAvail: {} M, {} % | SwapFree: {} M, {} % | Mem'
|
||||
@ -4212,9 +4056,7 @@ while True:
|
||||
just_percent_swap(swap_free / (swap_total + 0.1)),
|
||||
human(mem_used_zram, mem_len),
|
||||
just_percent_mem(mem_used_zram / mem_total),
|
||||
speed_info
|
||||
)
|
||||
)
|
||||
speed_info))
|
||||
|
||||
if (masf_threshold == SIGKILL or zram_threshold == SIGKILL or
|
||||
psi_threshold == SIGKILL):
|
||||
@ -4231,10 +4073,9 @@ while True:
|
||||
if psi_info is not None:
|
||||
mem_info_list.append(psi_info)
|
||||
|
||||
psi_t0 = implement_corrective_action(
|
||||
implement_corrective_action(
|
||||
threshold,
|
||||
mem_info_list,
|
||||
psi_t0,
|
||||
psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer,
|
||||
x0, psi_threshold, zram_threshold, zram_info, psi_info)
|
||||
@ -4256,10 +4097,9 @@ while True:
|
||||
|
||||
mem_info_list.append(psi_info)
|
||||
|
||||
psi_t0 = implement_corrective_action(
|
||||
implement_corrective_action(
|
||||
threshold,
|
||||
mem_info_list,
|
||||
psi_t0,
|
||||
psi_kill_exceeded_timer,
|
||||
psi_term_exceeded_timer,
|
||||
x0, psi_threshold, zram_threshold, zram_info, psi_info)
|
||||
|
Loading…
Reference in New Issue
Block a user