標籤:伺服器 back AC drop ocm linux伺服器 mds 符號 控制
用python進行伺服器的監控
在linux伺服器中,一切皆為檔案,就是說,伺服器啟動並執行個中資訊,其實是可以從某些檔案中查詢得到的;百度後,你會知道,在Linux系統中,有一個/proc的虛擬檔案系統:
Linux 系統為管理員提供了非常好的方法,使其可以在系統運行時更改核心,而不需要重新引導核心系統,這是通過/proc 虛擬檔案系統實現的。/proc 檔案虛擬系統是一種核心和核心模組用來向進程(process)發送資訊的機制(所以叫做“/proc”),這個偽檔案系統允許與核心內部資料結構互動,擷取有關進程的有用資訊,在運行中(on the fly)改變設定(通過改變核心參數)。與其他檔案系統不同,/proc 存在於記憶體而不是硬碟中。proc 檔案系統提供的資訊如下:
- 進程資訊:系統中的任何一個進程,在 proc 的子目錄中都有一個同名的進程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些資訊只有超級使用者可見,例如進程根目錄。每一個單獨含有現有進程資訊的進程有一些可用的專門連結,系統中的任何一個進程都有一個單獨的自連結指向進程資訊,其用處就是從進程中擷取命令列資訊。
- 系統資訊:如果需要瞭解整個系統資訊中也可以從/proc/stat 中獲得,其中包括 CPU 佔用情況、磁碟空間、記憶體對換、中斷等
- CPU 資訊:利用/proc/CPUinfo 檔案可以獲得中央處理器的當前準確資訊
- 負載資訊:/proc/loadavg 檔案包含系統負載資訊
- 系統記憶體資訊:/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進行伺服器的監控