0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

压力测试过程中,采集服务器性能数据

PoisonApple 来源:网络整理 2018-03-07 15:59 次阅读

许多企业在数据记载的各环节工作中,几乎全靠手工完成,费时费力,易出差错。

例如:在仓库作业管理过程中,进货、退货、出货、盘点等日常活动全由手工完成,由于填写琐碎而复杂的表格及数据重复填写,增加了工作量,所以工作容易出错,效率低下。

面对这种情况,许多企业都要求引进一套计算机管理系统,但引进了计算机系统之后,才发现只解决了问题的一半,因为有了计算机软件的支持,只可以解决有条件放置计算机的工作场合,而无条件放置计算机的工作环节中的手工抄写状况仍不能解决。

即使计算机解决了部分手工抄写状况,但不能改变大量的打印表格的数据在下一个计算机作业点重新输入时而引发的瓶颈现象 如果通过用PT923或LK934 采集器设备,再配置一套行之有效的作业流程,及时准确的掌握每单中每个商品的情况。用PT923或LK934对物品进行条码扫描登记。还可以对物品查询修改。

同时,物品信息通过MODEM直接上传计算中心。采用采集器设备后数据记载的各环节实现了数据的自动登录,避免了数据的从新录入问题。

通过python脚本与linux命令结合的方式采集服务器性能数据。根据测试过程中服务器当前的tcp链接数量来决定数据采集是否结束。

脚本主要有三个操作,第一个是性能数据初步采集,通过调用linux的sar和iostat命令,将数据写入原始文件中。采集完成后,执行性能指标提取脚本,从原始指标文件提取有效的数据写入最终的文件中,并进行打包操作。

代码只是本人满足工作所需而作,算不上很好,可以满足工作所需,仅此而已

从原始文件提取数据的配置文件,根据服务器语言类型区分:

abstractConf_ch.xml—中文

abstractConf_en.xml—英文

配置文件主要是指明原始文件路径并按照需求使用linux的cat、egrep、awk命令从文件中提取数据

《?xml version=‘1.0’ encoding=‘utf-8’?》

《abstract》

《res_file name=“res/CPU”》

《uniqflag》CPU《/uniqflag》

《object_file》result/cpu_status《/object_file》

《graphtitle》Cpu_Status《/graphtitle》

《linelabel》%user %system《/linelabel》

《x_y_label》Time(s) Cpu_Percent(%)《/x_y_label》

《cmd》cat %s | egrep -v “Linux|^$|%s” | awk ‘BEGIN {print “%s %s %s”}{if($2 !~/AM|PM/) print $3,$5}’ 》》 %s《/cmd》

《/res_file》

。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。

《/abstract》12345678910111213

获取服务连接数量

# coding:utf-8

#__author__ = ‘Libiao’

import subprocess

class GetLinkingNumber(object):

def __init__(self):

pass

def getLinkingNumber(serlf,servers):

ret = []

if isinstance(servers,str):

num = subprocess.Popen(“netstat -tnap | grep tcp | grep %s | wc -l” %servers,stdout=subprocess.PIPE,shell=True).stdout

ret.append(int(num.readline().strip()))

elif isinstance(servers,dict):

for k,v in servers.items():

num = subprocess.Popen(“netstat -tnap | grep tcp | grep %s | wc -l” %v,stdout=subprocess.PIPE,shell=True).stdout

ret.append(int(num.readline().strip()))

else:

pass

return ret123456789101112131415161718192021

需要由主程序执行的linux命令

#!/bin/bash

sar -n DEV 10 》》res/NetWork &

iostat -x -d -k 10 》》res/Disk &

sar -r 10 》》res/Memory &

sar -q 10 》》res/System_load_average &

sar -u 10 》》res/CPU &

sar -b 10 》》res/TPS &12345678

数据采集代码主方法

#-*- coding:utf-8 -*-

“”“

reated on 2015年10月16日

@author: LiBiao

”“”

import time,os

import subprocess

import multiprocessing

from write_log import writeLog

import del_old_file

from record_test_data import Record_Data

from server_memory_collect import serverMemoryCollect

from get_linking_number import GetLinkingNumber

#需要手动设置的参数

SERVERS_D = {‘1935’:‘srs-rtmp’,‘18080’:‘srs-hls’,‘80’:‘nginx’} #可以输入srs或者nginx或者ATS

#间隔时间

INTERVAL_TIME = 10

class KPI_Collect(object):

def __init__(self):

self.getLinkNum = GetLinkingNumber()

self.TCP_COUNT = self.getLinkNum.getLinkingNumber(SERVERS_D)

