欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python進(jìn)行服務(wù)器的監(jiān)控

 更新時(shí)間:2018年01月08日 08:51:54   作者:andy1219111  
這篇文章主要介紹了使用python進(jìn)行服務(wù)器的監(jiān)控以及python實(shí)現(xiàn)的監(jiān)控CPU負(fù)載的代碼,需要的朋友可以參考下

在linux服務(wù)器中,一切皆為文件,就是說(shuō),服務(wù)器運(yùn)行的個(gè)中信息,其實(shí)是可以從某些文件中查詢得到的;百度后,你會(huì)知道,在Linux系統(tǒng)中,有一個(gè)/proc的虛擬文件系統(tǒng):

Linux 系統(tǒng)為管理員提供了非常好的方法,使其可以在系統(tǒng)運(yùn)行時(shí)更改內(nèi)核,而不需要重新引導(dǎo)內(nèi)核系統(tǒng),這是通過(guò)/proc 虛擬文件系統(tǒng)實(shí)現(xiàn)的。/proc 文件虛擬系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來(lái)向進(jìn)程(process)發(fā)送信息的機(jī)制(所以叫做“/proc”),這個(gè)偽文件系統(tǒng)允許與內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)交互,獲取有關(guān)進(jìn)程的有用信息,在運(yùn)行中(on the fly)改變?cè)O(shè)置(通過(guò)改變內(nèi)核參數(shù))。與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存而不是硬盤(pán)中。proc 文件系統(tǒng)提供的信息如下:

1.進(jìn)程信息:系統(tǒng)中的任何一個(gè)進(jìn)程,在 proc 的子目錄中都有一個(gè)同名的進(jìn)程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超級(jí)用戶可見(jiàn),例如進(jìn)程根目錄。每一個(gè)單獨(dú)含有現(xiàn)有進(jìn)程信息的進(jìn)程有一些可用的專(zhuān)門(mén)鏈接,系統(tǒng)中的任何一個(gè)進(jìn)程都有一個(gè)單獨(dú)的自鏈接指向進(jìn)程信息,其用處就是從進(jìn)程中獲取命令行信息。

2.系統(tǒng)信息:如果需要了解整個(gè)系統(tǒng)信息中也可以從/proc/stat 中獲得,其中包括 CPU 占用情況、磁盤(pán)空間、內(nèi)存對(duì)換、中斷等

3.CPU 信息:利用/proc/CPUinfo 文件可以獲得中央處理器的當(dāng)前準(zhǔn)確信息

4.負(fù)載信息:/proc/loadavg 文件包含系統(tǒng)負(fù)載信息

5.系統(tǒng)內(nèi)存信息:/proc/meminfo 文件包含系統(tǒng)內(nèi)存的詳細(xì)信息,其中顯示物理內(nèi)存的數(shù)量、可用交換空間的數(shù)量,以及空閑內(nèi)存的數(shù)量等

/proc 目錄中的主要文件的說(shuō)明

文件或目錄名稱(chēng) 說(shuō)明
apm 高級(jí)電源管理信息
cmdline 這個(gè)文件給出了內(nèi)核啟動(dòng)的命令行
CPUinfo 中央處理器信息
devices 可以用到的設(shè)備(塊設(shè)備/字符設(shè)備)
dma 顯示當(dāng)前使用的 DMA 通道
filesystems 核心配置的文件系統(tǒng)
ioports 當(dāng)前使用的 I/O 端口
interrupts 這個(gè)文件的每一行都有一個(gè)保留的中斷
kcore 系統(tǒng)物理內(nèi)存映像
kmsg 核心輸出的消息,被送到日志文件
mdstat 這個(gè)文件包含了由 md 設(shè)備驅(qū)動(dòng)程序控制的 RAID 設(shè)備信息
loadavg 系統(tǒng)平均負(fù)載均衡
meminfo 存儲(chǔ)器使用信息,包括物理內(nèi)存和交換內(nèi)存
modules 這個(gè)文件給出可加載內(nèi)核模塊的信息
lsmod 程序用這些信息顯示有關(guān)模塊的名稱(chēng),大小,使用數(shù)目方面的信息
net 網(wǎng)絡(luò)協(xié)議狀態(tài)信息
partitions 系統(tǒng)識(shí)別的分區(qū)表
pci pci 設(shè)備信息
scsi scsi 設(shè)備信息
self 到查看/proc 程序進(jìn)程目錄的符號(hào)連接
stat 這個(gè)文件包含的信息有 CPU 利用率,磁盤(pán),內(nèi)存頁(yè),內(nèi)存對(duì)換,全部
swaps 顯示的是交換分區(qū)的使用情況
uptime 這個(gè)文件給出自從上次系統(tǒng)自舉以來(lái)的秒數(shù),以及其中有多少秒處于空閑
version 這個(gè)文件只有一行內(nèi)容,說(shuō)明正在運(yùn)行的內(nèi)核版本??梢杂脴?biāo)準(zhǔn)的編程方法進(jìn)行分析獲得所需的系統(tǒng)信息

