Print mem info and mem pressure before corrective action
This commit is contained in:
parent
2f0fede88f
commit
a37f03db60
151
nohang/nohang
151
nohang/nohang
@ -937,7 +937,7 @@ def pid_to_ancestry(pid, max_victim_ancestry_depth=1):
|
|||||||
a = ''
|
a = ''
|
||||||
for i in anc_list:
|
for i in anc_list:
|
||||||
a = a + ' <= PID {} ({})'.format(i[0], i[1])
|
a = a + ' <= PID {} ({})'.format(i[0], i[1])
|
||||||
return '\n Ancestry: ' + a[4:]
|
return '\n ancestry: ' + a[4:]
|
||||||
|
|
||||||
|
|
||||||
def pid_to_cmdline(pid):
|
def pid_to_cmdline(pid):
|
||||||
@ -1293,11 +1293,58 @@ def check_mem_and_swap():
|
|||||||
"""
|
"""
|
||||||
with open('/proc/meminfo', 'rb') as f:
|
with open('/proc/meminfo', 'rb') as f:
|
||||||
m_list = f.read().decode().split(' kB\n')
|
m_list = f.read().decode().split(' kB\n')
|
||||||
return (int(m_list[2].split(':')[1]),
|
return (int(m_list[mem_available_index].split(':')[1]),
|
||||||
int(m_list[swap_total_index].split(':')[1]),
|
int(m_list[swap_total_index].split(':')[1]),
|
||||||
int(m_list[swap_free_index].split(':')[1]))
|
int(m_list[swap_free_index].split(':')[1]))
|
||||||
|
|
||||||
|
|
||||||
|
def meminfo():
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
with open('/proc/meminfo', 'rb') as f:
|
||||||
|
m_list = f.read().decode().split(' kB\n')
|
||||||
|
|
||||||
|
mem_available = int(m_list[mem_available_index].split(':')[1])
|
||||||
|
mem_free = int(m_list[mem_free_index].split(':')[1])
|
||||||
|
swap_total = int(m_list[swap_total_index].split(':')[1])
|
||||||
|
swap_free = int(m_list[swap_free_index].split(':')[1])
|
||||||
|
buffers = int(m_list[buffers_index].split(':')[1])
|
||||||
|
cached = int(m_list[cached_index].split(':')[1])
|
||||||
|
sreclaimable = int(m_list[sreclaimable_index].split(':')[1])
|
||||||
|
shmem = int(m_list[shmem_index].split(':')[1])
|
||||||
|
|
||||||
|
md = dict()
|
||||||
|
|
||||||
|
md['total'] = mem_total
|
||||||
|
md['used'] = mem_total - mem_free - buffers - cached - sreclaimable
|
||||||
|
md['free'] = mem_free
|
||||||
|
md['available'] = mem_available
|
||||||
|
md['shared'] = shmem
|
||||||
|
md['buffers'] = buffers
|
||||||
|
md['cache'] = cached + sreclaimable
|
||||||
|
md['swap_total'] = swap_total
|
||||||
|
md['swap_used'] = swap_total - swap_free
|
||||||
|
md['swap_free'] = swap_free
|
||||||
|
|
||||||
|
return md
|
||||||
|
|
||||||
|
|
||||||
|
def memory_pressure():
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
with open('/proc/pressure/memory') as f:
|
||||||
|
psi_list = f.readlines()
|
||||||
|
some_list, full_list = psi_list[0].split(' '), psi_list[1].split(' ')
|
||||||
|
some_avg10 = some_list[1].split('=')[1]
|
||||||
|
some_avg60 = some_list[2].split('=')[1]
|
||||||
|
some_avg300 = some_list[3].split('=')[1]
|
||||||
|
full_avg10 = full_list[1].split('=')[1]
|
||||||
|
full_avg60 = full_list[2].split('=')[1]
|
||||||
|
full_avg300 = full_list[3].split('=')[1]
|
||||||
|
return (some_avg10, some_avg60, some_avg300,
|
||||||
|
full_avg10, full_avg60, full_avg300)
|
||||||
|
|
||||||
|
|
||||||
def check_zram():
|
def check_zram():
|
||||||
"""Find MemUsedZram (mem_used_total)."""
|
"""Find MemUsedZram (mem_used_total)."""
|
||||||
if os.path.exists('/sys/block/zram0/mem_limit'):
|
if os.path.exists('/sys/block/zram0/mem_limit'):
|
||||||
@ -1774,8 +1821,6 @@ def find_victim_info(pid, victim_badness, name):
|
|||||||
print_stat_dict()
|
print_stat_dict()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
len_vm = len(str(vm_size))
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
realpath = pid_to_realpath(pid)
|
realpath = pid_to_realpath(pid)
|
||||||
cwd = pid_to_cwd(pid)
|
cwd = pid_to_cwd(pid)
|
||||||
@ -1797,19 +1842,56 @@ def find_victim_info(pid, victim_badness, name):
|
|||||||
cmdline = ''
|
cmdline = ''
|
||||||
c1 = ''
|
c1 = ''
|
||||||
else:
|
else:
|
||||||
c1 = '\n Cmdline: '
|
c1 = '\n cmdline: '
|
||||||
|
|
||||||
if detailed_rss:
|
if detailed_rss:
|
||||||
detailed_rss_info = ' (' \
|
detailed_rss_info = ' (Anon: {}, File: {}, Shmem: {})'.format(
|
||||||
'Anon: {} MiB, ' \
|
|
||||||
'File: {} MiB, ' \
|
|
||||||
'Shmem: {} MiB)'.format(
|
|
||||||
anon_rss,
|
anon_rss,
|
||||||
file_rss,
|
file_rss,
|
||||||
shmem_rss)
|
shmem_rss)
|
||||||
else:
|
else:
|
||||||
detailed_rss_info = ''
|
detailed_rss_info = ''
|
||||||
|
|
||||||
|
victim_info = 'Victim status (found in {}ms):' \
|
||||||
|
'\n PID: {}, name: {}, state: {}, EUID: {}, ' \
|
||||||
|
'SID: {} ({}), lifetime: {}' \
|
||||||
|
'\n badness: {}, oom_score: {}, oom_score_adj: {}' \
|
||||||
|
'\n Vm, MiB: Size: {}, RSS: {}{}, Swap: {}' \
|
||||||
|
'\n cgroup_v1: {}' \
|
||||||
|
'\n cgroup_v2: {}' \
|
||||||
|
'{}{}{}' \
|
||||||
|
'\n exe realpath: {}' \
|
||||||
|
'\n cwd realpath: {}'.format(
|
||||||
|
|
||||||
|
round((monotonic() - status0) * 1000),
|
||||||
|
pid,
|
||||||
|
name,
|
||||||
|
state,
|
||||||
|
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
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
victim_info = 'Victim status (found in {}ms):' \
|
victim_info = 'Victim status (found in {}ms):' \
|
||||||
'\n Name: {}' \
|
'\n Name: {}' \
|
||||||
'\n State: {}' \
|
'\n State: {}' \
|
||||||
@ -1847,9 +1929,13 @@ def find_victim_info(pid, victim_badness, name):
|
|||||||
nssid, pid_to_name(nssid),
|
nssid, pid_to_name(nssid),
|
||||||
realpath,
|
realpath,
|
||||||
cwd,
|
cwd,
|
||||||
c1, cmdline,
|
c1,
|
||||||
|
cmdline,
|
||||||
victim_lifetime)
|
victim_lifetime)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
return victim_info
|
return victim_info
|
||||||
|
|
||||||
|
|
||||||
@ -2370,6 +2456,33 @@ def implement_corrective_action(
|
|||||||
|
|
||||||
return psi_t0
|
return psi_t0
|
||||||
|
|
||||||
|
mid = meminfo()
|
||||||
|
log('Memory info, MiB:')
|
||||||
|
log(' total={}, used={}, free={}, available={}, shared={}, buffers'
|
||||||
|
'={}, cache={},'.format(
|
||||||
|
round(mem_total / 1024),
|
||||||
|
round(mid['used'] / 1024),
|
||||||
|
round(mid['free'] / 1024),
|
||||||
|
round(mid['available'] / 1024),
|
||||||
|
round(mid['shared'] / 1024),
|
||||||
|
round(mid['buffers'] / 1024),
|
||||||
|
round(mid['cache'] / 1024)
|
||||||
|
))
|
||||||
|
log(' swap_total={}, swap_used={}, swap_free={}'.format(
|
||||||
|
round(mid['swap_total'] / 1024),
|
||||||
|
round(mid['swap_used'] / 1024),
|
||||||
|
round(mid['swap_free'] / 1024)
|
||||||
|
))
|
||||||
|
if psi_support:
|
||||||
|
mp = memory_pressure()
|
||||||
|
log('Memory pressure (system-wide):')
|
||||||
|
log(' some avg10={} avg60={} avg300={}'.format(
|
||||||
|
mp[0], mp[1], mp[2]
|
||||||
|
))
|
||||||
|
log(' full avg10={} avg60={} avg300={}'.format(
|
||||||
|
mp[3], mp[4], mp[5]
|
||||||
|
))
|
||||||
|
|
||||||
soft_match = False
|
soft_match = False
|
||||||
if soft_actions and threshold is SIGTERM:
|
if soft_actions and threshold is SIGTERM:
|
||||||
|
|
||||||
@ -2513,7 +2626,7 @@ def implement_corrective_action(
|
|||||||
|
|
||||||
if iva == 0:
|
if iva == 0:
|
||||||
|
|
||||||
log('The victim died in {} sec'.format(round(d, 3)))
|
log('The victim died in {}s'.format(round(d, 3)))
|
||||||
|
|
||||||
if victim_id in v_dict:
|
if victim_id in v_dict:
|
||||||
v_dict.pop(victim_id)
|
v_dict.pop(victim_id)
|
||||||
@ -2860,18 +2973,26 @@ with open('/proc/meminfo') as f:
|
|||||||
mem_list = f.readlines()
|
mem_list = f.readlines()
|
||||||
|
|
||||||
mem_list_names = []
|
mem_list_names = []
|
||||||
|
|
||||||
for s in mem_list:
|
for s in mem_list:
|
||||||
mem_list_names.append(s.split(':')[0])
|
mem_list_names.append(s.split(':')[0])
|
||||||
|
|
||||||
if mem_list_names[2] != 'MemAvailable':
|
try:
|
||||||
errprint('WARNING: Your Linux kernel is too old, Linux 3.14+ requied')
|
mem_available_index = mem_list_names.index('MemAvailable')
|
||||||
exit(1)
|
except ValueError:
|
||||||
|
errprint('ERROR: your Linux kernel is too old, Linux 3.14+ required')
|
||||||
|
|
||||||
|
mem_free_index = mem_list_names.index('MemFree')
|
||||||
swap_total_index = mem_list_names.index('SwapTotal')
|
swap_total_index = mem_list_names.index('SwapTotal')
|
||||||
swap_free_index = swap_total_index + 1
|
swap_free_index = mem_list_names.index('SwapFree')
|
||||||
|
buffers_index = mem_list_names.index('Buffers')
|
||||||
|
cached_index = mem_list_names.index('Cached')
|
||||||
|
sreclaimable_index = mem_list_names.index('SReclaimable')
|
||||||
|
shmem_index = mem_list_names.index('Shmem')
|
||||||
|
|
||||||
mem_total = int(mem_list[0].split(':')[1][:-4])
|
mem_total = int(mem_list[0].split(':')[1][:-4])
|
||||||
|
|
||||||
|
|
||||||
# Get names from /proc/*/status to be able to get VmRSS and VmSwap values
|
# Get names from /proc/*/status to be able to get VmRSS and VmSwap values
|
||||||
|
|
||||||
with open('/proc/self/status') as file:
|
with open('/proc/self/status') as file:
|
||||||
|
Loading…
Reference in New Issue
Block a user