1. 程式人生 > 程式設計 >Python監控伺服器實用工具psutil使用解析

Python監控伺服器實用工具psutil使用解析

這篇文章主要介紹了Python監控伺服器實用工具psutil使用解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

伺服器的監控通過安裝一些常用的監控軟體之外,有時也需要執行一些shell或Python指令碼;shell下可以使用系統自帶的ps/free/top/df等shell命令,Python可以呼叫subprocess等模組來執行shell命令,不過這麼做就比較麻煩。這裡有一個比較好用的第三方模組:psutil。

psutil是一個跨平臺的庫,用於在Python中檢索有關執行程序和系統利用率(CPU,記憶體,磁碟,網路,感測器)的資訊。它主要用於系統監視,分析,限制程序資源和執行程序的管理。它實現了UNIX命令列工具提供的許多功能,例如:ps,top,lsof,netstat,ifconfig,who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。 psutil目前支援以下平臺:

  • Linux
  • Windows
  • OSX,
  • FreeBSD,OpenBSD,NetBSD
  • Sun Solaris
  • AIX

...

等裝有Python2.6至3.6的32-bit和64-bit架構. 也可以在PyPy上執行。

安裝

文中示例均在Python版本3.6環境下執行;

# pip3 install psutil

常用模組

獲取psutil版本資訊