self.tcpRecord = Record_Data(“res/linking_number”)

def getStr(self,alist):

ret = “”

for s in alist:

ret += str(s)

ret += ‘ ’

return [ret.rstrip(‘ ’)]

#通过调用collect.sh脚本来执行服务器性能数据采集

def sys_kpi_collect(self):

flag = ‘1’

cmds = [‘。/collect.sh’]

popen = subprocess.Popen(cmds[0],stdout=subprocess.PIPE,shell=True)

pid = popen.pid

writeLog(‘INFO’,‘》》》》》 性能指标采集进程执行中。。。。。’)

self.to_stop_subprocess(flag,popen)

#停止sys_kpi_collect执行的程序的popen句柄

def to_stop_subprocess(self,flag,popen):

curr_tcpnum = self.getLinkNum.getLinkingNumber(SERVERS_D)

self.tcpRecord.recordData([“srs&nginx Linking”,“%s %s %s” %tuple(SERVERS_D.values()),“Time(s) Numbers”])

self.tcpRecord.recordData(self.getStr(self.TCP_COUNT))

if flag is ‘1’:

loops = 0

while True:

if sum(curr_tcpnum) 《= sum(self.TCP_COUNT):

if loops == 15:

#15s内当前连接数小于初始化连接数,退出程序

#删除还存在于系统中的sar和iostat进程

names = [‘sar’,‘iostat’]

cmd = “killall -9 %s %s” %tuple(names)

subprocess.call(cmd,shell=True)

#终止子进程

popen.kill()

if subprocess.Popen.poll(popen) is not None:

break

else:

writeLog(“INFO”,r“》》》》》 等待子进程终止”)

else:

loops += 5

time.sleep(5)

else:

loops = 0

time.sleep(INTERVAL_TIME)#等待INTERVAL_TIME时间

curr_tcpnum = self.getLinkNum.getLinkingNumber(SERVERS_D)

self.tcpRecord.recordData(self.getStr(curr_tcpnum))

writeLog(“INFO”,r“》》》》》 性能指标采集完成”)

else:

while True:

if subprocess.Popen.poll(popen) is not None:

break

else:

writeLog(“INFO”,r“》》》》》 等待子进程终止”)

writeLog(“INFO”,r“》》》》》 性能指标采集完成”)

#判断系统中是否还存留sar和iostat进程

def is_process_exists(self,name):

cmd = “ps ax | grep %s | grep -v grep” %name

p = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)

p.wait()

if p.stdout.readline():

return 1

return 0

def main_start(self):

start_times = 0.0

timeRecord = Record_Data(“res/timeConsum”)

for server,num in zip(SERVERS_D.values(),self.TCP_COUNT):

writeLog(“INFO”,r“》》》》》 初始 %s 服务连接数 %d” %(server,num))

curr_tcpN = self.getLinkNum.getLinkingNumber(SERVERS_D)

time.sleep(10)

while True:

if not sum(curr_tcpN) 《= sum(self.TCP_COUNT):

start_times = time.time()

for server,num in zip(SERVERS_D.values(),curr_tcpN):

writeLog(“INFO”,r“》》》》》 指标采集任务开始,当前 %s 连接数 %d” %(server,num))

#删除旧的kpi文件

del_old_file.Del_Old_File(“res/”).del_old_file()

#单独线程执行其他服务(srs、nginx等)进程内存指标采集任务

for port,server in SERVERS_D.items():

multiprocessing.Process(target=serverMemoryCollect,args=([port,server],INTERVAL_TIME,sum(self.TCP_COUNT),self.getLinkNum)).start()

#采集服务器系统kpi指标

self.sys_kpi_collect()

writeLog(“INFO”,r“》》》》》 性能数据采集结束!”)

time_consum = time.time() - start_times

timeRecord.recordData([“%s” %str(time_consum)])

break

else:

time.sleep(1)

curr_tcpN = self.getLinkNum.getLinkingNumber(SERVERS_D)

if __name__ == ‘__main__’:

kpiCollect = KPI_Collect()

kpiCollect.main_start()

#-*- coding:utf-8 -*-

“”“

reated on 2015年10月16日

@author: LiBiao

”“”

import time

import subprocess

from write_log import writeLog

from record_test_data import Record_Data

#Record the memory of server used

def serverMemoryCollect(servers,intervaltime,tcpNum,getLinkObj):

getLinkNum = getLinkObj

memRecord = Record_Data(“res/%s” %(servers[1]+“:”+servers[0]))

cmd = “ps -ef | grep %s | grep -v grep | awk ‘{print $2}’” %servers[1]

f = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)

writeLog(“INFO”,“》》》》》 %s 指标采集进程执行中。。。。。” %servers[1])

pids = [pid.strip() for pid in f.stdout]

heard = [servers[1],‘used’,‘Linking_Number Memory_Capacity(MB)’]

try:

memRecord.recordData(heard)

curr_tcpN = sum(getLinkNum.getLinkingNumber(servers[0]))

loops = 0

while True:

vrss = []

for p in pids:

cmd2 = “cat /proc/%s/status | grep VmRSS | awk ‘{print $2}’” %p

rss = subprocess.Popen(cmd2,stdout=subprocess.PIPE,shell=True).stdout

vrss.append(int(rss.readline().strip()))

memRecord.recordData([‘%s’ %str((sum(vrss)/1024))])

if curr_tcpN 《= tcpNum:

if loops == 15:

#15s之内,当前连接数小于初始化连接数,程序退出

break

else:

loops += 5

time.sleep(5)

else:

loops = 0

time.sleep(intervaltime)

curr_tcpN = sum(getLinkNum.getLinkingNumber(servers[0]))

writeLog(“INFO”,r“》》》》》 %s 进程内存采集完成” %servers[1])

except IOError as err:

writeLog(“INFO”,“File error: ” + str(err))

return 0

从原始数据文件提取有效数据并写入新的文件

# -*- coding: utf-8 -*-

‘’‘

Created on 2015年9月14日

@author: LiBiao

’‘’

import os,time

import subprocess

import getCmds

import del_old_file

from write_log import writeLog

#需要手动配置的数据

#SERVER_NAME = [‘srs_2.0.0.’,‘nginx’]#‘nginx’ #可以输入nginx或者srs

SERVERS_D = {‘1935’:‘srs-rtmp’,‘18080’:‘srs-hls’,‘80’:‘nginx’}

#系统语言编码

LANG = “en_US.UTF-8”

#获取系统当前使用的语言

def getSysLANG():

popen = subprocess.Popen(‘echo $LANG’,stdout=subprocess.PIPE,shell=True)

return popen.stdout.read().strip()

# 根据系统语言编码获取对应配置文件路径

def getConfPath():

if getSysLANG() == LANG:

return “。/conf/abstractConf_en.xml”

return “。/conf/abstractConf_ch.xml”

class AbstractKPI(object):

def __init__(self,*args):

(self.cmds,) = args

def abstract_kpi(self):

for cmd in self.cmds:

# print cmd

subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)

#获取本机ip地址,用来产生区别于其他机器的数据

def get_local_ip():

try:

ip = os.popen(“ifconfig | grep ‘inet addr’ | awk ‘{print $2}’”).read()

ip = ip[ip.find(‘:’) + 1:ip.find(‘ ’)]

except Exception,e:

print e

return ip

#将最终采集数据打包

def to_tar():

ip = get_local_ip()

times = time.strftime(“%Y-%m-%d-%H-%M-%S”,time.localtime())

subprocess.call(“cp res/linking_number res/timeConsum ” +“res/%s ”*len(SERVERS_D.items()) %tuple([v + “:” + k for k,v in SERVERS_D.items()]) + “result/”,shell=True)

files = [“result/” + filename for filename in os.listdir(“result/”)]

cmd = ‘tar -cf SYS_KPI_’+ ip + “_” + times + ‘.tar’ + ‘ %s’*len(files) %tuple(files)

try:

subprocess.call(cmd,shell=True)

except Exception as err:

writeLog(“ERROR”,r“》》》》》 文件压缩出现错误 %s” %str(err))

exit()

writeLog(“INFO”,r“》》》》》 指标文件打包完成”)

#脚本主入口函数

def main_start():

#删除旧的kpi文件

del_old_file.Del_Old_File(“result/”).del_old_file()

#获取到配置文件路径

confpath = getConfPath()

#调用getCmds获取解析kpi文件的命令

cmds = getCmds.Get_Cmds(confpath).getcmds()

#从原始指标文件提取有用的数据

AbstractKPI(cmds).abstract_kpi()

#将result目录下的解析后的kpi文件打包

to_tar()

writeLog(“INFO”,r“》》》》》 指标数据提取并打包完成”)

if __name__ == ‘__main__’:

main_start()

脚本中采集数据的命令是linux的,其实这并不是最合适的处理方式,之前只是为了满足工作所需。目前正在使用python第三方模块psutil中的一些方法来执行服务器性能数据的采集,这样的话,脚本就会更加符合python开发的模式。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 采集器
    +关注

    关注

    0

    文章

    167

    浏览量

    17750
  • 数据采集器
    +关注

    关注

    1

    文章

    100

    浏览量

    14537
