mirror of
https://github.com/valitydev/yandex-tank.git
synced 2024-11-07 02:45:21 +00:00
f05abad29d
New versions of "free" command don't output the "-/+ buffers/cache" line. Also yandextank already depends on an exellent psutil library, why shouldn't it be used to get available memory volume?
75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
''' Module to check system resources at load generator'''
|
|
|
|
import time
|
|
import logging
|
|
|
|
import psutil
|
|
|
|
from yandextank.core import AbstractPlugin
|
|
import yandextank.core as tankcore
|
|
|
|
|
|
class ResourceCheckPlugin(AbstractPlugin):
|
|
'''Plugin to check system resources'''
|
|
SECTION = "rcheck"
|
|
|
|
@staticmethod
|
|
def get_key():
|
|
return __file__
|
|
|
|
def __init__(self, core):
|
|
''' Constructor '''
|
|
AbstractPlugin.__init__(self, core)
|
|
self.interval = "10s"
|
|
self.disk_limit = 2048 # 2 GB
|
|
self.mem_limit = 512 # 0.5 GB
|
|
self.last_check = 0
|
|
|
|
def get_available_options(self):
|
|
return ["interval", "disk_limit", "mem_limit"]
|
|
|
|
def configure(self):
|
|
self.interval = tankcore.expand_to_seconds(self.get_option("interval", self.interval))
|
|
self.disk_limit = int(self.get_option("disk_limit", self.disk_limit))
|
|
self.mem_limit = int(self.get_option("mem_limit", self.mem_limit))
|
|
|
|
def prepare_test(self):
|
|
self.log.info("Checking tank resources...")
|
|
self.__check_disk()
|
|
self.__check_mem()
|
|
|
|
def is_test_finished(self):
|
|
self.log.debug("Checking tank resources...")
|
|
if time.time() - self.last_check < self.interval:
|
|
return -1
|
|
self.__check_disk()
|
|
self.__check_mem()
|
|
self.last_check = time.time()
|
|
return -1
|
|
|
|
|
|
def __check_disk(self):
|
|
''' raise exception on disk space exceeded '''
|
|
cmd = "sh -c \"df --no-sync -m -P -l -x fuse -x tmpfs -x devtmpfs -x davfs -x nfs "
|
|
cmd += self.core.artifacts_base_dir
|
|
cmd += " | tail -n 1 | awk '{print \$4}' \""
|
|
res = tankcore.execute(cmd, True, 0.1, True)
|
|
logging.debug("Result: %s", res)
|
|
if not len(res[1]):
|
|
self.log.debug("No disk usage info: %s", res[2])
|
|
return
|
|
disk_free = res[1]
|
|
self.log.debug("Disk free space: %s/%s", disk_free.strip(), self.disk_limit)
|
|
if int(disk_free.strip()) < self.disk_limit:
|
|
raise RuntimeError("Not enough local resources: disk space less than %sMB in %s: %sMB" % (
|
|
self.disk_limit, self.core.artifacts_base_dir, int(disk_free.strip())))
|
|
|
|
|
|
def __check_mem(self):
|
|
''' raise exception on RAM exceeded '''
|
|
mem_free = psutil.virtual_memory().available / 2 ** 20
|
|
self.log.debug("Memory free: %s/%s", mem_free, self.mem_limit)
|
|
if mem_free < self.mem_limit:
|
|
raise RuntimeError("Not enough resources: free memory less "
|
|
"than %sMB: %sMB" % (self.mem_limit, mem_free))
|