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

许多企业在数据记载的各环节工作中,几乎全靠手工完成,费时费力,易出差错。
例如:在仓库作业管理过程中,进货、退货、出货、盘点等日常活动全由手工完成,由于填写琐碎而复杂的表格及数据重复填写,增加了工作量,所以工作容易出错,效率低下。
面对这种情况,许多企业都要求引进一套计算机管理系统,但引进了计算机系统之后,才发现只解决了问题的一半,因为有了计算机软件的支持,只可以解决有条件放置计算机的工作场合,而无条件放置计算机的工作环节中的手工抄写状况仍不能解决。
即使计算机解决了部分手工抄写状况,但不能改变大量的打印表格的数据在下一个计算机作业点重新输入时而引发的瓶颈现象 如果通过用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开发的模式。

迪信通战略合作爱回收 共建新零售行业标杆
流量仪表选型时,需要注意哪些事项
氢燃料电池和动力锂电池,两者是互相替代还是共存
继电器怎么选择(原则_注意事项)
LED户外照明企业需加快品牌化进程
压力测试过程中,采集服务器性能数据
医疗物联网即将实现实时定位技术
基于人工智能的异常检测提高了工业机械的性能
安科瑞防逆流监测电表在光伏项中的应用
选择这两颗芯片才有“硬核”240W电源适配器方案
高性能的FM内置天线解决方案
5G演进趋势与技术研讨会成功举办
引线封装的SMT组装和PCB设计指南
特斯拉数据管道和深度学习系统专利公布
随着智能音箱的发展,智能音箱市场的竞争开始越来越市场化了
学校项目场景中的预付费电表的应用
中兴通讯助力河北电信成功完成了河北首例5G远程腰椎手术
为什么要研究人工智能
采用RFID射频识别技术的高速不停车收费系统
小步快走!炬芯科技人工智能早教芯片备受关注