psuitil模塊
filecmp模塊
pycurl模塊
一、系統性能信息模塊psuitil
psutil是一個跨平臺庫(http://code.google.com/p/psutil/),能夠輕松實現獲取系統運行的進程和系統利用率(包括CPU、內存、磁盤、網絡等)信息。它主要應用于系統監控,分析和限制系統資源及進程的管理。它實現了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。
1.安裝:
#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate # tar -xzvf psutil-2.0.0.tar.gz # cd psutil-2.0.0 # python setup.py install
2.獲取系統性能信息
CPU信息:
>>> import psutil >>> psutil.cpu_times()#使用cpu_times方法獲取CPU完整信息,需要顯示所有邏輯CPU信息, >>> #指定方法變量percpu=True即可,如psutil.cpu_times(percpu=True) scputimes(user=38.039999999999999, nice=0.01, system=110.88, idle=177062.59, iowait=53.399999999999999, irq=2.9100000000000001, softirq=79.579999999999998, steal=0.0, guest=0.0) >>> psutil.cpu_times().user #獲取單項數據信息,如用戶user的CPU時間比 38.0 >>> psutil.cpu_count() #獲取CPU的邏輯個數,默認logical=True4 >>> psutil.cpu_count(logical=False) #獲取CPU的物理個數 2
內存信息:
psutil.virtual_memory() #獲取內存完整信息 psutil.virtual_memory().total #獲取內存總數 psutil.virtual_memory().free #獲取空閑內存數 psutil.swap_memory() #獲取SWAP分區信息
磁盤信息:
磁盤IO信息包括read_count(讀IO數)、write_count(寫IO數)、read_bytes(IO讀字節數)、write_bytes(IO寫字節數)、read_time(磁盤讀時間)、write_time(磁盤寫時間)等
psutil.disk_partitions() #獲取磁盤完整信息 psutil.disk_usage('/') #獲取分區的使用情況 psutil.disk_io_counters() #獲取硬盤的IO個數、讀寫信息 psutil.disk_io_counters(perdisk=True) #獲取單個分區IO個數、讀寫信息
網絡信息:
系統的網絡信息與磁盤IO類似,涉及幾個關鍵點,包括bytes_sent(發送字節數)、bytes_recv=28220119(接收字節數)、packets_sent=200978(發送數據包數)、packets_recv=212672(接收數據包數)等。
psutil.net_io_counters() #獲取網絡總的IO信息,默認pernic=False psutil.net_io_counters(pernic=True) #輸出每個網絡接口的IO信息
其他信息:
psutil.users() ? ? ? ? ? ?#返回當前登陸系統的用戶信息 psutil.boot_time() ? ? ? ? ? ?#獲取開機時間,以Linux時間格式顯示 datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") ? ? ? ? ‘2018-01-15 15:24:26‘ ? ? ? ? ? ? ? ? ? ? ? ? ? ? #轉換成自然時間格式
3.系統進程管理方法
進程信息:
psutil.pids() #列出所有進程的PID p=psutil.Process(#) #實例化一個對象,參數為一進程的PID p.name() #進程名稱 p.exe() #進程bin路徑 p.status() #進程狀態 p.cwd() #進程工作目錄絕對路徑 p.create_time() #創建時間,時間戳格式 p.uids() #進程uid信息 p.gids() #進程gid信息 p.cpu_time() #進程CPU時間信息 p.cpu_affinity() #進程CPU親和度 p.memory_percent() #進程內存利用率 p.memory_info() #進程內存rss,vms信息 p.io_counters() #進程IO信息 p.connections() #打開進程Socket的namedutples列表 p.num_threads() #進程打開的線程數
popen類使用
popen類的作用是獲取用戶啟動的應用程序進程信息,以便跟蹤進程的運行狀態
import psutil from subprocess import PIPE p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE) p.name() p.communicate() p.cpu_times() #進程運行的CPU時間
參見:
https://github.com/giampaolo/psutil http://psutil.readthedocs.org/en/latest/
二、文件與目錄差異對比方法—–filecmp模塊
單文件對比
采用filecmp.cmp(f1,f2[,shallow])方法,比較文件名名為f1和f2的文件,相同返回True,不相同返回False,shallow默認為True,意思是只根據os.stat()方法返回的文件基本信息進行對比,比如最后訪問時間、修改時間、狀態改變時間等,會忽略文件內容的對比。當shallow為False時,則os.stat()與文件內容同時進行校驗。
示例:比較單文件的差異。
>>> filecmp.cmp("/home/test/filecmp/f1","/home/test/filecmp/f3") True >>> filecmp.cmp("/home/test/filecmp/f1","/home/test/filecmp/f2") False
多文件對比
采用filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,對比dir1與dir2目錄給定的文件清單。該方法返回文件名的三個列表,分別為匹配、不匹配、錯誤。匹配為包含匹配的文件的列表,不匹配反之,錯誤列表包括了目錄不存在文件、不具備讀權限或其他原因導致的不能比較的文件清單。
示例:dir1與dir2目錄中指定文件清單對比。
>>>filecmp.cmpfiles("/home/test/filecmp/dir1","/home/test/filecmp/dir2",['f1','f2','f3','f4','f5']) (['f1', 'f2'], ['f3'], ['f4', 'f5'])
目錄對比
通過dircmp(a,b[,ignore[,hide]])類創建一個目錄比較對象,其中a和b是參加比較的目錄名。ignore代表文件名忽略的列表,并默認為[‘RCS’,’CVS’,’tags’];hide代表隱藏的列表,默認為[os.curdir,os.pardir]。dircmp類可以獲得目錄比較的詳細信息,如只有在a目錄中包括的文件、a與b都存在的子目錄、匹配的文件等,同時支持遞歸。
dircmp提供了三個輸出報告的方法:
·report(),比較當前指定目錄中的內容;
·report_partial_closure(),比較當前指定目錄及第一級子目錄中的內容;
·report_full_closure(),遞歸比較所有指定目錄的內容。
為輸出更加詳細的比較結果,dircmp類還提供了以下屬性:
·left,左目錄,如類定義中的a; ·right,右目錄,如類定義中的b; ·left_list,左目錄中的文件及目錄列表; ·right_list,右目錄中的文件及目錄列表; ·common,兩邊目錄共同存在的文件或目錄; ·left_only,只在左目錄中的文件或目錄; ·right_only,只在右目錄中的文件或目錄; ·common_dirs,兩邊目錄都存在的子目錄; ·common_files,兩邊目錄都存在的子文件; ·common_funny,兩邊目錄都存在的子目錄(不同os.stat()記錄的錯誤); ·same_files,匹配相同的文件; ·diff_files,不匹配的文件; ·funny_files,兩邊目錄中都存在,但無法比較的文件; ·subdirs,將common_dirs目錄名映射到新的dircmp對象,格式為字典類型。
示例:對比dir1與dir2的目錄差異。通過調用dircmp()方法實現目錄差異對比功能,同時輸出目錄對比對象所有屬性信息。 /home/test/filecmp/simple1.py
import filecmp a="/home/test/filecmp/dir1" #定義左目錄 b="/home/test/filecmp/dir2" #定義右目錄 dirobj=filecmp.dircmp(a,b,['test.py']) #目錄比較,忽略test.py文件 dirobj.report() dirobj.report_partial_closure() dirobj.report_full_closure() print "left_list:"+ str(dirobj.left_list) print "right_list:"+ str(dirobj.right_list) print "common:"+ str(dirobj.common) print "left_only:"+ str(dirobj.left_only) print "right_only:"+ str(dirobj.right_only) print "common_dirs:"+ str(dirobj.common_dirs) print "common_files:"+ str(dirobj.common_files) print "common_funny:"+ str(dirobj.common_funny) print "same_file:"+ str(dirobj.same_files) print "diff_files:"+ str(dirobj.diff_files) print "funny_files:"+ str(dirobj.funny_files)
三、探測Web服務質量方法—–pycurl模塊
pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能非常強大,支持的操作協議有FTP、HTTP、HTTPS、TELNET等,可以理解成Linux下curl命令功能的Python封裝,簡單易用。本節通過調用pycurl提供的方法,實現探測Web服務質量的情況,比如響應的HTTP狀態碼、請求延時、HTTP頭信息、下載速度等,利用這些信息可以定位服務響應慢的具體環節。
1.安裝
(要求curl-config包支持) # wget http://curl.haxx.se/download/curl-7.36.0.tar.gz # tar -zxvf curl-7.36.0.tar.gz # cd curl-7.36.0 # ./configure # make && make install # export LD_LIBRARY_PATH=/usr/local/lib # wget https://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.3.1.tar.gz --no-check-certificate # tar -zxvf pycurl-7.19.3.1.tar.gz # cd pycurl-7.19.3.1 # python setup.py install --curl-config=/usr/local/bin/curl-config 校驗安裝結果如下: >>> import pycurl >>> pycurl.version 'PycURL/7.19.3.1 libcurl/7.36.0 OpenSSL/1.0.1e zlib/1.2.3' 2.4.1
2.模塊常用方法說明
pycurl.Curl()類實現創建一個libcurl包的Curl句柄對象,無參數。更多關于libcurl包的介紹見http://curl.haxx.se/libcurl/c/libcurl-tutorial.html。下面介紹Curl對象幾個常用的方法。
·close()方法,對應libcurl包中的curl_easy_cleanup方法,無參數,實現關閉、回收Curl對象。
·perform()方法,對應libcurl包中的curl_easy_perform方法,無參數,實現Curl對象請求的提交。
·setopt(option,value)方法,對應libcurl包中的curl_easy_setopt方法,參數option是通過libcurl的常量來指定的,參數value的值會依賴option,可以是一個字符串、整型、長整型、文件對象、列表或函數等。下面列舉常用的常量列表:
c = pycurl.Curl() #創建一個curl對象 c.setopt(pycurl.CONNECTTIMEOUT, 5) #連接的等待時間,設置為0則不等待 c.setopt(pycurl.TIMEOUT, 5) #請求超時時間 c.setopt(pycurl.NOPROGRESS, 0) #是否屏蔽下載進度條,非0則屏蔽 c.setopt(pycurl.MAXREDIRS, 5) #指定HTTP重定向的最大數 c.setopt(pycurl.FORBID_REUSE, 1) #完成交互后強制斷開連接,不重用 c.setopt(pycurl.FRESH_CONNECT,1) #強制獲取新的連接,即替代緩存中的連接 c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #設置保存DNS信息的時間,默認為120秒 c.setopt(pycurl.URL,"http://www.baidu.com") #指定請求的URL c.setopt(pycurl.USERAGENT,"Mozilla/5.2 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50324)") #配置請求HTTP頭的User-Agent c.setopt(pycurl.HEADERFUNCTION, getheader) #將返回的HTTP HEADER定向到回調函數getheader c.setopt(pycurl.WRITEFUNCTION, getbody) #將返回的內容定向到回調函數getbody c.setopt(pycurl.WRITEHEADER, fileobj) #將返回的HTTP HEADER定向到fileobj文件對象 c.setopt(pycurl.WRITEDATA, fileobj) #將返回的HTML內容定向到fileobj文件對象 ·getinfo(option)方法,對應libcurl包中的curl_easy_getinfo方法,參數option是通過libcurl的常量來指定的。下面列舉常用的常量列表: c = pycurl.Curl() #創建一個curl對象 c.getinfo(pycurl.HTTP_CODE) #返回的HTTP狀態碼 c.getinfo(pycurl.TOTAL_TIME) #傳輸結束所消耗的總時間 c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS解析所消耗的時間 c.getinfo(pycurl.CONNECT_TIME) #建立連接所消耗的時間 c.getinfo(pycurl.PRETRANSFER_TIME) #從建立連接到準備傳輸所消耗的時間 c.getinfo(pycurl.STARTTRANSFER_TIME) #從建立連接到傳輸開始消耗的時間 c.getinfo(pycurl.REDIRECT_TIME) #重定向所消耗的時間 c.getinfo(pycurl.SIZE_UPLOAD) #上傳數據包大小 c.getinfo(pycurl.SIZE_DOWNLOAD) #下載數據包大小 c.getinfo(pycurl.SPEED_DOWNLOAD) #平均下載速度 c.getinfo(pycurl.SPEED_UPLOAD) #平均上傳速度 c.getinfo(pycurl.HEADER_SIZE) #HTTP頭部大小
HTTP服務是最流行的互聯網應用之一,服務質量的好壞關系到用戶體驗以及網站的運營服務水平,最常用的有兩個標準,一為服務的可用性,比如是否處于正常提供服務狀態,而不是出現404頁面未找到或500頁面錯誤等;二為服務的響應速度,比如靜態類文件下載時間都控制在毫秒級,動態CGI為秒級。本示例使用pycurl的setopt與getinfo方法實現HTTP服務質量的探測,獲取監控URL返回的HTTP狀態碼,HTTP狀態碼采用pycurl.HTTP_CODE常量得到,以及從HTTP請求到完成下載期間各環節的響應時間,通過pycurl.NAMELOOKUP_TIME、pycurl.CONNECT_TIME、pycurl.PRETRANSFER_TIME、pycurl.R等常量來實現。另外通過pycurl.WRITEHEADER、pycurl.WRITEDATA常量得到目標URL的HTTP響應頭部及頁面內容。實現源碼如下:【/home/test/pycurl/simple1.py】
# -*- coding: utf-8 -*- import os,sys import time import sys import pycurl URL="http://www.google.com.hk" #探測的目標URL c = pycurl.Curl() #創建一個Curl對象 c.setopt(pycurl.URL, URL) #定義請求的URL常量 c.setopt(pycurl.CONNECTTIMEOUT, 5) #定義請求連接的等待時間 c.setopt(pycurl.TIMEOUT, 5) #定義請求超時時間 c.setopt(pycurl.NOPROGRESS, 1) #屏蔽下載進度條 c.setopt(pycurl.FORBID_REUSE, 1) #完成交互后強制斷開連接,不重用 c.setopt(pycurl.MAXREDIRS, 1) #指定HTTP重定向的最大數為1 c.setopt(pycurl.DNS_CACHE_TIMEOUT,30) #設置保存DNS信息的時間為30秒 #創建一個文件對象,以”wb”方式打開,用來存儲返回的http頭部及頁面內容 indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt", "wb") c.setopt(pycurl.WRITEHEADER, indexfile) #將返回的HTTP HEADER定向到indexfile文件對象 c.setopt(pycurl.WRITEDATA, indexfile) #將返回的HTML內容定向到indexfile文件對象 try: ? ? c.perform() #提交請求 except Exception,e: ? ? print "connecion error:"+str(e) ? ? indexfile.close() ? ? c.close() ? ? sys.exit() NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME) #獲取DNS解析時間 CONNECT_TIME = c.getinfo(c.CONNECT_TIME) #獲取建立連接時間 PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME) #獲取從建立連接到準備傳輸所消耗的時間 STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME) #獲取從建立連接到傳輸開始消耗的時間 TOTAL_TIME = c.getinfo(c.TOTAL_TIME) #獲取傳輸的總時間 HTTP_CODE = c.getinfo(c.HTTP_CODE) #獲取HTTP狀態碼 SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD) #獲取下載數據包大小 HEADER_SIZE = c.getinfo(c.HEADER_SIZE) #獲取HTTP頭部大小 SPEED_DOWNLOAD=c.getinfo(c.SPEED_DOWNLOAD) #獲取平均下載速度 #打印輸出相關數據 print "HTTP狀態碼:%s" %(HTTP_CODE) print "DNS解析時間:%.2f ms"%(NAMELOOKUP_TIME*1000) print "建立連接時間:%.2f ms" %(CONNECT_TIME*1000) print "準備傳輸時間:%.2f ms" %(PRETRANSFER_TIME*1000) print "傳輸開始時間:%.2f ms" %(STARTTRANSFER_TIME*1000) print "傳輸結束總時間:%.2f ms" %(TOTAL_TIME*1000) print "下載數據包大?。?d bytes/s" %(SIZE_DOWNLOAD) print "HTTP頭部大?。?d byte" %(HEADER_SIZE) print "平均下載速度:%d bytes/s" %(SPEED_DOWNLOAD) #關閉文件及Curl對象 indexfile.close() c.close()
pycurl模塊的常用類與方法說明參考官網http://pycurl.sourceforge.net/doc/index.html。
原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/91122