用python進行伺服器的監控

來源:互聯網
上載者:User

標籤:伺服器   back   AC   drop   ocm   linux伺服器   mds   符號   控制   

用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 系統識別的分區表
pci pci 裝置資訊
scsi scsi 裝置資訊
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_functiondef 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 netif __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進行伺服器的監控

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.