【性能测试】获取性能系统指标之示例Python代码

2023-05-16

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import datetime
import time
import psutil
from ctypes import *


"""
性能测试示例Python代码:
    1、获取系统性能指标(内存、cpu、GDI、IO)
    2、保存数据至日志文件 (./******.log)
    3、可同时监控多个程序(xiadan:hexin)
"""


class PerfMonitor(object):

    def __init__(self, pnames, monitor_time):
        self.pnames = pnames
        self.monitor_time = monitor_time
        self.perflog = "./"
        self.perfimg = "./"

    def getGDIcount(self,PID):
        PH = windll.kernel32.OpenProcess(5432, 0, PID)
        GDIcount = windll.user32.GetGuiResources(PH, 0)
        windll.kernel32.CloseHandle(PH)
        return GDIcount

    def time_wait(self,proc_name):
        # 增加隐形等待时间
        pid_list = []
        now_data = time.time()
        while time.time() < now_data + 35:
            pid_data = list(filter(lambda x: x.name() == proc_name, psutil.process_iter()))
            if pid_data != []:
                pid_list.append(list(pid_data)[0].pid)
                break
            else:
                time.sleep(0.1)
        return pid_list

    def get_pid(self,pnames):
        # 获取进程号列表
        pnames = map(lambda x : (x + ".exe"), pnames.split(":"))
        pid_lists = []
        for proc_name in pnames:
            pid = self.time_wait(proc_name)
            pid_lists.extend(pid)
        return pid_lists

    def write_logs(self,log_filepath,usagestr):
        # 数据写入log日志
        fp=open(log_filepath,"a")
        fp.write(usagestr)
        fp.close()

    def get_nowtime(self):
        # 获取现在时间
        now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        return now_time

    def get_log_filepaths(self, p, monitor, types, check_times):
        name = p.name()
        names = name.split(".")[0]
        current = check_times
        usagestr = current + "\t" + str(monitor) + "\n"
        log_filepath = self.perflog + types + "-" + names + "-" + str(p.pid) + ".log"
        self.write_logs(log_filepath,usagestr)

    def perfrun(self):
        try:
            monitorsecond = self.monitor_time * 60
            begintime = int(time.time())
            p_list = []
            for pid in self.get_pid(self.pnames):
                p_list.append((pid,psutil.Process(int(pid))))
            while((int(time.time()) - begintime) <= monitorsecond):
                for (pid, p) in p_list:
                    # 内存
                    mem_time = self.get_nowtime()
                    memusage = p.memory_info().rss/1024.0/1024.0

                    # CPU
                    cpu_time = self.get_nowtime()
                    cpuusage = p.cpu_percent()

                    # GDI
                    gdi_time = self.get_nowtime()
                    GDIcount = self.getGDIcount(pid)

                    # IO
                    iousage = p.io_counters()
                    read_count_time = self.get_nowtime()
                    read_count = iousage.read_count
                    write_count_time = self.get_nowtime()
                    write_count = iousage.write_count
                    read_bytes_time = self.get_nowtime()
                    read_bytes = iousage.read_bytes
                    write_bytes_time = self.get_nowtime()
                    write_bytes = iousage.write_bytes

                    # 写入日志
                    self.get_log_filepaths(p, memusage, "mem", mem_time)
                    self.get_log_filepaths(p, cpuusage, "cpu", cpu_time)
                    self.get_log_filepaths(p, GDIcount, "gdi", gdi_time)
                    self.get_log_filepaths(p, read_count, "io-read-count", read_count_time)
                    self.get_log_filepaths(p, write_count, "io-write-count", write_count_time )
                    self.get_log_filepaths(p, read_bytes, "io-read-bytes", read_bytes_time)
                    self.get_log_filepaths(p, write_bytes, "io-write-bytes", write_bytes_time)

                time.sleep(2)

            now = datetime.datetime.now().strftime("%y-%m-%d-%H-%M-%S")
        except Exception as e:
            print(e)

if __name__ == '__main__':
    if(len(sys.argv) == 3):
        pnames=sys.argv[1]
        monitor_time=int(sys.argv[2])
    else:
        print("""|====================================================================================|""")
        print("""|                              Usage Instructions                                    |""")
        print("""|====================================================================================|""")
        print("""|  usage              : python perfmonitor.py pnames monitor_time (minute)           |""")
        print("""|  example            : python perfmonitor.py xiadan:hexin 10                        |""")
        print("""|====================================================================================|""")
        pnames = "xiadan"
        monitor_time = 5
    perfm = PerfMonitor(pnames, monitor_time)
    perfm.perfrun()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【性能测试】获取性能系统指标之示例Python代码 的相关文章

