add thanatolog
This commit is contained in:
parent
6d9025cf43
commit
3428ac08b4
28
nohang
28
nohang
@ -205,6 +205,10 @@ def test():
|
||||
print("uptime()")
|
||||
print(uptime())
|
||||
|
||||
print(hr)
|
||||
print("os.uname()")
|
||||
print(os.uname())
|
||||
|
||||
print(hr)
|
||||
print("pid_to_starttime('self')")
|
||||
print(pid_to_starttime('self'))
|
||||
@ -238,17 +242,7 @@ def test():
|
||||
print("psi_mem_some_avg10()")
|
||||
print(psi_mem_some_avg10())
|
||||
|
||||
print(hr)
|
||||
print("check_mem()")
|
||||
print(check_mem())
|
||||
|
||||
print(hr)
|
||||
print("os.uname()")
|
||||
print(os.uname())
|
||||
|
||||
print(hr)
|
||||
print("check_mem()")
|
||||
print(check_mem())
|
||||
|
||||
'''
|
||||
|
||||
@ -618,7 +612,7 @@ def mlockall():
|
||||
MCL_CURRENT | MCL_FUTURE
|
||||
)
|
||||
if result != 0:
|
||||
log('Cannot lock all memory')
|
||||
log('WARNING: cannot lock all memory')
|
||||
else:
|
||||
log('All memory locked with MCL_CURRENT | MCL_FUTURE')
|
||||
else:
|
||||
@ -2638,15 +2632,21 @@ warn_timer = 0
|
||||
|
||||
##########################################################################
|
||||
|
||||
|
||||
|
||||
|
||||
if not root:
|
||||
log('WARNING: effective UID != 0; euid={}; processes with other e'
|
||||
'uids will be invisible for nohang'.format(self_uid))
|
||||
|
||||
|
||||
|
||||
# Try to lock all memory
|
||||
|
||||
mlockall()
|
||||
|
||||
##########################################################################
|
||||
|
||||
if not root:
|
||||
log('WARNING: effective UID != 0; euid={}; processes with other e'
|
||||
'uids will be invisible for nohang'.format(self_uid))
|
||||
|
||||
|
||||
print_self_rss()
|
||||
|
@ -4,6 +4,21 @@
|
||||
|
||||
from memco import *
|
||||
|
||||
from signal import signal, SIGTERM
|
||||
from time import sleep
|
||||
|
||||
|
||||
|
||||
def signal_handler(signum, frame):
|
||||
print('Got signal {}'.format(signum))
|
||||
#sleep(1)
|
||||
exit()
|
||||
|
||||
|
||||
signal(SIGTERM, signal_handler)
|
||||
|
||||
|
||||
|
||||
# печать показателей на этапах работы
|
||||
def print_mem():
|
||||
|
||||
|
17
trash/t01
Executable file
17
trash/t01
Executable file
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from signal import signal, SIGTERM
|
||||
|
||||
def signal_handler(signum, frame):
|
||||
print('Got signal {}'.format(signum))
|
||||
|
||||
signal(SIGTERM, signal_handler)
|
||||
|
||||
rate = 99999
|
||||
|
||||
x = []
|
||||
|
||||
while True:
|
||||
x.append('#' * rate)
|
||||
|
||||
# http://okturing.com/src/6140/body
|
149
trash/thanatolog
Executable file
149
trash/thanatolog
Executable file
@ -0,0 +1,149 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
from time import sleep, time
|
||||
from signal import (signal,
|
||||
SIGKILL, SIGTERM, SIGINT, SIGQUIT, SIGCONT, SIGUSR1, SIGUSR2,
|
||||
SIGHUP, SIGABRT, SIGSEGV, SIGBUS)
|
||||
from sys import argv, exit
|
||||
|
||||
|
||||
def mlockall():
|
||||
"""Lock all memory to prevent swapping the process."""
|
||||
|
||||
from ctypes import CDLL
|
||||
|
||||
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
|
||||
)
|
||||
if result != 0:
|
||||
result = libc.mlockall(
|
||||
MCL_CURRENT | MCL_FUTURE
|
||||
)
|
||||
if result != 0:
|
||||
print('WARNING: cannot lock all memory')
|
||||
else:
|
||||
log('All memory locked with MCL_CURRENT | MCL_FUTURE')
|
||||
else:
|
||||
print('All memory locked with MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT')
|
||||
|
||||
|
||||
|
||||
def check_mem():
|
||||
"""find mem_available"""
|
||||
with open('/proc/meminfo') as f:
|
||||
for n, line in enumerate(f):
|
||||
if n is 2:
|
||||
mem_available = int(line.split(':')[1][:-4])
|
||||
return mem_available
|
||||
|
||||
|
||||
|
||||
|
||||
def pid_to_name(pid):
|
||||
"""
|
||||
"""
|
||||
try:
|
||||
with open('/proc/' + pid + '/comm', 'rb') as f:
|
||||
return f.read().decode('utf-8', 'ignore')[:-1]
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
except ProcessLookupError:
|
||||
return ''
|
||||
|
||||
|
||||
def pid_to_state(pid):
|
||||
|
||||
x = rline1('/proc/' + pid + '/stat')
|
||||
|
||||
if ')' in x:
|
||||
return x.rpartition(')')[2][1]
|
||||
else:
|
||||
return ' '
|
||||
|
||||
|
||||
def pid_to_rss(pid):
|
||||
try:
|
||||
rss = rline1('/proc/{}/statm'.format(pid)).split(' ')[1]
|
||||
except IndexError:
|
||||
rss = '-0'
|
||||
return rss
|
||||
|
||||
|
||||
def pid_to_realpath(pid):
|
||||
try:
|
||||
return os.path.realpath('/proc/' + pid + '/exe')
|
||||
except FileNotFoundError:
|
||||
return ''
|
||||
|
||||
|
||||
def rline1(path):
|
||||
"""read 1st line from path."""
|
||||
try:
|
||||
with open(path) as f:
|
||||
for line in f:
|
||||
return line[:-1]
|
||||
except UnicodeDecodeError:
|
||||
with open(path, 'rb') as f:
|
||||
return f.read(999).decode(
|
||||
'utf-8', 'ignore').split('\n')[0] # use partition()!
|
||||
except FileNotFoundError:
|
||||
return 'FileNotFoundError'
|
||||
except ProcessLookupError:
|
||||
return 'ProcessLookupError'
|
||||
|
||||
|
||||
###############################################################################
|
||||
|
||||
|
||||
mlockall()
|
||||
|
||||
|
||||
pid = argv[1]
|
||||
name = pid_to_name(pid)
|
||||
rss0 = float(pid_to_rss(pid))
|
||||
ma = check_mem()
|
||||
|
||||
|
||||
print('PID:', pid)
|
||||
print('Name:', name)
|
||||
print('RSS at startup: {} (100.0 %)'.format(int(rss0)))
|
||||
print('MemAvail:', ma)
|
||||
|
||||
send_signal = SIGKILL
|
||||
|
||||
|
||||
|
||||
os.kill(int(pid), SIGCONT)
|
||||
|
||||
|
||||
|
||||
|
||||
os.kill(int(pid), send_signal)
|
||||
t0 = time()
|
||||
|
||||
|
||||
while True:
|
||||
rpe = os.path.exists('/proc/{}/exe'.format(pid))
|
||||
rss = pid_to_rss(pid)
|
||||
pe = os.path.exists('/proc/{}'.format(pid))
|
||||
t1 = time()
|
||||
d = t1 - t0
|
||||
state = pid_to_state(pid)
|
||||
ma = check_mem()
|
||||
|
||||
if pe is False:
|
||||
exit()
|
||||
|
||||
print('RP: {} | RSS: {} ({} %) | State: {} | time: {} | MemAvail: {}'.format(
|
||||
rpe, rss, round(float(rss) / (rss0 + 0.0001) * 100, 1), state, round(d, 4), ma
|
||||
)
|
||||
)
|
||||
|
||||
# sleep(0.0001)
|
Loading…
Reference in New Issue
Block a user