python通过snmp协议运用多线程获取多台主机网卡信息,写入数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#-*- coding:utf-8 -*-
import netsnmp
class SnmpClass(object):
    """
    SNMP
    """
    def __init__(self, oid="sysDescr", version=2, destHost="localhost", community="aaa"):
        self.oid = oid
        self.version = version
        self.destHost = destHost
        self.community = community
 
    @property
    def query(self):
        """
        snmpwalk
        """
        try:
 
            result = netsnmp.snmpwalk(self.oid,
                                      Version=self.version,
                                      DestHost=self.destHost,
                                      Community=self.community)
        except Exception, err:
            print err
            result = None
        return result
 
 
def getflow():
    x = SnmpClass(oid="ifInOctets", destHost="218.205.104.1")
    y = SnmpClass(oid="ifDescr", destHost="218.205.104.1")
    datakey = y.query
    datavaule = x.query
    data = {}
    for z in range(len(datakey)):
        data[datakey[z]] = datavaule[z]
    print data
 
getflow()

 community:为团体字

运用多线程获取多台主机网卡信息,写入数据库。

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#coding:utf-8
import threading
import time
import netsnmp
import Queue
import logging
import logging.config
import MySQLdb
import datetime
from flask_sqlalchemy import SQLAlchemy
 
start_time = time.time()
#tm = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
#start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
#start_time = datetime.datetime.now()
hosts = ["218.205.104.3", "218.205.104.8"]
myq = Queue.Queue()
rq = Queue.Queue()
conn = MySQLdb.connect(host='218.205.104.27', user='admin',passwd='7758258', port=12306, db='yxjs')
cursor = conn.cursor()
logging.config.fileConfig("/root/tmp/logger.ini")
logger = logging.getLogger("status_domain")
#
#把host和oid组成任务
 
def list_sum(x):
    for i in range(len(x)):
        try:x[i] = int(x[i])
        except:x[i] = 0
    return sum(x)
 
def insert_DB_flow_mul( dt,**other):
    while True:
        try:
            MysqlDB = MysqldbClass("localhost", "admin", "7758258", "WCMSS", "utf8" )
            MysqlDB.getCurs()
            MysqlDB.insert(insert_sql_cache_domain, [(dt, domain, sum, hit, miss, size,resptime, s_code_000, s_code_20x, s_code_30x, s_code_40x, s_code_50x, othercode, svrname)])
            print 'insert success'
            logger.debug(((dt, domain, sum, hit, miss, size,resptime, s_code_000, s_code_20x, s_code_30x, s_code_40x, s_code_50x, othercode, svrname), "insert_sql OK."))
            MysqlDB.freeCurs()
            MysqlDB.commit()
            MysqlDB.close()
            break
        except:
            time.sleep(10)
            logger.debug(('retry: ', (datetime, svrname), sys.exc_info()))
 
 
for host in hosts:
    myq.put(host)
 
def poll_one_host():
    while True:
        try:
            #死循环从队列中获取任务,直到队列任务为空
            host = myq.get(block=False)
            session = netsnmp.Session(Version=2, DestHost=host, Community="dnion",Timeout=3000000,Retries=0)
            oid0 = netsnmp.Varbind('.1.3.6.1.2.1.1.5.0')         #0 get 主机名
            oid1 = netsnmp.Varbind('.1.3.6.1.2.1.2.2.1.2')       #1 walk 网卡信息
            oid2 = netsnmp.Varbind('.1.3.6.1.2.1.2.2.1.10')      #2 walk 网卡接收的字节数
            oid3 = netsnmp.Varbind('.1.3.6.1.2.1.2.2.1.16')      #3 walk 网卡流出字节数
            oid4 = netsnmp.Varbind('.1.3.6.1.4.1.2021.11.11.0'#4 空闲cpu百分比
            oid5 = netsnmp.Varbind('.1.3.6.1.4.1.2021.10.1.3.1') #5 5分钟系统负载
            oid6 = netsnmp.Varbind('.1.3.6.1.4.1.2021.10.1.3.2') #6 10分钟系统负载
            oid7 = netsnmp.Varbind('.1.3.6.1.4.1.2021.10.1.3.3') #7 15分钟系统负载
            oid8 = netsnmp.Varbind('.1.3.6.1.4.1.2021.4.5.0')    #8 机器内存总数
            oid9 = netsnmp.Varbind('.1.3.6.1.4.1.2021.4.6.0')    #9 机器已用内存
            oid10 = netsnmp.Varbind('.1.3.6.1.4.1.2021.9.1.6')   #10 walk 系统盘总容量
            oid11 = netsnmp.Varbind('.1.3.6.1.4.1.2021.9.1.8')   #11 walk 系统盘已用容量
            var_list = netsnmp.VarList(oid0,oid4,oid5,oid6,oid7,oid8,oid9)
            var_list1 = netsnmp.VarList()
            var_list1.append(oid1)
            var_list2 = netsnmp.VarList()
            var_list2.append(oid2)
            var_list3 = netsnmp.VarList()
            var_list3.append(oid3)
            var_list10 = netsnmp.VarList()
            var_list10.append(oid10)
            var_list11 = netsnmp.VarList()
            var_list11.append(oid11)
            ret = session.get(var_list)
            ret1 = session.walk(var_list1)        # 网卡信息
            ret2 = list(session.walk(var_list2))  # 网卡流入流量
            ret3 = list(session.walk(var_list3))  # 网卡流出流量
            ret10 = list(session.walk(var_list10))# 系统盘总容量
            ret11 = list(session.walk(var_list11))# 系统盘已用容量
            print ret1
            print ret2
 
            tm = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
            hostname = str(ret[0])
            cpu_ret = str(float(ret[1])/100)+'%'   #CPU使用率
            ll_1 = float(ret[2])
            ll_5 = float(ret[3])
            ll_15 = float(ret[4])
            ipaddr = str(host) 
            ram_ret = str(round((float(ret[6])/float(ret[5]))*100,2))+'%'                  #内存使用率
            disk_ret = str(round(float(list_sum(ret11))/float(list_sum(ret10))*100,2))+'%' #磁盘使用率
             
            value = (ll_1, ll_5, ll_15, ipaddr, tm)
            #print value
             me = Mondata(ll_1, ll_5, ll_15, ipaddr, tm)
            # db.session.add(me)
            # db.session.commit()
            #cursor.execute("insert into mondata (ll_1, ll_5, ll_15, ipaddr, datetime)values (%s, %s, %s, %s, %s)", (ll_1, ll_5, ll_15, ipaddr, tm))
            #cursor.close()
            #conn.commit()
            #conn.close()
 
 
 
 
            rq.put((host, ret, start_time))
 
 
        except Queue.Empty:
 
            break
 
thread_arr = []
#开启多线程
num_thread = 200
for i in range(num_thread):
    t = threading.Thread(target=poll_one_host, kwargs={})
    t.setDaemon(True)
    t.start()
    thread_arr.append(t)
#等待任务执行完毕
for i in range(num_thread):
    thread_arr[i].join()
 
while True:
    try:
        info = rq.get(block=False)
        #print info
    except Queue.Empty:
        #print time.time() - start_time
 
        break

 

posted @   西门运维  阅读(1737)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示