第一章 系統基礎信息模塊詳解
系統基礎信息采集模塊最為監控模塊的重要組成部分,能夠幫助運維人員了解當前系統的健康程度,同時也是衡量業務的服務質量的依據,比如系統資源吃緊,會直接影響業務的質量以及用戶的體驗,另外獲取設備的流量信息,也可以讓運維人員更好地評估帶寬、設備資源是否應該擴容。
本章通過具體的實例來幫助讀者學習、理解並掌握。在本章接下來的內容中,可以通過運用Python第三方系統基礎模塊,獲取服務關鍵運營指標數據,其中包括Linux基本性能、塊設備、網卡接口、系統信息、網絡地址庫等信息。當采集到在這些信息后,可以全方位的了解系統服務的狀態,結合告警機制,可以在第一時間響應,將異常剛剛出現時得以及時的處理。
以下實例都是在一個連續的Python=交互環境中進行。
1.1 系統性能信息模塊psutil
psutil是一個跨平台庫,可以輕松地實現獲取系統運行的進程和系統利用率其中包括CPU、內存、硬盤、網絡信息等。主要用於系統監控,分析和限制系統資源以及進程的管理。
支持的命令包括:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskst、pmap等。
通常獲取系統信息采用編寫shell來實現,如獲取當前物理機的內存總大小以及使用大小,shell命令
total: free -m | grep Mem | awk ‘{print $2}’
used: free -m | grep Mem | awk ‘{print $3}’
使用psutil庫實現就更加簡單明了。psutil大小單位采用的是字節,實例如下圖:
源碼安裝:
1.1.1 獲取系統性能信息
psutil已經封裝了獲取系統性能信息的方法,可以根據用戶的應用場景,來調用相應的方法媽祖用戶需求。
(1)CPU信息
linux中的cpu利用率包括以下幾部分:
User Time 執行用戶進程的時間百分比
System Time 執行內核進程和中斷的時間百分比
Wait IO 由於IO等待而使CPU處於idle(空閑)狀態的時間百分比
Idle Cpu處於空心狀態的時間百分比
使用psutil.cpu_times()方法可以非常簡單的得到信息,同時獲取CPU的硬件信息,比如CPU的物理個數與邏輯個數,如下圖:
使用psutil.cpu_times()獲取cpu完整信息,需要顯示所有邏輯CPU信息,指定方法變量percpu=True,例如psutil.cpu_times(percpu=True)。
獲取單項數據信息,用戶user的CPU時間比
(2)內存信息
Linux操作系統中的內存利用率包括total(內存總數),used(已使用的內存數),free(空閑內存數),buffers(緩沖使用數),cache(緩存使用數),swap(交換分區使用數)等等。分別使用 psutil.virtual_memory()和psutil.swap_memory()方法獲取這些信息。詳細操作如下圖:
(3) 磁盤信息
在系統地所有磁盤信息中,主要關注地是磁盤的利用率以及IO信息,其中磁盤利用率使用psutil.disk_usage獲取。磁盤IO信息包括:read_count(讀IO數)、write_count(寫IO數)、read_bytes(IO讀字節數)、write_bytes(IO寫字節數)、read_time(磁盤讀時間)、write_time(磁盤寫時間)等。這些IO信息可以使用psutil.disk_io_counters()獲取,如下圖實例:
(4) 網絡信息
系統的網絡信息與磁盤IO類似,包括:bytes_sent(發送字節數)、bytes_resv(接收字節數)、packets_sent(發送數據包數)、packets_recv(接收數據包數)等。使用psutil_net_io_counters()方法獲取,操作如下:
(5)其他系統信息
psutil模塊支持獲取用戶登錄、開機時間等信息,如下圖:
1.1.2 系統進程管理方法
獲得當前的系統信息地進程信息,可以讓運維人員得知應用程序的運行狀態,包括進程的啟動時間、查看或者設置CPU親和度、內存使用率、IO信息、socket連接、線程數等,這些信息可以呈現出指定進程是否存活、資源利用情況,為開發人員的代碼優化、問題定位提供很好的數據參考。
(1)進程信息
psutil.pids()獲取所有進程的PID,使用psutil.Process()方法獲取的那個進程的名稱、路徑、狀態、系統資源利用率等信息,如下圖:
當輸入p.exe()出現錯誤
(2)popen類的使用
psutil提供的popen類的作用是獲取用戶啟動的應用程序進程信息,以便跟蹤程序進程的運行狀態。如下圖:
1.2 實用的IP地址處理模塊IPy
IP地址規划是網絡設計中非常重要的環節,規划的好壞會直接影響路由協議算法的效率,其中擺闊網絡性能、可擴展性等,在這過程中,是避免不了要計算大量的IP地址,例如網段、網絡掩碼、廣播地址、子網數、IP類型等。Python提供了強大的第三方模塊IPy,可以很好的輔助我們高效完成IP的規划工作。
(1)IPy模塊安裝
(2)IP地址、網段的基本處理
IPy模塊包含IP類,使用他可以方便處理絕大部分格式為IPv6以及IPv4的網絡和地址。
可以通過cersion()來區分,首先要導入IPy庫,from IPy import IP ,之后進行操作,如下圖:
通過指定的網段輸出該網段的IP個數以及所有IP地址清單,代碼如下:
下面介紹IP類幾個常見的方法,包括反向解析名稱,IP類型,IP轉換等。iptype()代表ip類型,strHex()轉換成十六進制,strBin()轉換成二進制格式,IP(0x8080808)十六進制轉換成IP格式。
IP方法支持網絡地址的轉換,例如根據IP與掩碼生產網段格式,如下:
也可以通過strNormal方法指定不同wantprefixlen參數值以定制不同輸出類型的網段,輸出另外i行字符串,如下:
wantprefixlen = 0,無返回,如192.168.1.0
wantprefixlen = 1,prefix格式,192.168.1.0/24
wantprefixlen = 2,decima net mask格式,192.168.1.0/255.255.255.0
wantprefixlen = 3,lastIP格式,192.168.1.0-192.168.1.255
(3) 多網絡計算方法詳解
比較兩個網段是否存在包含、重疊等關系,同網絡但不同prefixlen會認為是不同的網段,例如192.168.0.0/16不等於192.168.0.0/24,另外即使具有相同的prefixlen但會處於不同的網絡地址,同樣視為不相等,例如10.0.0.0/16不等於192.0.0.0/16.IPy支持類似於數值型數據的比較,以幫助IP對象進行比較,如:
判斷IP地址和網段是否包含於另一個網段中:
判斷兩個網段是否存在重疊,采用IPy提供的overlaps方法,如下圖:(返回1有重疊,0沒有重疊)
實例 根據輸入的IP地址或者子網返回網絡、掩碼、廣播、反向解析、子網數、IP類型等信息。
運行結果:
1.3 DNS處理模塊dnspython
dnspython是Python實現的一個DNS工具包,他支持幾乎所有的記錄類型,可以用於查詢、傳輸並動態更i新ZONE信息,同時支持TSIG(事務簽名)驗證消息和EDNS0(擴展DNS)。在系統管理方面,我們可以利用其查詢功能來實現DNS服務監控以及解析結果的校驗,可以代替nslookup及dig等工具,輕松做到與現有平台的整合,下面進行詳細介紹。
安裝:
(1)模塊域名解析方案詳解
dnspython模塊提供了大量的DNS處理方法,最常用的方法是域名查詢。dnspython提供了DNS的解析器類----resolver,使用他的query方法來實現域名的查詢功能。query方法如下:
其中,qname參數為查詢的域名。rdtype參數來制定RR資源的類型,常用的有以下幾種:
A記錄:將主機名轉換成IP地址
MX記錄:郵件交換記錄,定義郵件服務器的域名
CNAME:指的是別名記錄,實現域名間的映射
NS記錄:標記區域的域名服務器以及授權子域
PTR記錄:反向解析,與A記錄相反,將IP轉換成主機名
SOA記錄:SOA標記,一個其實授權區的定義
rdclass參數由於指定網絡類型(IN,CH,HS)其中IN是默認,使用廣泛。tcp參數由於指定查詢是否啟用TCP協議,默認False(不啟用)。source與source_port參數指定查詢源地址與端口,默認值為查詢設備IP地址和0。raise_on_answer參數用於指定當查詢無應答是是否觸發異常,默認為True。
(2)常見解析類型示例說明
常見的DNS解析類型包括A,MX,NS,CNAME等。利用dnspython的dns.resolver.query方法可以簡單的實現簡單的DNS類型的查詢,為后面要實現的功能提供數據來源,比如對各使用DNS輪循業務的域名進行可用性監控,需要得到當前的解析結果。下面一一進行介紹。
A記錄:
運行結果:www.google.com
MX記錄:
運行結果:163.com
NS記錄:
運行結果:baidu.com
CNAME記錄:
運行結果:www.baidu.com
(3)實踐:DNS域名輪循業務監控
大部分的DNS解析都是一個域名對應一個IP地址,但是通過DNS輪循技術可以做到一個域名對應多個IP,從而實現最簡單且高效的負載均衡,不過此方案最大的弊端是目標主機不可用時無法被自動解除,因此做好業務主機的服務可用監控至關重要。本實例通過分析當前域名的解析IP,再結合服務端口探測來實現自動監控,在域名解析中添加,刪除IP時,無需對監控腳本進行更改。架構圖:
步驟
1.實現域名的解析,獲取域名所有的A記錄解析IP列表;
2.對IP列表進行HTTP級別的探測
代碼解析
第一步通過dns.resolver.query()方法獲取業務域名A記錄,查詢出所有的IP地址列表,在使用httplib模塊的request()方法以GET方式請求監控頁面,監控業務所有服務的IP是否正常。