131 lines
4.2 KiB
Python
131 lines
4.2 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding:utf-8 -*-
|
|
#############################################################################
|
|
# Copyright (c) 2023 Huawei Technologies Co.,Ltd.
|
|
#
|
|
# openGauss is licensed under Mulan PSL v2.
|
|
# You can use this software according to the terms
|
|
# and conditions of the Mulan PSL v2.
|
|
# You may obtain a copy of Mulan PSL v2 at:
|
|
#
|
|
# http://license.coscl.org.cn/MulanPSL2
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OF ANY KIND,
|
|
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
# See the Mulan PSL v2 for more details.
|
|
# ----------------------------------------------------------------------------
|
|
# Description : perf_probe.py setup a information set for configure
|
|
#############################################################################
|
|
|
|
import os
|
|
import re
|
|
import psutil
|
|
from impl.perf_config.basic.project import Project
|
|
from impl.perf_config.basic.probe import Probe
|
|
from base_utils.os.disk_util import DiskUtil
|
|
from base_utils.os.cmd_util import CmdUtil
|
|
|
|
|
|
class DiskDeviceInfo(Probe):
|
|
def __init__(self, partition):
|
|
super(DiskDeviceInfo, self).__init__()
|
|
self._partition = partition
|
|
self.device = self._partition.device
|
|
self.mountpoint = self._partition.mountpoint
|
|
self.fstype = self._partition.fstype
|
|
self.total_size = lambda : DiskUtil.getTotalSize(self.device)
|
|
self.avail_size = lambda : DiskUtil.getAvailSize(self.device)
|
|
self.vendor = None
|
|
self.r_speed = None
|
|
self.w_speed = None
|
|
self.opts = {}
|
|
|
|
def detect(self):
|
|
for opt in self._partition.opts.split(','):
|
|
kv = opt.split('=')
|
|
if len(kv) == 1:
|
|
self.opts[kv[0]] = True
|
|
else:
|
|
assert len(kv) == 2
|
|
self.opts[kv[0]] = kv[1]
|
|
|
|
self._detect_io_speed()
|
|
|
|
def simple_info(self):
|
|
return 'device={0}, mountpoint={1}, fstype={2} size=(free {3}GB / total {4}GB)'.format(
|
|
self.device, self.mountpoint, self.fstype, self.avail_size() / 1024, self.total_size() / 1024
|
|
)
|
|
|
|
def _detect_io_speed(self):
|
|
self.r_speed = None
|
|
self.w_speed = None
|
|
|
|
if not CmdUtil.doesBinExist('fio'):
|
|
Project.log('There is no fio.')
|
|
return
|
|
|
|
fio_file = os.path.join(self.mountpoint, '/gs_perfconfig_fio_test.fiofile')
|
|
cmd = f'fio -filename={fio_file} -re=write -size=500M -direct=1 -ioengine=sync | grep WRITE'
|
|
try:
|
|
Project.log('detect io speed by fio: ' + cmd)
|
|
output = CmdUtil.execCmd(cmd)
|
|
|
|
CmdUtil.execCmd(f'rm {fio_file} -fr')
|
|
Project.log('remove fio file: ' + fio_file)
|
|
|
|
nums = re.findall(r'\d+', output)
|
|
if len(nums) < 1:
|
|
return
|
|
self.w_speed = int(nums[0])
|
|
|
|
except Exception:
|
|
Project.log('remove fio file: ' + fio_file)
|
|
CmdUtil.execCmd(f'rm {fio_file} -fr')
|
|
pass
|
|
|
|
class DiskInfo(Probe):
|
|
def __init__(self):
|
|
super(DiskInfo, self).__init__()
|
|
self._devices = []
|
|
self._index = 0
|
|
|
|
def get(self, item):
|
|
if isinstance(item, int):
|
|
if item > len(self._devices):
|
|
return
|
|
return self._devices[item]
|
|
elif isinstance(item, str):
|
|
for device in self._devices:
|
|
if device.device == item or device.mountpoint == item:
|
|
return device
|
|
return
|
|
else:
|
|
return
|
|
|
|
def __iter__(self):
|
|
self._index = 0
|
|
return self
|
|
|
|
def __next__(self):
|
|
if self._index >= len(self._devices):
|
|
raise StopIteration
|
|
value = self._devices[self._index]
|
|
self._index += 1
|
|
return value
|
|
|
|
def __len__(self):
|
|
return len(self._devices)
|
|
|
|
def detect(self):
|
|
self._devices = []
|
|
partitions = DiskUtil.getMountInfo()
|
|
|
|
for partition in partitions:
|
|
if partition.maxfile is None:
|
|
continue
|
|
device = DiskDeviceInfo(partition)
|
|
device.detect()
|
|
self._devices.append(device)
|