使用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 目录中的主要文件的说明

文件或目录名称说明
apm高级电源管理信息
cmdline这个文件给出了内核启动的命令行
CPUinfo中央处理器信息
devices可以用到的设备(块设备/字符设备)
dma显示当前使用的 DMA 通道
filesystems核心配置的文件系统
ioports当前使用的 I/O 端口
interrupts这个文件的每一行都有一个保留的中断
kcore系统物理内存映像
kmsg核心输出的消息,被送到日志文件
mdstat这个文件包含了由 md 设备驱动程序控制的 RAID 设备信息
loadavg系统平均负载均衡
meminfo存储器使用信息,包括物理内存和交换内存
modules这个文件给出可加载内核模块的信息
lsmod程序用这些信息显示有关模块的名称,大小,使用数目方面的信息
net网络协议状态信息
partitions系统识别的分区表
pcipci 设备信息
scsiscsi 设备信息
self到查看/proc 程序进程目录的符号连接
stat这个文件包含的信息有 CPU 利用率,磁盘,内存页,内存对换,全部
swaps显示的是交换分区的使用情况
uptime这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲
version这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息

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

利用/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包获取硬盘信息

""" 磁盘空间监控

"""

def disk_stat():

import os

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文件中提取出这些信息,文件内容会是这样的:

Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed

lo:13092608592182 4315193859 0 0 0 0 0 0 13092608592182 4315193859 0 0 0 0 0 0

eth0:6081251983019 4697841969 0 0 0 0 0 0 196939978179 2079619999 0 0 0 0 0 0

eth1:5718927608592 9484371630 0 0 0 0 0 0 142737118022 2007173284 0 0 0 0 0 0

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

#!/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]

总结

以上所述是小编给大家介绍的使用python进行服务器的监控,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是 使用python进行服务器的监控 的全部内容, 来源链接: utcz.com/z/356551.html

回到顶部