python獲取tcp連線數,新增連線數,繪圖(用於效能測試過程中監控)
阿新 • • 發佈:2018-12-29
本指令碼可以用於有效能測試監控需求的人使用,用於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)