随机推荐

  • pandas学习之df.rename()

    pandas学习之df rename df rename 用于更改行列的标签 xff0c 即行列的索引 可以传入一个字典或者一个函数 在数据预处理中 xff0c 比较常用 官方文档 xff1a DataFrame rename self m
  • java8操作两个集合List

    public static void main String args List lt String gt list1 61 new ArrayList lt String gt list1 add 34 1 34 list1 add 34
  • Atcoder AGC005 题解

    A STring 用类似括号匹配的方法搞一下即可 span class token macro property span class token directive keyword include span span class toke
  • CentOS-7安装桌面环境

    CentOS 7安装桌面环境 CentOS 7安装桌面环境 CentOS 7安装Server with GUI 设置为开机从桌面环境启动 yum y group install 39 Server with GUI 39 systemctl
  • [软件注册]Sublime 3 激活/注册码(key)

    偶然发现了一种sublime激活方式 使用的sublime3 1 1版本 亲试有效 Step1 配置 host文件 推荐使用 switchhost软件 可以快速变更host span class hljs number 127 0 span
  • 测试git能否连接github

    welcome to my blog 使用以下命令进行测试 ssh T git 64 github com 出现报错 ssh dispatch run fatal Connection to 13 250 177 223 port 22 S
  • vtk中实现3D模型(读取文件)

    xff08 xff09 VTK 坐标系统及空间变换 窗口 视图分割 mb5fed73533dfa9的技术博客 51CTO博客 VTK学习 xff08 三 xff09 VTK读取序列图像 灰信网 xff08 软件开发博客聚合 xff09 读取
  • centos中安装Python2.7

    转载于 xff1a 秋水逸冰 CentOS 6 8安装Python2 7 13 查看当前系统中的 Python 版本 python version 返回 Python 2 6 6 为正常 检查 CentOS 版本 cat etc redha
  • 安装tar.gz文件(无configure文件)

    如何安装tar gz文件 xff08 以webstorm为例 xff09 1 获取root权限并输入密码 xff1a su root 2 进入有该文件的目录下 xff08 以我的为例 xff0c 具体看你的文件在哪里 xff09 cd 下载
  • 游戏服务端框架之业务线程模型

    请求消息绑定线程策略的选择 在上一篇文章中 我们看到 消息是直接在网络框架的io线程中处理的 这样做有一个非常严重的缺陷 如果业务处理比较耗时 那么io线程接受消息的速度就会下降 严重影响io的吞吐量 典型的 我们应该另起线程池 专门用于异
  • 在WSL中使用GPU:WSL2 + Ubuntu 18.04 + CUDA + Gnome图形界面环境配置

    目录 引言1 确认Windows 10版本2 在Windows上安装WSL23 在Windows上安装CUDA on WSL驱动4 在WSL2中安装CUDA Toolkit3 测试CUDA是否能在WSL2中运作4 安装Gnome图形界面其他
  • Centos 开启路由转发实现全网互通

    只需在RouterSrv网关服务器上开启路由转发功能即可 root 64 RouterSrv vi etc sysctl conf net ipv4 ip forward 61 1 添加此行即可 root 64 localhost sysc
  • 虚拟机中配置外网环境

    文章目录 在虚拟机中配置外网环境 在虚拟机中配置外网环境 主机为 win10 xff0c 虚拟机中为 ubuntu 系统 xff0c 采用clash 1 xff0c 设置 Allow Lan xff0c 允许局域网访问 2 xff0c 虚拟
  • mysql 操作数据库(备份与恢复)

    一 直接把创建数据库的语句放到sql 文件中 xff1a php 写法 xff1a lt php mysql port 61 get mysql port cmd 61 US MYSQL BIN 34 mysql exe port 61 3
  • Go调用Python by go-python3

    确保python版本为3 7 conda create go python span class token assign left variable python span span class token operator 61 spa
  • linux下搭建maven私服

    maven私服我相信很多公司都有 xff0c 私服的好处有以下几点 xff1a 1 节省下载资源开销 jar包 xff08 不一定是jar xff0c 也可以是其他资源 xff09 都存在私服 xff0c 可以不必每次下载都去远程仓库去下载
  • git 安装包 最新 下载 快速 国内 镜像 地址

    下载git时 xff0c 先进官网看 https git scm com download win 然后发现几kb的网速 xff0c 这是要让我下一年么 xff0c 找了找网上有没有其他的镜像 xff0c 发现阿里有一个镜像 xff0c 下
  • docker笔记(四、docker部署beego打包后的二进制文件)

    在beego工程里 xff0c 使用go build可以将该工程打包成一个二进制文件 xff0c 那么这个二进制文件在docker里面该怎么部署呢 xff1f 先写一个简单的图片上传的demo xff0c 名字叫docker test 在工
  • LINUX服务器最简洁的HTTPS免费证书配置方法

    注意 xff1a 该方法已在多台服务器配置了免费的https证书 xff0c 无论是更新还是第一次配置都运行成功 xff1b 由于是免费版 xff0c 每个证书都只有三个月的有效期 xff0c 也无法保证安全和稳定性 xff0c 所以只建议
  • 【性能测试】获取性能系统指标之示例Python代码

    usr bin env python coding utf 8 import sys import datetime import time import psutil from ctypes import 34 34 34 性能测试示例P