国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Python > 正文

python腳本調(diào)用iftop 統(tǒng)計(jì)業(yè)務(wù)應(yīng)用流量的思路詳解

2024-09-09 19:02:15
字體:
供稿:網(wǎng)友

因公司服務(wù)器上部署應(yīng)用較多,在有大并發(fā)訪問、業(yè)務(wù)邏輯有問題的情況下反復(fù)互相調(diào)用或者有異常流量訪問的時(shí)候,需要對(duì)業(yè)務(wù)應(yīng)用進(jìn)行故障定位,所以利用python調(diào)用iftop命令來獲取應(yīng)用進(jìn)程流量,結(jié)合zabbix,可幫助定位分析問題。,以下是腳本內(nèi)容,大概思路是:

利用iftop命令 iftop -t -P -N -n -s 2 來獲取流量信息 對(duì)獲取的流量信息進(jìn)行處理,單位換算,同一個(gè)應(yīng)用程序的所有鏈接流量進(jìn)行合計(jì)(因?yàn)橐粋€(gè)應(yīng)用會(huì)有很多鏈接,每一個(gè)鏈接都有流量,全部相加即可得出這個(gè)應(yīng)用的總流量)
#!/usr/bin/python#coding=utf-8#針對(duì)業(yè)務(wù)監(jiān)聽的端口流量進(jìn)行統(tǒng)計(jì),忽略對(duì)隨機(jī)端口流量統(tǒng)計(jì)#若針對(duì)突然流量增大,找到其進(jìn)程進(jìn)行告警,可以不做統(tǒng)計(jì),獲取到流量進(jìn)行判斷,若大于多少閥值,則輸出import osdef change_unit(unit): if "Mb" in unit:  flow = float(unit.strip("Mb")) * 1024  return flow elif "Kb" in unit:  flow = float(unit.strip("Kb"))  return flow elif "b" in unit:  flow = float(unit.strip("b")) / 1024  return flowdef get_flow(): #iftop參數(shù):-t 使用不帶ncurses的文本界面,-P顯示主機(jī)以及端口信息,-N只顯示連接端口號(hào),不顯示端口對(duì)應(yīng)的服務(wù)名稱,-n 將輸出的主機(jī)信息都通過IP顯示,不進(jìn)行DNS解析,-s num num秒后打印一次文本輸出然后退出 mes = os.popen("iftop -t -P -N -n -s 2 2>/dev/null |grep -A 1 -E '^ [0-9]'").read() #以換行符進(jìn)行分割 iftop_list = mes.split("/n") count = len(iftop_list) #定義字典 存放主機(jī)信息和進(jìn)出流量 flow_dict = {} #定義列表,存放主機(jī)信息 host_ips = []# 把主機(jī)加入數(shù)組,新的主機(jī)查詢是否在列表里面,沒有的話,把主機(jī)信息加入host_ips,并新組裝一個(gè)字典值加入flow_dict字典,如果host_ips存在主機(jī)信息,則把字典值取出來,重新計(jì)算增加流量數(shù)值,再加入字典flow_dict #這里的 count/2 是iftop獲取到的數(shù)據(jù),是進(jìn)出流量為一組,則有count/2 個(gè)流量連接,可執(zhí)行os.popen 里面的iftop命令即可明白 for i in range(count/2):  flow_msg = ""  #獲取發(fā)送的ip地址(本地ip地址),端口(本地端口),發(fā)送的流量,以換行符分割后,數(shù)據(jù)偶數(shù)位為本地發(fā)送流量信息  location_li_s = iftop_list[i*2]  send_flow_lists = location_li_s.split(" ")  #去空元素  while '' in send_flow_lists:   send_flow_lists.remove('')  host_ip = send_flow_lists[1]  send_flow = send_flow_lists[3]  send_flow_float = change_unit(send_flow)  #print send_flow_lists  #獲取接收的流量  location_li_r = iftop_list[i*2+1]  rec_flow_lists = location_li_r.split(" ")  while '' in rec_flow_lists:   rec_flow_lists.remove('')  rec_flow = rec_flow_lists[3]  rec_flow_float = change_unit(rec_flow)   #去掉本地linux 大于10000的隨機(jī)端口,因?yàn)楣緲I(yè)務(wù)應(yīng)用無大于10000,也可把這里去掉  port = host_ip.split(":")[1]  if int(port) < 10000:  #主機(jī)信息若不存在列表則加入host_ips,若存在,則字典取值,對(duì)進(jìn)出流量進(jìn)行相加   if host_ip not in host_ips:     host_ips.append(host_ip)     flow_msg = str(float('%2.f' % send_flow_float)) + ":" + str(float('%.2f' % rec_flow_float))     flow_dict[host_ip]=flow_msg   else:    flow_dict_msg = flow_dict[host_ip]    flow_dict_msg_li = flow_dict_msg.split(":")    #獲取字典里的發(fā)送接收流量    flow_dict_msg_send = float(flow_dict_msg_li[0])    flow_dict_msg_rec = float(flow_dict_msg_li[1])    #字典里面的發(fā)送接收流量和獲取到的新流量相加    flow_add_send = flow_dict_msg_send + send_flow_float    flow_add_rec = flow_dict_msg_rec + rec_flow_float    #把新得出的結(jié)果,更新到字典    flow_msg = str(float('%.2f' % flow_add_send)) + ":" + str(float('%.2f' % flow_add_rec))    flow_dict[host_ip]=flow_msg for key in flow_dict:  flow_li = flow_dict[key].split(":")  #flow_li[0]為發(fā)送流量,flow_li[1]為接收流量,單位是Kb  print key + "|" + flow_li[0] + "|" + flow_li[1]get_flow()
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蕲春县| 娱乐| 冕宁县| 黄陵县| 伊川县| 三都| 江北区| 青河县| 红安县| 丽水市| 陆河县| 古蔺县| 株洲县| 颍上县| 吴川市| 彭阳县| 兰坪| 正宁县| 扶风县| 资兴市| 二连浩特市| 天镇县| 柳林县| 如东县| 安义县| 黎川县| 黎平县| 健康| 淮南市| 张家口市| 乃东县| 谷城县| 牟定县| 崇左市| 万源市| 乐昌市| 洛浦县| 沙湾县| 延安市| 邹平县| 新沂市|