fix fattest()

This commit is contained in:
Alexey Avramov 2018-12-12 04:01:35 +09:00
parent 83c1fd1018
commit 4f5f4c7d44

76
nohang
View File

@ -577,45 +577,77 @@ def fattest():
"""Find the 'fattest' process""" """Find the 'fattest' process"""
pid_badness_list = [] pid_badness_list = []
if regex_matching: for pid in os.listdir('/proc'):
# only directories whose names consist only of numbers, except /proc/1/
if pid[0].isdecimal() is False or pid == '1':
continue
for pid in os.listdir('/proc'): # find and modify badness (if it needs)
if pid[0].isdecimal() is False: try:
continue badness = int(rline1('/proc/' + pid + '/oom_score'))
if decrease_oom_score_adj:
oom_score_adj = int(rline1('/proc/' + pid + '/oom_score_adj'))
if badness > oom_score_adj_max:
badness = badness - oom_score_adj + oom_score_adj_max
if regex_matching:
try:
badness = int(rline1('/proc/' + pid + '/oom_score'))
name = pid_to_name(pid) name = pid_to_name(pid)
cmdline = pid_to_cmdline(pid)
uid = pid_to_uid(pid)
# skip kthreads
if cmdline == '':
continue
#print([uid], [name], [cmdline])
if search(avoid_regex, name) is not None: if search(avoid_regex, name) is not None:
badness = int(badness / avoid_factor) badness = int(badness / avoid_factor)
print(' Name matches with avoid_regex \033[33m{}\033[0m: \033[33m{}\033[0m, CmdLine: {}'.format(
avoid_regex, name, cmdline))
if search(prefer_regex, name) is not None: if search(prefer_regex, name) is not None:
badness = int((badness + 1) * prefer_factor) badness = int((badness + 1) * prefer_factor)
print(' Name matches with prefer_regex \033[33m{}\033[0m: \033[33m{}\033[0m, CmdLine: {}'.format(
prefer_regex, name, cmdline))
except FileNotFoundError:
badness = 0
except ProcessLookupError:
badness = 0
pid_badness_list.append((pid, badness))
else: if search(avoid_re_cmdline, cmdline) is not None:
badness = int(badness / avoid_cmd_factor)
print(' Cmdline matches with avoid_re_cmdline \033[33m{}\033[0m: \033[33m{}\033[0m, Name: {}'.format(
avoid_re_cmdline, cmdline, name))
for pid in os.listdir('/proc'): if search(prefer_re_cmdline, cmdline) is not None:
if pid[0].isdecimal() is False: badness = int((badness + 1) * prefer_cmd_factor)
continue print(' Cmdline matches with prefer_re_cmdline \033[33m{}\033[0m: \033[33m{}\033[0m, Name: {}'.format(
try: prefer_re_cmdline, cmdline, name))
badness = int(rline1('/proc/' + pid + '/oom_score'))
except FileNotFoundError:
badness = 0 if search(avoid_re_uid, uid) is not None:
except ProcessLookupError: badness = int(badness / avoid_uid_factor)
badness = 0 print(' UID matches with avoid_re_uid \033[33m{}\033[0m: \033[33m{}\033[0m, Name: {}'.format(
pid_badness_list.append((pid, badness)) avoid_re_uid, uid, name))
if search(prefer_re_uid, uid) is not None:
badness = int((badness + 1) * prefer_uid_factor)
print(' UID matches with prefer_re_uid \033[33m{}\033[0m: \033[33m{}\033[0m, Name: {}'.format(
prefer_re_uid, uid, name))
except FileNotFoundError:
badness = 0
except ProcessLookupError:
badness = 0
pid_badness_list.append((pid, badness))
# Make list of (pid, badness) tuples, sorted by 'badness' values # Make list of (pid, badness) tuples, sorted by 'badness' values
pid_tuple_list = sorted( pid_tuple_list = sorted(
pid_badness_list, key=itemgetter(1), reverse=True)[0] pid_badness_list, key=itemgetter(1), reverse=True)[0]
# Get maximum 'badness' value
victim_badness = pid_tuple_list[1]
pid = pid_tuple_list[0] pid = pid_tuple_list[0]
name = pid_to_name(pid) name = pid_to_name(pid)