Files
openGauss-OM/script/local/LocalPerformanceCheck.py
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

追加合入
2022-03-05 18:51:52 +08:00

280 lines
8.8 KiB
Python

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#############################################################################
# Copyright (c) 2020 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 : LocalPerformanceCheck.py is a utility to
# check if GaussDB performance.
#############################################################################
import subprocess
import getopt
import os
import sys
import time
sys.path.append(sys.path[0] + "/../")
from gspylib.common.GaussLog import GaussLog
from gspylib.common.ParameterParsecheck import Parameter
from gspylib.common.Common import DefaultValue
from gspylib.common.ErrorCode import ErrorCode
from multiprocessing.dummy import Pool as ThreadPool
from domain_utils.cluster_file.cluster_log import ClusterLog
from base_utils.os.file_util import FileUtil
from domain_utils.domain_common.cluster_constants import ClusterConstants
from domain_utils.cluster_os.cluster_user import ClusterUser
ACTION_SSDPerfCheck = "SSDPerfCheck"
INDENTATION_VALUE = 37
class CmdOptions():
def __init__(self):
"""
function: initialize variable
input : NA
output: NA
"""
pass
action = ""
logFile = ""
user = ""
g_opts = CmdOptions()
g_logger = None
g_perfChecker = None
class LocalPerformanceCheck():
def __init__(self):
"""
function: initialize variable
input : NA
output: NA
"""
self.user = ""
self.logFile = ""
self.action = ""
def CheckSSDPerf(self):
"""
function: check SSD performance
input : NA
output: NA
"""
diskDevList = []
# Obtain the SSD device
devList = DefaultValue.obtainSSDDevice()
# traverse dev
for dev in devList:
cmd = "df -P -h | grep %s | awk '{print $6}'" % dev
(status, output) = subprocess.getstatusoutput(cmd)
if (status == 0):
if (output == ""):
continue
diskDirInfo = output.split('\n')
for diskDir in diskDirInfo:
diskDevList.append("%s:%s" % (dev, diskDir))
# check if SSD disk exists on current node
if diskDevList == []:
raise Exception(ErrorCode.GAUSS_530["GAUSS_53005"])
# Concurrent execution
pool = ThreadPool(DefaultValue.getCpuSet())
pool.map(self.CheckSingleSSDPerf, diskDevList)
pool.close()
pool.join()
def CheckSingleSSDPerf(self, diskDev):
"""
function: check Single SSD performance
input : diskDev
output: NA
"""
try:
devlist = diskDev.split(':')
dev = devlist[0]
diskDir = devlist[1]
# get current time
currentTime = time.strftime("%Y-%m-%d_%H%M%S")
# get tmp File
tmpFile = os.path.join(diskDir, "%s-%s-%d" % ("tmpfile_SSDperf",
currentTime,
os.getpid()))
cmd = "dd if=/dev/zero of=%s bs=8M count=2560 oflag=direct &&" \
% tmpFile
cmd += "dd if=%s of=/dev/null bs=8M count=2560 iflag=direct" \
% tmpFile
(status, output) = subprocess.getstatusoutput(cmd)
if (status == 0):
output = output.split("\n")
writeInfolist = output[2].strip().split(",")
readInfolist = output[5].strip().split(",")
result = " %s (%s) Path (%s)\n" \
" %s: %s\n" \
" %s: %s\n %s: %s\n" \
" %s: %s\n %s: %s" \
% (dev.split('/')[2], dev, diskDir,
"Data size".ljust(INDENTATION_VALUE),
writeInfolist[0][:-7],
"Write time".ljust(INDENTATION_VALUE),
(writeInfolist[1]).strip(),
"Write speed".ljust(INDENTATION_VALUE),
(writeInfolist[2]).strip(),
"Read time".ljust(INDENTATION_VALUE),
(readInfolist[1]).strip(),
"Read speed".ljust(INDENTATION_VALUE),
(readInfolist[2]).strip())
g_logger.log(result)
else:
raise Exception(ErrorCode.GAUSS_514["GAUSS_51400"] % cmd
+ " Error:\n%s" % output)
os.remove(tmpFile)
g_logger.debug("Successfully checked SSD performance.")
except Exception as e:
os.remove(tmpFile)
g_logger.log("%s failed." % g_opts.action)
g_logger.debug(str(e))
def usage():
"""
localPerfCheck.py is a utility to check if GaussDB performance.
Internal use only.
Usage:
python3 --help | -?
python3 LocalPerformanceCheck.py -t action [-l logfile] [-U username]
Common options:
-t The type of action.
-U The user and group name.
-l The path of log file.
-? --help Show this help screen.
"""
print(usage.__doc__)
def initGlobal():
"""
function: Init global variables
input : NA
output: NA
"""
global g_logger
global g_perfChecker
try:
g_logger = GaussLog(g_opts.logFile, g_opts.action)
# Modify log File Permissions
FileUtil.modifyFileOwner(g_opts.user, g_logger.logFile)
g_perfChecker = LocalPerformanceCheck()
except Exception as e:
g_logger.logExit(str(e))
def parseCommandLine():
"""
function: Parse command line and save to global variable
input : NA
output: NA
"""
try:
(opts, args) = getopt.getopt(sys.argv[1:], "t:U:l:", ["help"])
except Exception as e:
# print help information
usage()
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50000"]
% str(e))
if (len(args) > 0):
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50000"]
% str(args[0]))
# parse parameter
for (key, value) in opts:
if (key == "--help"):
usage()
sys.exit(0)
elif (key == "-t"):
g_opts.action = value
elif (key == "-l"):
g_opts.logFile = value
elif (key == "-U"):
g_opts.user = value
Parameter.checkParaVaild(key, value)
def checkParameter():
"""
function: Check parameter from command line
input : NA
output: NA
"""
# check if user exist and is the right user
ClusterUser.checkUser(g_opts.user)
# check log file
if (g_opts.logFile == ""):
g_opts.logFile = ClusterLog.getOMLogPath(
ClusterConstants.LOCAL_LOG_FILE, g_opts.user, "")
# check if absolute path
if (not os.path.isabs(g_opts.logFile)):
GaussLog.exitWithError(ErrorCode.GAUSS_502["GAUSS_50213"] % "log")
# check if installed SSD
if not DefaultValue.checkSSDInstalled():
GaussLog.exitWithError(ErrorCode.GAUSS_530["GAUSS_53008"])
def docheck():
"""
function: check SSD performance
input : NA
output: NA
"""
if (g_opts.action == ACTION_SSDPerfCheck):
# check SSD performance
g_perfChecker.CheckSSDPerf()
else:
g_logger.logExit(ErrorCode.GAUSS_500["GAUSS_50000"] % g_opts.action)
if __name__ == '__main__':
"""
main function
"""
try:
# arse command line and save to global variable
parseCommandLine()
# Check parameter from command line
checkParameter()
# Init global variables
initGlobal()
except Exception as e:
# Modify the file's owner
FileUtil.modifyFileOwner(g_opts.user, g_opts.logFile)
GaussLog.exitWithError(str(e))
try:
# check SSD performance
docheck()
# close log file
g_logger.closeLog()
except Exception as e:
# Modify the file's owner
FileUtil.modifyFileOwner(g_opts.user, g_logger.logFile)
g_logger.logExit(str(e))
sys.exit(0)