通过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\n%s\n%s"}{if($2 !~/AM|PM/) print $3,$5}' >> %s</cmd>
</res_file>
...............
...............
</abstract>
获取服务连接数量
# 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 ret
需要由主程序执行的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 &
数据采集代码主方法
#-*- coding:utf-8 -*-
"""
reated on 2015年10月16日
@author: LiBiao
"""
import time,os
import subprocess
import multiprocessing
from write_log import writeL