使用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]

原文地址:https://www.cnblogs.com/ppap/p/11405058.html

时间: 2024-10-31 15:06:30

使用python进行服务器监控的相关文章

游戏服务器监控的设计与实现(三)

系统信息采集方面,选择使用Sigar的第三方库. 对于Sigar做一个简单的梳理. 服务器监控,一方面要对游戏服务器的数据进行采集,另一方面也要对游戏服务器所在的系统信息进行采集.我打算使用sigar来获取系统信息的采集工作.其Demo非常完整,并且跨平台支持,本身对于.net,C++,php,python,java,perl,ruby都是支持的,为以后的扩展和更改留有很多的余地. sigar网址:https://support.hyperic.com/display/SIGAR/Home;js

明晚九点|一线互联网公司服务器监控系统架构分享

主题:一线互联网公司服务器监控系统架构 内容: 自动运维的一点体会 性能与可用性可扩展 功能可扩展 监控支撑业务扩展 主讲师:PC 老师 大学时期就负责学校官方网站的运维工作,实习期间加入豆瓣,有幸成为豆瓣 Top20 员工,从事 Python 开发及运维工作,后在 BAT 从事自动化运维,见证BAT 运维自动化从无到有.擅长系统底层.分布式系统开发,热衷于开源运动,给 memcached.[email protected] 等多个开源项目贡献过代码. 自动化运维的一点体会 不同公司的需求差异

服务器监控cacti

第九章:服务器监控系统cacti 防伪码:海阔天空 前言:在企业网络运维过程中,管理员必须时刻关注服务器的运行状态,如CPU.内存.磁盘空间使用情况等.为了能够及时的发现问题,尽量减少故障的发生.当网络中的设备,服务器等数量较多时,可以部署一套监控系统来实时跟踪服务器,我们通常会借助一些软件来实现.今天就以Cacti套件为例,介绍服务器集中监测体系的构建和使用. 今天所讲的cacti服务器监控系统与windows操作系统中的"性能监视器"属于同一类,都是为了监控cpu占用,内存使用,运

【Linux--中级篇】服务器监控Cacti

服务器监控Cacti 1.实验环境: 主机 操作系统 IP地址 主要软件 主控端 CentOS6.5x86_64 192.168.10.15 Rrdtool-1.4.8.tar.gz Cacti-0.8.8b.tar.gz 被控端 CentOS6.5x86_64 192.168.10.18 Win7客户机 192.168.10.5 2.实验步骤: 1.主控端配置 1)配置LAMP环境 安装mysql数据库 配置apache与php 2> 安装rrdtool和net-snmp 通过yum确认并安装

Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目

Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目 1. Resin4.0.22 1 2. 查看http连接数::Summary>>tables 1 2.1.1. Open Connections 1 2.2. TCP ports? 1 3. 查看app::confgi?>>webapps 2 3.1. Host http://localhost:80 2 3.1.1. WebApps 2 4. 查看app2:::   

[转载]你需要知道的 16 个 Linux 服务器监控命令

转载自: 你需要知道的 16 个 Linux 服务器监控命令 如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员. 有些 Linux 发行版会提供 GUI 程序来进行系统的监控,例如 SUSE Linux 就有一个非常棒而且专业的工具 YaST,KDE 的 KDE System Guard 同样很出色.当然,要使用这些工具,你必须在服务器跟前进行操作,而且这些 GUI 的程序占用了很多系统资源,所以说,尽管 GUI

列举一些常见的Python HTTP服务器

要使 Python 写的程序能在 Web 上被访问,还需要搭建一个支持 Python 的 HTTP 服务器.下面列举一些常见的 Python HTTP 服务器,以及它们目前的大致发展情况,以便用户的对比选择: Name Version http 1.1 Flavour Repo. Community Gunicorn 0.6.4 No processor/thread GIT #gunicorn uWSGI Trunk (253) Yes processor/thread repo Mailin

jmeter服务器监控指标

以下是下载了服务器监控插件的各个组件的功能介绍,有助于以后jmeter的性能测试 [email protected] - Actiive Threads Over Time:不同时间的活动用户数量展示(图表) 当前的时间间隔是1毫秒,在setting中可以设置时间间隔以及其他的参数 2.[email protected] - AutoStop Listener :自动停止监听器 设置当发生某些预期之外的情况时自动停止测试 average Response Time is greater than

Ubuntu Server 安装部署 Cacti 服务器监控

Ubuntu Server 安装部署 Cacti 服务器监控 form :http://www.cnblogs.com/xuri/p/3379337.html