狂自私

导航

Linux-IO监控

import pymysql
import os
import re
import time
import datetime
'''
建表语句:
CREATE TABLE `r_linux_io_monitor` (
  `up_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '监测时间',
  `ip` varchar(16) DEFAULT NULL COMMENT 'IP地址',
    `CPU使用率` FLOAT not NULL COMMENT 'CPU使用率',
  `磁盘IO` text not NULL COMMENT '磁盘IO:{设备名称:{读每秒:float KB/S,写每秒:float KB/S},}',
    `网卡速率` text not NULL COMMENT '网卡速率:{发送速率:float bytes/s,接收速率:float bytes/s}',
    `内存使用率` FLOAT not NULL COMMENT '内存使用率'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Linux系统IO监控表';
'''
def iostat命令执行(ip:str,port:int=10022):
    cmd_str = "ssh -p {} {} 'sudo iostat -kx'".format(port,ip)
    # print(cmd_str)
    result=os.popen(cmd_str)
    result_str = result.read()
    return result_str;
def CPU利用率计算(cmd_result_Str:str)->float:
    '''
    请直接将命令执行结果发送过来
    总体CPU利用率 = %user + %system + %iowait
    '''
    #avg-cpu:  %user   %nice %system %iowait  %steal   %idle
    avg_cpu_str = re.findall(r'(?<=\n) +.+',cmd_result_Str)[0]

    avg_cpu_list=re.findall(r'\d+.\d+|\d+', avg_cpu_str)

    CPU_usage = float(avg_cpu_list[0])+float(avg_cpu_list[2])+float(avg_cpu_list[3])
    return CPU_usage;
def 获取磁盘IO(cmd_result_Str:str)->dict:
    '''
    请直接将命令执行结果发送过来
    返回的数据结构:{设备名称:{读每秒:float,写每秒:float},}
    '''
    lines = cmd_result_Str.split('\n')
    idx=0
    for line in lines:
        if('Device:' == line[:7]):
            break
        idx+=1
    need_line=lines[idx+1:]
    ret_dict={}
    for line in need_line:
        if(0 == len(line)):    #排除空字符串
            continue
        if("dm" == line[:2]):#排除dm-开头的设备,这是虚拟设备,lvm映射出来的。
            continue
        line = re.sub(r' +',' ',line)
        line_list= line.split(' ')
        ret_dict[line_list[0]]={'kB_read/s':line_list[1],'kB_wrtn/s':line_list[2]}
    return ret_dict;
def 获取网卡速率(ip:str,port:int=10022)->dict:
    '''
    设备名称将被写死;
    返回字典:{发送速率:,接收速率:},第一个是发送速率(bytes/s);第二个是接收速率(bytes/s)。
    '''
    设备名称="bond0"
    cmd_str = "ssh -p {} {} sudo ip -s link show {}|grep -E '^ +[0-9]+' -o|grep -E [0-9]+ -o".format(port,ip,设备名称)
    result=os.popen(cmd_str)
    result_lines = result.read().split('\n')    #RX在第一行,TX在第二行
    #RX 表示接收(Receive)的数据量,而 TX 表示发送(Transmit)的数据量。
    RX_bytes_old = int(result_lines[0])
    TX_bytes_old = int(result_lines[1])
    time.sleep(1)
    result=os.popen(cmd_str)
    result_lines = result.read().split('\n')    #RX在第一行,TX在第二行
    RX_bytes_new = int(result_lines[0])
    TX_bytes_new = int(result_lines[1])

    发送速率 = TX_bytes_new-TX_bytes_old
    接收速率 = RX_bytes_new-RX_bytes_old
    return {"发送速率":发送速率,"接收速率":接收速率};
def 获取物理内存使用率(ip:str,port:int=10022)->float:
    '''
    
    '''
    cmd_str = "ssh -p {} {} sudo cat /proc/meminfo".format(port,ip)
    result=os.popen(cmd_str)
    result_lines = result.read().split('\n')
    MemTotal=re.findall(r'\d+',result_lines[0])[0]    #表示系统总内存大小,以 KB 为单位。
    MemAvailable=re.findall(r'\d+',result_lines[2])[0]    #表示系统当前可用的内存大小,以 KB 为单位。这个字段在最新的内核版本中提供了更准确的可用内存信息。
    #不取MemFree是因为那是完完全全没有被使用的内存。
    #取MemAvailable的话,是表示系统可以应急抽调的内存,它包含MemFree
    return round(1-(int(MemAvailable)/int(MemTotal)),2);
def write_mysql(data_2List:list)->bool:
    mysql = pymysql.connect(host='',port=,user='',password='',database='sczxjc')
    # mysql = pymysql.connect(host='192.168.51.2',port=3306,user='root',password='',database='sczxjc')
    mysql_cursor=mysql.cursor()
    for data in data_2List:
        mysql_sql_str="INSERT INTO `sczxjc`.`r_linux_io_monitor`(`up_date`, `ip`, `CPU使用率`, `磁盘IO`, `网卡速率`, `内存使用率`) VALUES ('{}', '{}', {}, '{}', '{}', {})".format(data[0],data[1],data[2],data[3],data[4],data[5])
        # print(mysql_sql_str)
        mysql_cursor.execute(mysql_sql_str)
    mysql.commit()
    mysql.close();
def main():
    ips=["22.62.96.36","22.62.96.37","22.62.96.38","22.62.96.39","22.62.96.40","22.62.96.41","22.62.96.42","22.62.96.43","22.62.96.44","22.62.96.45","22.62.96.46","22.62.96.47","22.62.96.48","22.62.96.49","22.62.96.50","22.62.96.51","22.62.96.52","22.62.96.53","22.62.96.54",]
    # ips=["22.62.96.36","22.62.96.37",]
    now_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:00')
    out_result_list=[]
    for ip in ips:
        out_list=[now_datetime,ip]
        cmd_result_Str = iostat命令执行(ip)
        out_list.append(CPU利用率计算(cmd_result_Str))
        out_list.append(str(获取磁盘IO(cmd_result_Str)).replace("'",'"'))
        out_list.append(str(获取网卡速率(ip)).replace("'",'"'))
        out_list.append(获取物理内存使用率(ip))
        out_result_list.append(out_list)
    write_mysql(out_result_list);
if __name__ == '__main__':
    main()

将数据写入mysql之后,在展示出来。

posted on 2024-05-14 17:18  狂自私  阅读(3)  评论(0编辑  收藏  举报