Files
2024-01-06 14:36:40 +08:00

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)