1. 程式人生 > >python獲取tcp連線數,新增連線數,繪圖(用於效能測試過程中監控)

python獲取tcp連線數,新增連線數,繪圖(用於效能測試過程中監控)

本指令碼可以用於有效能測試監控需求的人使用,用於tcp連線數的監控
# -*- coding: UTF-8 -*-
# author=baird_xiang
import os
import sys
import time
import re
import copy

new_content = [] #去掉\n的浮點型連線數
nums = [] #連線數
connect_times = []  #連線數的時間
d_nums = [] #新增連線數
add_connect_times = [] #新增連線數的時間
new_connects = [] #加入了時間的連線數 格式'2018-05-02 16:50:18   ||  2.0'


#獲取tcp連線數
def get_connects(ras_ip,end_time):
    
    while True:
        search_command = 'netstat -nat|grep "%s" |wc -l'%ras_ip
        num_connects = os.popen(search_command).read()
        print num_connects
        nums.append(num_connects)
        time.sleep(1)
        #avg_num = sum(nums)/len(nums)
        now_time = get_time()
        txt_time = get_time()
        connect_times.append(txt_time)
        
        if now_time == end_time:
            sys.exit()
        else:
            pass
        
 #資料輸入文字儲存並匯出       
def in_out_txt():
    
    now_pwd = os.getcwd()
    file_name_time = get_time()
    file_name = now_pwd + '/tcp_connect_numbers_%s.txt'%file_name_time#tcp連線數的文字
    file_name_avage = now_pwd + '/avage_tcp_connects_%s.txt'%file_name_time  #平均連線數的文字
    #寫入文字
    file1 = open(file_name,'w')
    for i in nums:
        i_num= re.findall('\d+', i)
        file1.write(i_num[0] + '\n')
    file1.close()
    #讀出文字
    file2 = open(file_name,'r')
    content = file2.readlines()
    for i in range(len(content)):
        content[i] = content[i][:len(content[i])-1]
    file2.close()
    #獲得每秒新增連線數 
    get_add_file = open(file_name,'r')
    add_conn_content = get_add_file.readlines()
    for i in range(0,len(add_conn_content)):
        j = i+1
        if j < len(add_conn_content):
            d_value = int(add_conn_content[j]) - int(add_conn_content[i])
            d_nums.append(d_value)
    
    #將nums中'       2\n'轉化為浮點數'2' 儲存在new_content 中
    for i in content:
        ii = float(i)
        new_content.append(ii)
    #計算平均連線數 
    avg_number = round(sum(new_content)/len(new_content),4)

    #加入時間
    print len(nums)
    print len(connect_times)
    for i in range(0,len(nums)):
        new_connects_data = str(connect_times[i]) +  '   ||  '  + str(new_content[i]) 
        new_connects.append(new_connects_data)
        
    file3 = open(file_name,'w')
    for i in range(0,len(new_connects)):
        file3.write(new_connects[i] + '\n')
    file3.close()
    
    #平均連線數寫入avage_tcp_connects.txt文字
   
    file_avage = open(file_name_avage,'w')
    
    file_avage.write(str(avg_number) + '\n')
    file_avage.close()
    return avg_number
    
#獲取當前時間不split
def get_time():
    this_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    return this_time        
#split時間    
def split_time(input_time):
    
    
    
    times = re.split("[a-z\-]|[a-z\:]|\s", input_time)
    
    out_time = times
    return out_time

if __name__ == '__main__':
    ras_ip = 'com.apple.net.utun_control' #獲取連線數的程序或者埠
    end_time = '2018-05-18 18:20:00'  #指令碼停止時間
    try :
        get_connects(ras_ip, end_time)
        
    except :
        avg_number = in_out_txt()
        print avg_numbe

以上指令碼實習了對mac,liux指定程序或埠的連線數監控,並按時間對應儲存到txt每一行,並且計算出平均值,txt格式按end_time為字尾儲存

以下指令碼可以執行在有gui的系統之上,對上面指令碼產生的txt進行粗略繪圖,以end_time來進行讀取名字獲取txt

# -*- coding: UTF-8 -*-
# author=baird_xiang
import os
import sys
import time
import re
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
import copy
d_nums = [] #新增連線數
nums = [] #連線數 
connect_times = []  #連線數的時間
add_connect_times = [] #新增連線數的時間
tick_spacing = 3 #繪圖橫座標顯示間隔
 #資料輸入文字儲存並匯出       
def in_out_txt(file_name):
    
    
    
    #tcp連線數的文字
    #平均連線數的文字
   #讀出文字
    file2 = open(file_name,'r')
    content = file2.readlines()
    for i in range(len(content)):
        content[i] = content[i][:len(content[i])-1]
    file2.close()
    #讀出文字,將時間和連線數分開到nums和connect——times兩個列表
    for i in content:
        ll = re.split('\|\|',i)
        connect_times.append(ll[0])
        nums.append(float(ll[1]))
    
    #獲得每秒新增連線數 

    for i in range(0,len(nums)):
        j = i+1
        if j < len(nums):
            d_value = float(nums[j]) - float(nums[i])
            d_nums.append(d_value)
    print 'd_nums   ',d_nums
   
#獲取當前時間不split
def get_time():
    this_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    return this_time        
#split時間    
def split_time(input_time):
    
    
    
    times = re.split("[a-z\-]|[a-z\:]|\s", input_time)
    
    out_time = times
    return out_time

#連線數繪圖
def print_img1(end_time,cut_time,cut_tcpConn):
    now_pwd = os.getcwd()
    img_path = now_pwd + '/img_%s_tcpconn.png'%end_time#儲存繪製好的圖形到當前路徑
    #連線數繪圖
    plt.figure()
    ax1 = plt.subplot(1,1,1)
    ax1.plot(cut_time,cut_tcpConn)
    ax1.set_title('TCP Connects')
    ax1.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
    plt.gcf().autofmt_xdate()
    plt.savefig(img_path)#儲存圖片
    plt.show()
    
