真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

python腳本調用iftop統(tǒng)計業(yè)務應用流量

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

成都做網站、網站設計、外貿營銷網站建設的關注點不是能為您做些什么網站,而是怎么做網站,有沒有做好網站,給成都創(chuàng)新互聯(lián)公司一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。

  1. 利用iftop命令 iftop -t -P -N -n -s 2 來獲取流量信息
  2. 對獲取的流量信息進行處理,單位換算,同一個應用程序的所有鏈接流量進行合計(因為一個應用會有很多鏈接,每一個鏈接都有流量,全部相加即可得出這個應用的總流量)
#!/usr/bin/python
#coding=utf-8
#針對業(yè)務監(jiān)聽的端口流量進行統(tǒng)計,忽略對隨機端口流量統(tǒng)計
#若針對突然流量增大,找到其進程進行告警,可以不做統(tǒng)計,獲取到流量進行判斷,若大于多少閥值,則輸出
import os
def 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 flow

def get_flow():
    #iftop參數:-t 使用不帶ncurses的文本界面,-P顯示主機以及端口信息,-N只顯示連接端口號,不顯示端口對應的服務名稱,-n 將輸出的主機信息都通過IP顯示,不進行DNS解析,-s num  num秒后打印一次文本輸出然后退出
    mes = os.popen("iftop -t -P -N -n -s 2 2>/dev/null |grep -A 1 -E '^   [0-9]'").read()
    #以換行符進行分割
    iftop_list = mes.split("\n")
    count = len(iftop_list)
    #定義字典 存放主機信息和進出流量
    flow_dict = {}
    #定義列表,存放主機信息
    host_ips = []

# 把主機加入數組,新的主機查詢是否在列表里面,沒有的話,把主機信息加入host_ips,并新組裝一個字典值加入flow_dict字典,如果host_ips存在主機信息,則把字典值取出來,重新計算增加流量數值,再加入字典flow_dict
    #這里的 count/2 是iftop獲取到的數據,是進出流量為一組,則有count/2 個流量連接,可執(zhí)行os.popen 里面的iftop命令即可明白
    for i in range(count/2):
        flow_msg = ""
        #獲取發(fā)送的ip地址(本地ip地址),端口(本地端口),發(fā)送的流量,以換行符分割后,數據偶數位為本地發(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的隨機端口,因為公司業(yè)務應用無大于10000,也可把這里去掉
        port = host_ip.split(":")[1]
        if int(port) < 10000:
        #主機信息若不存在列表則加入host_ips,若存在,則字典取值,對進出流量進行相加
            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
                #把新得出的結果,更新到字典
                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()

文章標題:python腳本調用iftop統(tǒng)計業(yè)務應用流量
文章網址:http://weahome.cn/article/pjpgog.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部