收藏 人收藏

    评论

    相关推荐

    服务器知识

    系统的幕后指挥者服务器是否出了问题,而不是埋怨工作人员的素质和其他客观条件的限制。在网络环境中服务器的稳定是十分重要,稳定的网络环境给用户提供可靠的工作环境,这就要求在硬件的采购过程中必须坚持用该用
    发表于 08-12 13:43

    串口数据采集储存联网服务器应用方案

    的应用。然而在利用网络进行数据传输的过程中,网络通信的硬件故障、网络拥塞、分组延迟或丢失、数据损坏、数据重复和失序等影响使数据传输造成重大的
    发表于 04-06 17:01

    测试过程中芯片表面打火???

    在双极测试过程中经常出现表面打火,将芯片表面的双极击穿了,测试电压在600--800v.请问哪位大侠有解决的方法吗?
    发表于 09-12 21:41

    关于数据采集过程中的弹出窗口的问题

    我想知道,在数据采集过程中怎样设计一个数据的显示窗口,在数据采集的主窗口中,通过单击按钮,可以显示一个对波形进行实时分析的波形图,就像组态软件那样的弹出的
    发表于 09-13 12:29

    SRIO高速大量数据传输测试,在测试过程中若发生错误,请问可以通过那些寄存来读取错误状态?

    现在对SRIO进行长时间连续数据传输测试:时间:40小时、速率:2.5G模式:x4一般来说,多大的误码率是业界正常范围?在测试过程中若发生错误,可以通过那些寄存来读取错误状态?在C6
    发表于 08-06 08:46

    ADS1216芯片调试过程中数据采集一直不对

    有谁用过ADS1216这颗芯片啊,在调试过程中数据采集一直不对,不知道该如何配置它寄存,具体怎么操作的,谁有demo或相关的例子程序啊?
    发表于 02-27 14:42

    linux服务器性能测试步骤

    linux服务器性能测试-服务器实时【磁盘】监控
    发表于 06-02 06:54

    灵动微MCU测试过程中确保频率校准方法分享

    灵动微MCU测试过程中确保频率校准方法
    发表于 12-31 06:55

    用示波器测试过程中探头电阻在故障分析的影响

    用示波器测试过程中探头电阻在故障分析的影响。故障现象是有一个表头在通信的过程中偶尔能通信一下,然后就不能通信了,通信部分的电路如下图所示:箭头1、2为二极管两端,两端的引线接入到单片机比较
    发表于 01-11 07:52

    视频大数据采集怎么选服务器

    传输的过程,大量的文字,图片甚至视频等数据传输会非常消耗带宽的,带宽越大传输数据的速度越快,效率越高。数据采集服务器一定要速度快,稳定性,如
    发表于 07-19 09:38

    服务器稳定性测试方法

    ,如果要进行香港服务器测试就要针对你放置网站的每个细节和功能全面的操作测试,根据每个功能操作下的不同性能测试。2、多线路
    发表于 09-20 09:56

    压力传感器测试过程的可靠性概念概述[图]

    根据压力传感器的实际测试过程中的各个环节已经或可能产生的影响,获取压力传感器真实性能输出数据的因素,采用可靠性的分析方法对其进行分析;提示了
    发表于 01-18 11:21 3510次阅读
    <b class='flag-5'>压力</b>传感器<b class='flag-5'>测试过程</b>的可靠性概念概述[图]

    气密性测试过程中为什么会出现负的泄漏值

    在进行气密性测试的时候测试过程中有时候会出现负的泄漏值,为什么会出现负的泄漏值呢?在了解这个问题之前,我们首先需要知道的是检测过程中测试原理,是在产品腔体内充入一定
    的头像 发表于 04-08 11:38 4197次阅读
    气密性<b class='flag-5'>测试过程中</b>为什么会出现负的泄漏值

    渗透测试过程中所使用的抓包方法

    本篇只是简单分享平常笔者渗透测试过程中所使用的抓包方法,后面会继续更新其他以及安卓端的抓包方法,比较适合没理解过这方面的新手作参考。
    的头像 发表于 02-01 15:41 1026次阅读

    如何解决车载部品测试过程中峰值电流不足的问题?

    如何解决车载部品测试过程中峰值电流不足的问题? 随着汽车电子系统的不断发展和普及,车载部品的测试过程变得更加复杂和严峻。其中一个常见的问题是峰值电流不足。峰值电流不足可能导致测试结果不准确、设备损坏
    的头像 发表于 11-23 10:33 222次阅读