• 使用python进行服务器监控


    使用python进行服务器监控

    Linux服务器中,一切皆为文件。也就是说服务器运行的各种信息,其实是可以从某些文件中查询得到;

    Linux系统中,有一个/proc的虚拟文件系统

    Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。proc 文件系统提供的信息如下:

    1.进程信息:系统中的任何一个进程,在proc的子目录中都有一个同名的进程ID,可以找到cmdline、mem、root、stat、statm以及status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。

    2.系统信息:如果需要了解整个系统信息中也可以从/proc/stat 中获得,其中包括 CPU 占用情况、磁盘空间、内存对换、中断等

    3.CPU 信息:利用/proc/CPUinfo 文件可以获得中央处理器的当前准确信息

    4.负载信息:/proc/loadavg 文件包含系统负载信息

    5.系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等

    /proc 目录中的主要文件的说明

    以上列出来了这么多,是不是看起来眼花缭乱,但是不要慌,其实我们进行服务器监控,只会经常用到其中比较少的以部门。

    利用/proc文件系统进行服务器监控

    以上我们知道了服务器信息可以从哪里获取,那么下面,我们就是编写脚本,读取我们要获取信息的文件,从中得到服务器的运行数据。下面是我们经常会需要监控的服务器的一些数据:

    读取/proc/meminfo获取内存信息

    该文件内容如下

    MemTotal: 1017544 kB 
    MemFree: 583304 kB 
    MemAvailable: 756636 kB 
    Buffers: 42996 kB 
    Cached: 238820 kB 
    SwapCached: 0 kB 
    Active: 116092 kB 
    Inactive: 252004 kB 
    Active(anon): 11956 kB 
    Inactive(anon): 85136 kB 
    Active(file): 104136 kB 
    Inactive(file): 166868 kB 
    Unevictable: 0 kB 
    Mlocked: 0 kB 
    SwapTotal: 1044476 kB 
    SwapFree: 1044272 kB 
    Dirty: 64 kB 
    Writeback: 0 kB 
    AnonPages: 86304 kB 
    Mapped: 48832 kB 
    Shmem: 10812 kB 
    Slab: 40648 kB 
    SReclaimable: 29904 kB 
    SUnreclaim: 10744 kB 
    KernelStack: 2048 kB 
    PageTables: 8232 kB 
    NFS_Unstable: 0 kB 
    Bounce: 0 kB 
    WritebackTmp: 0 kB 
    CommitLimit: 1553248 kB 
    Committed_AS: 681428 kB 
    VmallocTotal: 34359738367 kB 
    VmallocUsed: 5796 kB 
    VmallocChunk: 34359727572 kB 
    HardwareCorrupted: 0 kB 
    AnonHugePages: 32768 kB 
    HugePages_Total: 0 
    HugePages_Free: 0 
    HugePages_Rsvd: 0 
    HugePages_Surp: 0 
    Hugepagesize: 2048 kB 
    DirectMap4k: 34752 kB 
    DirectMap2M: 1013760 kB

    监控代码:

    """ 内存监控
    """
    def memory_stat():
        mem = {}
        f = open('/proc/meminfo', 'r')
        lines = f.readlines()
        f.close()
        for line in lines:
            if len(line) < 2:
                continue
            name = line.split(':')[0]
            var = line.split(':')[1].split()[0]
            mem[name] = float(var)
        mem['MemUsed'] = mem['MemTotal'] - mem['MemFree'] - mem['Buffers'] - mem['Cached']
        #记录内存使用率 已使用 总内存和缓存大小
        res = {}
        res['percent'] = int(round(mem['MemUsed'] / mem['MemTotal'] * 100))
        res['used'] = round(mem['MemUsed'] / (1024 * 1024), 2)
        res['MemTotal'] = round(mem['MemTotal'] / (1024 * 1024), 2)
        res['Buffers'] = round(mem['Buffers'] / (1024 * 1024), 2)
        return res

    读取/proc/loadavg获取CPU负载信息

    该文件内容如下:

    0.00 0.01 0.05 1/128 9424 
    简单说明一下每个字段的含义,前三个参数分别为1、5、15分钟内cpu的平均负载,第四个参数为正在运行的进程数和总进程数,最后一个代表最近活跃的进程ID

    下面为python实现的监控CPU负载的代码:

    """ CPU负载监控
    """
    def load_stat():
        loadavg = {}
        f = open("/proc/loadavg")
        con = f.read().split()
        f.close()
        loadavg['lavg_1']=con[0]
        loadavg['lavg_5']=con[1]
        loadavg['lavg_15']=con[2]
        loadavg['nr']=con[3]
    
    
        prosess_list = loadavg['nr'].split('/')
        loadavg['running_prosess']=prosess_list[0]
        loadavg['total_prosess']=prosess_list[1]
    
        loadavg['last_pid']=con[4]
    
        return loadavg

    利用python的os包获取硬盘信息

    import os
    '''
    os.statvfs方法用于返回包含文件描述符fd的文件的文件系统的信息。
    语法:os.statvfs([path])
    返回值
    f_bsize: 文件系统块大小
    f_frsize: 分栈大小
    f_blocks: 文件系统数据块总数
    f_bfree: 可用块数
    f_bavail:非超级用户可获取的块数
    f_files: 文件结点总数
    f_ffree: 可用文件结点数
    f_favail: 非超级用户的可用文件结点数
    f_fsid: 文件系统标识 ID
    f_flag: 挂载标记
    f_namemax: 最大文件长度
    '''
    def disk_stat():
        hd={}
        disk = os.statvfs('/')
        hd['available'] = float(disk.f_bsize * disk.f_bavail)
        hd['capacity'] = float(disk.f_bsize * disk.f_blocks)
        hd['used'] = float((disk.f_blocks - disk.f_bfree) * disk.f_frsize)
        res = {}
        res['used'] = round(hd['used'] / (1024 * 1024 * 1024), 2)
        res['capacity'] = round(hd['capacity'] / (1024 * 1024 * 1024), 2)
        res['available'] = res['capacity'] - res['used']
        res['percent'] = int(round(float(res['used']) / res['capacity'] * 100))
        return res

    获取服务器的ip

    在一个服务器上,可能有多块网卡, 在获取网卡信息时,你需要传入网卡的名字,具体有哪些网卡,可以使用ifconfig命令查看

    """ 获取当前服务器ip
    """
    def get_ip(ifname):
        import socket
        import fcntl
        import struct
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])

    读取/proc/net/dev获取网卡流量信息

    我们将会从该文件中获得系统的网络接口,以及当系统重启之后通过它们数据发送和接受数据的信息。 /proc/net/dev文件让这些信息可用。如果你检查了这个文件的内容,你就会注意到头一两行包含了头信息等等,这个文件第一列是网络接口名,第二和第三列显示了接收和发送的字节数信息(例如总发送字节数,包数,错误等等)。这里我们所感兴趣的就是他哦难过不同的网络设备提取出总发送数据和接收数据。下面的代码展示了怎么从/proc/net/dev文件中提取出这些信息,文件内容会是这样的:

    下面将获取每个网卡的进出流量信息:

    #!/usr/bin/env python 
    from __future__ import print_function
    
    def net_stat():
        net = {}
        f = open("/proc/net/dev")
        lines = f.readlines()
        f.close
        for line in lines[2:]:
            line = line.split(":")
            eth_name = line[0].strip()
            if eth_name != 'lo':
                net_io = {}
                net_io['receive'] = round(float(line[1].split()[0]) / (1024.0 * 1024.0),2)
                net_io['transmit'] = round(float(line[1].split()[8]) / (1024.0 * 1024.0),2)
                net[eth_name] = net_io
        return net
    
    if __name__ == '__main__':
        netdevs = net_stat()
        print(netdevs)

    最后在提供一个Apache服务的监控脚本

    #!/usr/bin/env Python 
    import os, sys, time 
    
    while True: 
        time.sleep(4) 
        try: 
            ret = os.popen('ps -C apache -o pid,cmd').readlines() 
            if len(ret) < 2: 
                print "apache 进程异常退出, 4 秒后重新启动"
                time.sleep(3) 
                os.system("service apache2 restart") 
        except: 
            print "Error", sys.exc_info()[1]
  • 相关阅读:
    luogu_P3195 [HNOI2008]玩具装箱TOY
    CF_837D
    luogu_P3584 [POI2015]LAS
    大一下存活纪实
    Mathematical Logic for Computer Science 读书笔记
    集训补题合集
    图论笔记4 平面图与可平面图
    软件分析笔记3 DFA
    软件分析笔记2 IR
    软件分析笔记1 Intro
  • 原文地址:https://www.cnblogs.com/ppap/p/11405058.html
Copyright © 2020-2023  润新知