In [1]: import psutil
In [2]: psutil.version_info
Out[2]: (5,4,3

獲取CPU資訊

In [3]: psutil.cpu_count() # 邏輯CPU核數
Out[3]: 4
In [4]: psutil.cpu_count(logical=False) # 物理CPU核數
Out[4]: 2
In [5]: psutil.cpu_times() # CPU的使用者、系統、空閒時間
Out[5]: scputimes(user=240773.0,nice=0.0,system=96416.32,idle=1161930.41)
In [9]: psutil.cpu_percent(percpu=True) # 獲取每個CPU的使用率,類似TOP命令
Out[9]: [43.3,22.0,42.0,23.0]
In [10]: top = [psutil.cpu_percent(interval=i,percpu=True) for i in range(10)] #設定每秒重新整理時間間隔,統計十次的結果
In [11]: top
Out[11]:
[[40.8,19.7,38.5,20.7],[25.7,5.9,13.0,5.0],[35.0,15.6,30.0,14.4],[23.7,7.0,18.3,7.4],[38.5,17.0,34.2,17.5],[37.2,19.6,36.3,20.0],[29.6,16.6,28.8,16.8],[37.7,19.0,35.4,18.7],[30.8,16.3,26.9,16.5],[44.2,27.9,41.5,28.6]]

獲取記憶體資訊

In [13]: psutil.virtual_memory() #獲取記憶體統計資料,單位bytes,我這裡8G記憶體
Out[13]: svmem(total=8589934592,available=1891045376,percent=78.0,used=6053986304,free=15130624,active=1878392832,inactive=1875914752,wired=2299678720)
In [14]: psutil.swap_memory() # 獲取swap的統計資料
Out[14]: sswap(total=2147483648,used=1340866560,free=806617088,percent=62.4,sin=126090076160,sout=3524710400)

獲取磁碟資訊

In [17]: psutil.disk_partitions() #獲取磁碟分割槽資訊
Out[17]: [sdiskpart(device='/dev/disk1',mountpoint='/',fstype='hfs',opts='rw,local,rootfs,dovolfs,journaled,multilabel')]
In [20]: psutil.disk_usage('/') # 獲取分割槽使用情況,這裡使用了25.4%
Out[20]: sdiskusage(total=499055067136,used=126482944000,free=372309979136,percent=25.4)
In [22]: psutil.disk_io_counters() #磁碟IO情況
Out[22]: sdiskio(read_count=7364142,write_count=6510641,read_bytes=282106464256,write_bytes=261763244544,read_time=2608778,write_time=1095259)

獲取網路資訊

In [23]: psutil.net_if_stats() # 獲取網絡卡介面狀態
Out[23]:
{'awdl0': snicstats(isup=True,duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>,speed=0,mtu=1484),'bridge0': snicstats(isup=True,mtu=1500),'en0': snicstats(isup=True,'en1': snicstats(isup=True,duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>,'en2': snicstats(isup=True,'gif0': snicstats(isup=False,mtu=1280),'lo0': snicstats(isup=True,mtu=16384),'p2p0': snicstats(isup=True,mtu=2304),'stf0': snicstats(isup=False,'utun0': snicstats(isup=True,mtu=2000),'utun1': snicstats(isup=True,mtu=1352)}
In [25]: psutil.net_if_stats().get("en0") #獲取單個網絡卡en0的狀態
Out[25]: snicstats(isup=True,mtu=1500)
In [26]: psutil.net_if_addrs() # 獲取所有網絡卡的地址資訊
Out[26]:
{'awdl0': [snic(family=<AddressFamily.AF_LINK: 18>,address='36:7d:f3:80:6e:4e',netmask=None,broadcast=None,ptp=None),snic(family=<AddressFamily.AF_INET6: 30>,address='fe80::347d:f3ff:fe80:6e4e%awdl0',netmask='ffff:ffff:ffff:ffff::',ptp=None)],'bridge0': [snic(family=<AddressFamily.AF_LINK: 18>,address='4a:00:02:c0:33:70','en0': [snic(family=<AddressFamily.AF_INET: 2>,address='192.168.0.101',netmask='255.255.255.0',broadcast='192.168.0.255',snic(family=<AddressFamily.AF_LINK: 18>,address='ac:bc:32:91:32:8b',address='fe80::1476:ce7e:210a:2e32%en0','en1': [snic(family=<AddressFamily.AF_LINK: 18>,'en2': [snic(family=<AddressFamily.AF_LINK: 18>,address='4a:00:02:c0:33:71','lo0': [snic(family=<AddressFamily.AF_INET: 2>,address='127.0.0.1',netmask='255.0.0.0',address='::1',netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',address='fe80::1%lo0','p2p0': [snic(family=<AddressFamily.AF_LINK: 18>,address='0e:bc:32:91:32:8b','utun0': [snic(family=<AddressFamily.AF_INET6: 30>,address='fe80::583c:77a0:6b93:b045%utun0','utun1': [snic(family=<AddressFamily.AF_INET: 2>,address='10.5.200.244',ptp='10.5.200.244')]}
# 獲取en0網絡卡的地址, 這裡包括mac和ipv6地址
In [40]: for addr in psutil.net_if_addrs().get("en0"):
...: print(addr.address)
192.168.0.101
ac:bc:32:91:32:8b
fe80::1476:ce7e:210a:2e32%en0
In [43]: psutil.net_io_counters() # 獲取網路讀寫位元組/包的個數
Out[43]: snetio(bytes_sent=174614221,bytes_recv=586279725,packets_sent=863903,packets_recv=873583,errin=0,errout=0,dropin=0,dropout=0)
In [45]: psutil.net_connections() # 獲取網路連線資訊,注意這裡需要root許可權。

獲取程序資訊:

In [46]: psutil.pids() # 獲取所有程序ID
In [47]: psutil.Process(61) # 獲取指定PID的程序資訊
Out[47]: psutil.Process(pid=61,name='dsAccessService',started='2018-02-26 09:57:04')
In [49]: psutil.Process(45573).exe() # 獲取程序的exe路徑
Out[49]: '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python'
In [50]: psutil.Process(45573).name() # 獲取程序名稱
Out[50]: 'Python'
In [52]: psutil.Process(45573).cmdline() # 獲取程序啟動的命令
Out[52]:
['/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python','/usr/local/bin/ptipython']
In [56]: psutil.Process(45573).num_threads() # 獲取程序的執行緒數量
Out[56]: 3
In [57]: psutil.Process(45573).environ() # 獲取程序的環境變數資訊

總結:

使用psutil模組可以做到比較全面的對系統的監控,如果你正在考慮用Python做一個監控系統或者指令碼工具,可以有些考慮此模組。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。