以上列出來(lái)了這么多,是不是看起來(lái)眼花繚亂,但是不要慌,其實(shí)我們進(jìn)行服務(wù)器監(jiān)控,只會(huì)經(jīng)常用到其中比較少的以部門(mén)。

利用/proc文件系統(tǒng)進(jìn)行服務(wù)器監(jiān)控

以上我們知道了服務(wù)器信息可以從哪里獲取,那么下面,我們就是編寫(xiě)腳本,讀取我們要獲取信息的文件,從中得到服務(wù)器的運(yùn)行數(shù)據(jù)。下面是我們經(jīng)常會(huì)需要監(jiān)控的服務(wù)器的一些數(shù)據(jù):

讀取/proc/meminfo獲取內(nèi)存信息

該文件內(nèi)容如下

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

每個(gè)字段具體什么意思自己百度吧,直接上監(jiān)控代碼:

""" 內(nèi)存監(jiān)控
"""
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']
 #記錄內(nèi)存使用率 已使用 總內(nèi)存和緩存大小
 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負(fù)載信息

該文件內(nèi)容如下:

0.00 0.01 0.05 1/128 9424 

簡(jiǎn)單說(shuō)明一下每個(gè)字段的含義,前三個(gè)參數(shù)分別為1、5、15分鐘內(nèi)cpu的平均負(fù)載,第四個(gè)參數(shù)為正在運(yùn)行的進(jìn)程數(shù)和總進(jìn)程數(shù),最后一個(gè)代表最近活躍的進(jìn)程ID

下面為python實(shí)現(xiàn)的監(jiān)控CPU負(fù)載的代碼:

""" CPU負(fù)載監(jiān)控
"""
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包獲取硬盤(pán)信息

""" 磁盤(pán)空間監(jiān)控
"""
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

獲取服務(wù)器的ip

在一個(gè)服務(wù)器上,可能有多塊網(wǎng)卡, 在獲取網(wǎng)卡信息時(shí),你需要傳入網(wǎng)卡的名字,具體有哪些網(wǎng)卡,可以使用ifconfig命令查看

""" 獲取當(dāng)前服務(wù)器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獲取網(wǎng)卡流量信息

我們將會(huì)從該文件中獲得系統(tǒng)的網(wǎng)絡(luò)接口,以及當(dāng)系統(tǒng)重啟之后通過(guò)它們數(shù)據(jù)發(fā)送和接受數(shù)據(jù)的信息。 /proc/net/dev文件讓這些信息可用。如果你檢查了這個(gè)文件的內(nèi)容,你就會(huì)注意到頭一兩行包含了頭信息等等,這個(gè)文件第一列是網(wǎng)絡(luò)接口名,第二和第三列顯示了接收和發(fā)送的字節(jié)數(shù)信息(例如總發(fā)送字節(jié)數(shù),包數(shù),錯(cuò)誤等等)。這里我們所感興趣的就是他哦難過(guò)不同的網(wǎng)絡(luò)設(shè)備提取出總發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。下面的代碼展示了怎么從/proc/net/dev文件中提取出這些信息,文件內(nèi)容會(huì)是這樣的:

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

下面將獲取每個(gè)網(wǎng)卡的進(jìn)出流量信息:

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

最后在提供一個(gè)Apache服務(wù)的監(jiān)控腳本

#!/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 進(jìn)程異常退出, 4 秒后重新啟動(dòng)"
   time.sleep(3) 
   os.system("service apache2 restart") 
 except: 
  print "Error", sys.exc_info()[1]

總結(jié)

以上所述是小編給大家介紹的使用python進(jìn)行服務(wù)器的監(jiān)控,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論