#新增連線數繪圖    
def print_img2(end_time,cut_add_time,cut_tcpAddConn):    
    now_pwd = os.getcwd()
    img_path = now_pwd + '/img_%s_addconn.png'%end_time#儲存繪製好的圖形到當前路徑
    plt.figure()
    ax2 = plt.subplot(1,1,1)
    
    ax2.plot(cut_add_time,cut_tcpAddConn)
    ax2.set_title('Add TCP Connects per s')
    
    ax2.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
    plt.gcf().autofmt_xdate()
    
    plt.savefig(img_path)#儲存圖片
    plt.show()
    
def cut_Conn_time(end_time):
    cut_tcpConn = [] #縮略的連線數
    cut_tcpAddConn = []  #縮略的新增連線數
    cut_time = [] #縮略的連線數時間
    cut_add_time = [] #縮略的新增連線數時間
    split_end_time = split_time(end_time) #split結束時間
    split_start_time = connect_times[0]  #獲取開始時間
    split_start_time = split_time(split_start_time) #split 開始時間    
    for i in range(1,len(connect_times)):
        add_connect_times.append(connect_times[i])
    print 'add_connect_times',add_connect_times
    #大於一天,10分鐘取樣一次
    if float(split_end_time[2]) - float(split_start_time[2]) >=  1: #執行時間大於一天
        for i in range(0,len(nums),600):
            try:#處理越界
                avage_tcpConn = (nums[i] + nums[i+600])/2
                cut_tcpConn.append(avage_tcpConn)
            except:
                break
        for i in range(0,len(d_nums),600):
            try:#處理越界
                avage_addConn = (d_nums[i] + d_nums[i+600])/2
                cut_tcpAddConn.append(avage_addConn)
            except:
                break
        for i in range(0,len(add_connect_times),600): #處理新增連線數時間
            avage_add_ConnTime = add_connect_times[i]
            cut_add_time.append(avage_add_ConnTime)
        
        for i in range(0,len(connect_times),600):#處理連線數時間
            avage_ConnTime = connect_times[i]
            cut_time.append(avage_ConnTime)
        
        list_pop1=cut_add_time.pop(-1)
        list_pop2=cut_time.pop(-1)
        return cut_tcpConn,cut_tcpAddConn,cut_time,cut_add_time
    #大於一小時,3分鐘取樣一次
    elif float(split_end_time[3]) - float(split_start_time[3]) >=1 :
        for i in range(0,len(nums),180):
            try:#處理越界
                avage_tcpConn = (nums[i] + nums[i+180])/2
                cut_tcpConn.append(avage_tcpConn)
            except:
                break
        for i in range(0,len(d_nums),180):
            try:#處理越界
                avage_addConn = (d_nums[i] + d_nums[i+180])/2
                cut_tcpAddConn.append(avage_addConn)
            except:
                break
        for i in range(0,len(add_connect_times),180): #處理新增連線數時間
            avage_add_ConnTime = add_connect_times[i]
            cut_add_time.append(avage_add_ConnTime)
        for i in range(0,len(connect_times),180):#處理連線數時間
            avage_ConnTime = connect_times[i]
            cut_time.append(avage_ConnTime)
        list_pop=cut_add_time.pop(-1)
        list_pop2=cut_time.pop(-1)
        return cut_tcpConn,cut_tcpAddConn,cut_time,cut_add_time
    #3分鐘以上,一小時以下
    elif float(split_end_time[4]) - float(split_start_time[4]) >= 3 :
        for i in range(0,len(nums),60):
            try:#處理越界
                avage_tcpConn = (nums[i] + nums[i+60])/2
                cut_tcpConn.append(avage_tcpConn)
            except:
                break
        for i in range(0,len(d_nums),60):
            try:#處理越界
                avage_addConn = (d_nums[i] + d_nums[i+60])/2
                cut_tcpAddConn.append(avage_addConn)
            except:
                break
        for i in range(0,len(add_connect_times),60): #處理新增連線數時間
            avage_add_ConnTime = add_connect_times[i]
            cut_add_time.append(avage_add_ConnTime)
        for i in range(0,len(connect_times),60):#處理連線數時間
            avage_ConnTime = connect_times[i]
            cut_time.append(avage_ConnTime)
        list_pop=cut_add_time.pop(-1)
        list_pop2=cut_time.pop(-1)
        return cut_tcpConn,cut_tcpAddConn,cut_time,cut_add_time
    #3分鐘內
    else:
        cut_tcpAddConn = copy.deepcopy(d_nums)
        cut_tcpConn = copy.deepcopy(nums)
        cut_time = copy.deepcopy(connect_times)
        cut_add_time = copy.deepcopy(add_connect_times)
        
        return  cut_tcpConn,cut_tcpAddConn,cut_time,cut_add_time
    
if __name__ == '__main__':
    end_time = '2018-05-10 15:27:00'
    py_path = os.getcwd()
    file_name = '%s/tcp_connect_numbers_%s.txt'%(py_path,end_time)
   
    in_out_txt(file_name)
    print 'nums   ',nums
    cut_tcpConn,cut_tcpAddConn,cut_time,cut_add_time = cut_Conn_time(end_time)
    print 'cut_tcpConn ',cut_tcpConn
    print  'cut_tcpAddConn  ' ,cut_tcpAddConn
    print 'cut_time   ',cut_time
    print  'cut_add_time  ',cut_add_time
    print_img1(end_time,cut_time,cut_tcpConn)
    print_img2(end_time,cut_add_time,cut_tcpAddConn)