upd misc
This commit is contained in:
223
misc/oom-trigger
223
misc/oom-trigger
@@ -1,125 +1,180 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Interactive OOM trigger
|
||||
"""
|
||||
|
||||
import os
|
||||
from argparse import ArgumentParser
|
||||
# интерактивный oom-trigger
|
||||
|
||||
|
||||
##########################################################################
|
||||
from memco import *
|
||||
|
||||
# печать показателей на этапах работы
|
||||
def print_mem():
|
||||
|
||||
mem_tup = mem_check_main()
|
||||
|
||||
mem_available = mem_tup[0]
|
||||
swap_total = mem_tup[1]
|
||||
swap_free = mem_tup[2]
|
||||
|
||||
print(
|
||||
'MemAvailable: ', round(mem_available / 1024 / 1024, 3), 'GiB,', round(mem_available / 1024), 'MiB,', round(mem_available / mem_total * 100, 1), '%'
|
||||
)
|
||||
|
||||
if swap_total != 0:
|
||||
print(
|
||||
'SwapFree: ', round(swap_free / 1024 / 1024, 3), 'GiB,', round(swap_free / 1024), 'MiB,', round(swap_free / swap_total * 100, 1), '%'
|
||||
)
|
||||
print(
|
||||
'Total Free: ', round((mem_available + swap_free) / 1024 / 1024, 3), 'GiB,', round((mem_available + swap_free) / 1024), 'MiB,', round((mem_available + swap_free) / (mem_total + swap_total) * 100, 1), '%'
|
||||
)
|
||||
else:
|
||||
print(
|
||||
'Swap disabled'
|
||||
)
|
||||
|
||||
|
||||
# find mem_total
|
||||
# find positions of SwapFree and SwapTotal in /proc/meminfo
|
||||
|
||||
with open('/proc/meminfo') as file:
|
||||
mem_list = file.readlines()
|
||||
|
||||
mem_list_names = []
|
||||
for s in mem_list:
|
||||
mem_list_names.append(s.split(':')[0])
|
||||
|
||||
if mem_list_names[2] != 'MemAvailable':
|
||||
print('Your Linux kernel is too old, Linux 3.14+ requied\nExit')
|
||||
exit()
|
||||
|
||||
swap_total_index = mem_list_names.index('SwapTotal')
|
||||
swap_free_index = swap_total_index + 1
|
||||
|
||||
mem_total = int(mem_list[0].split(':')[1].strip(' kB\n'))
|
||||
|
||||
# Get names from /proc/*/status to be able to get VmRSS and VmSwap values
|
||||
|
||||
with open('/proc/self/status') as file:
|
||||
status_list = file.readlines()
|
||||
|
||||
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')
|
||||
|
||||
|
||||
# вариант - сжирать мегабайты исходя из собственного VmRSS + VmSwap
|
||||
|
||||
|
||||
print(mem_total, swap_total_index, swap_free_index, vm_rss_index, vm_swap_index)
|
||||
|
||||
|
||||
##########################################################################
|
||||
|
||||
|
||||
def continue_anyway():
|
||||
"""
|
||||
Mem hog if mem err
|
||||
"""
|
||||
expanding_list = []
|
||||
while True:
|
||||
try:
|
||||
expanding_list.append(os.urandom(1))
|
||||
except MemoryError:
|
||||
continue
|
||||
|
||||
|
||||
def unlimited_memhog():
|
||||
'''
|
||||
unlimited mem hogging
|
||||
'''
|
||||
print('Вводите целые неотрицательные числа. Чем больше, тем быстрее потребление памяти.\n1000 same обеспечивает потребление на уровне полтора гиг в секунду,\nurandom работает на скорости максимум 170 M/s')
|
||||
# бесконечный жор
|
||||
def inf():
|
||||
|
||||
print(
|
||||
'Вводите целые неотрицательные числа. Чем больше, тем быстрее потребление памяти.\n1000 same обеспечивает потребление на уровне полтора гиг в секунду,\nurandom работает на скорости максимум 170 M/s'
|
||||
)
|
||||
same = input("same: ")
|
||||
urandom = input("urandom: ")
|
||||
|
||||
expanding_list = []
|
||||
|
||||
print('Unlimited memhogging started!')
|
||||
print(
|
||||
'Процесс неограниченного потребления пошёл... Press Ctrl + C for exit'
|
||||
)
|
||||
|
||||
while True:
|
||||
try:
|
||||
expanding_list.append(os.urandom(int(urandom)))
|
||||
expanding_list.append('#' * int(same))
|
||||
except MemoryError:
|
||||
print('MemoryError; continue anyway!')
|
||||
continue_anyway()
|
||||
print('MemoryError, start побайтовая добивалка!')
|
||||
terminal()
|
||||
|
||||
|
||||
|
||||
|
||||
# жор числп гиг
|
||||
def lim():
|
||||
|
||||
expanding_list = []
|
||||
|
||||
n = input('На сколько гигабайт уменьшить доступную память?\n: ')
|
||||
|
||||
print('Погнали тратить ' + n + ' гиг...')
|
||||
|
||||
i = 0
|
||||
|
||||
while True:
|
||||
|
||||
i += 1
|
||||
|
||||
try:
|
||||
expanding_list.append(os.urandom(int(100)))
|
||||
expanding_list.append('#' * int(300))
|
||||
except MemoryError:
|
||||
print('MemoryError!')
|
||||
break
|
||||
if i > 2020202 * int(n):
|
||||
print('DONE')
|
||||
break
|
||||
|
||||
return expanding_list
|
||||
|
||||
|
||||
|
||||
|
||||
# жор до остатка мегабайт
|
||||
def lim2avail():
|
||||
|
||||
expanding_list = []
|
||||
|
||||
n = input(
|
||||
'Сколько мегабайт общей доступной памяти (MemAvailable + SwapFree) оставить?\nВведите целое положительное число: '
|
||||
)
|
||||
|
||||
# проверка на целое положительное
|
||||
if n.isdigit() == True:
|
||||
n = int(n)
|
||||
else:
|
||||
print(
|
||||
'Вы ввели не целое положительное число'
|
||||
)
|
||||
return 0
|
||||
|
||||
if n == 0:
|
||||
print(
|
||||
'Вы ввели не целое положительное число'
|
||||
)
|
||||
return 0
|
||||
|
||||
print(
|
||||
'Погнали уменьшать доступную память до уровня ниже ' + str(n) + ' MiB...'
|
||||
)
|
||||
|
||||
while True:
|
||||
try:
|
||||
expanding_list.append(os.urandom(5000))
|
||||
expanding_list.append('#' * 5000)
|
||||
except MemoryError:
|
||||
print('MemoryError!')
|
||||
break
|
||||
if total_mem_available() <= n:
|
||||
print('DONE')
|
||||
break
|
||||
|
||||
return expanding_list
|
||||
|
||||
|
||||
|
||||
##########################################################################
|
||||
|
||||
|
||||
# basic bifurcation
|
||||
|
||||
print('WARNING: эта прога способна потратить память и повесить систему, будьте осторожны.')
|
||||
print('При ее работе следите за показателями памяти.')
|
||||
|
||||
|
||||
expanding_list = []
|
||||
|
||||
|
||||
'''
|
||||
hogging не то
|
||||
u - unlimited mem hogging with choice of speed and entropy
|
||||
n - limited mem hogging (hog указанный далее объем метров)
|
||||
a - уменьшать обем общей доступной памяти (MemAvailable + SwapFree) до тех пор, пока он не станет ниже заданного далее объема
|
||||
|
||||
'''
|
||||
|
||||
ex_list = []
|
||||
|
||||
try:
|
||||
while True:
|
||||
|
||||
print('Select an option from the list below, enter selected letter and press Enter')
|
||||
print()
|
||||
print_mem()
|
||||
print()
|
||||
print('Выберите вариант из списка ниже')
|
||||
print('8 или i или I - запустить бесконечное потребление, предложив выбрать скорость потребления и энтропию')
|
||||
print('7 или l или L - запустить ограниченное потребление заданного числа гигов')
|
||||
print('6 или a или A - жрать память пока количество доступной памяти не опустится ниже заданного')
|
||||
print('0 или с или С - очистить накопления при их наличии')
|
||||
print('q или любой другой символ - выход (можно просто нажать Enter)')
|
||||
|
||||
li = input(': ')
|
||||
|
||||
if li is 'i' or li is 'I' or li is '8':
|
||||
unlimited_memhog()
|
||||
if li is 'l' or li is 'L' or li is '7':
|
||||
x = lim()
|
||||
ex_list.append(x)
|
||||
elif li is 'i' or li is 'I' or li is '8':
|
||||
inf()
|
||||
elif li is 'c' or li is 'C' or li is '0':
|
||||
ex_list = []
|
||||
x = 0
|
||||
y = 0
|
||||
elif li is '6' or li is 'a' or li is 'A':
|
||||
y = lim2avail()
|
||||
ex_list.append(y)
|
||||
else:
|
||||
exit()
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print()
|
||||
os.kill(os.getpid(), 15)
|
||||
print_mem()
|
||||
selfterm()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user