nohang/oom-top
Alexey Avramov 2bcd4298b1 fix readme
2018-11-29 03:49:56 +09:00

119 lines
3.5 KiB
Python
Executable File

#!/usr/bin/env python3
# top oom_score
from time import sleep
from operator import itemgetter
from os import listdir
period = 1
num_lines = 20
oom_score_min_value = 0
# перевод кило в мегабайты и выравнивание по правому краю
def human(num):
return str(round(num / 1024.0)).rjust(7, ' ')
with open('/proc/self/status') as file:
status_list = file.readlines()
# список имен из /proc/*/status для дальнейшего поиска позиций VmRSS and VmSwap
status_names = []
for s in status_list:
status_names.append(s.split(':')[0])
vm_rss_index = status_names.index('VmRSS')
vm_swap_index = status_names.index('VmSwap')
while True:
oom_list = []
# цикл для наполнения oom_list
for i in listdir('/proc'):
# пропускаем элементы, состоящие не из цифр
if i.isdigit() is not True:
continue
try:
with open('/proc/' + i + '/oom_score') as file:
oom_score = int(file.readlines()[0][:-1])
with open('/proc/' + i + '/oom_adj') as file:
oom_adj = int(file.readlines()[0][:-1])
with open('/proc/' + i + '/oom_score_adj') as file:
oom_score_adj = int(file.readlines()[0][:-1])
except FileNotFoundError:
pass
except ProcessLookupError:
pass
oom_list.append((i, oom_score, oom_adj, oom_score_adj))
# получаем сортированный список oom_score
oom_list_sorted = sorted(oom_list, key=itemgetter(1), reverse=True)
# если общее число процессов меньше num_lines - приравниваем последний к числу процессов
if len(oom_list_sorted) < num_lines:
num_lines = len(oom_list_sorted) - 1
print('\033coom_score oom_adj oom_score_adj Pid Name RSS Swap')
print('--------- ------- ------------- ----- --------------- --------- ---------')
# итерируемся по сортированному списку oom_score, печатая name, pid etc
for i in oom_list_sorted[:num_lines]:
pid = i[0]
oom_score = i[1]
oom_adj = i[2]
oom_score_adj = i[3]
try:
# читать часть файла не дальше VmSwap
with open('/proc/' + pid + '/status') as file:
status_list = file.readlines()
vm_rss = int(status_list[vm_rss_index].split(':')[1].split(' ')[-2])
vm_swap = int(status_list[vm_swap_index].split(':')[1].split(' ')[-2])
name = status_list[0][:-1].split('\t')[1]
# потоки ядра
except IndexError:
vm_rss = 0
vm_swap = 0
name = status_list[0][:-1].split('\t')[1]
except FileNotFoundError:
vm_rss = 0
vm_swap = 0
name = '<unknown, dead>'
except ProcessLookupError:
vm_rss = 0
vm_swap = 0
name = '<unknown, dead>'
if oom_score >= oom_score_min_value:
print(
'{} {} {} {} {} {} M {} M'.format(
str(oom_score).rjust(9),
str(oom_adj).rjust(7),
str(oom_score_adj).rjust(13),
str(pid).rjust(5),
name.ljust(15),
human(vm_rss),
human(vm_swap),
)
)
sleep(period)