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 |
如对您有帮助,支持下呗!
微信

支付宝

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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技术实操系列(六):基于图像分类模型对图像进行分类