Python自動化運維之psutil系統效能資訊模組
psutil(process and system utilities)程式和系統實用程式,是一個跨平臺的庫,用於檢索Python中正在執行的程式和系統利用率(CPU,記憶體,磁碟,網路,感測器)的資訊。 |
系統效能資訊模組
psutil
(process and system utilities)程式和系統實用程式,是一個跨平臺的庫,用於檢索Python中正在執行的程式和系統利用率(CPU,記憶體,磁碟,網路,感測器)的資訊。 它主要用於系統監視,概要分析和限制程式資源以及管理正在執行的程式。 它實現了經典UNIX
行工具提供的許多功能,例如ps,top,iotop,lsof,netstat,ifconfig,free等。 psutil當前支援以下平臺:
-
-
Windows
-
macOS
-
FreeBSD, OpenBSD , NetBSD
-
Sun Solaris
-
AIX
【注】本文章在 python3.6, 7.8,windows 10 下測試透過,windows下可能部分返回引數沒有
安裝
pip install psutil
獲取CPU資訊 統計cpu開銷時間
psutil.cpu_times()
返回系統CPU時間
-
user :在使用者模式下執行普通程式所花費的時間
-
system : 在核心模式下執行的程式所花費的時間
-
idle :空閒時間
-
nice :在使用者模式下執行完好的(優先順序)程式所花費的時間; 在Linux上,這還包括 guest_nice 時間
-
iowait : 等待I / O完成所花費的時間。
-
irq :服務硬體中斷所花費的時間
-
softirq : 服務軟體中斷所花費的時間
-
steal : 在虛擬環境中執行的其他作業系統所花費的時間
-
guest :在Linux核心控制下為來guest系統執行虛擬CPU所花費的時間
-
guest_nice :執行良好的guest所花費的時間
如需顯示所有CPU核心資訊,應顯示的指出
psutil.cpu_times(percpu=Ture)
,返回一個列表, 列表的第一個元素是指第一個CPU,第二個元素是指第二個CPU,依此類推,一般情況下只關注
user
,
system
,以及
idle
# Centos7.8 >>> import psutil >>> psutil.cpu_times() scputimes(user=56276.04, nice=6.9, system=46298.69, idle=7267935.28, iowait=1748.04, irq=0.0, softirq=288.37, steal=0.0, guest=0.0, guest_nice=0.0) # windows 10 >>> psutil.cpu_times(percpu=True) [scputimes(user=120708.328125, system=113197.0625, idle=926771.3593749999, interrupt=6374.4375, dpc=3362.828125), scputimes(user=104530.18749999999, system=87954.64062500012, idle=968191.6406249999, interrupt=1626.5625, dpc=281.8125), scputimes(user=127384.45312499999, system=110084.546875, idle=923207.453125, interrupt=1679.453125, dpc=336.640625), scputimes(user=110810.578125, system=82547.015625, idle=967318.875, interrupt=1359.25, dpc=262.21875)]
統計CPU利用率
psutil.cpu_percent(interval=None,percpu=False)
當interval> 0.0時,將比較該間隔前後的系統CPU時間(阻塞)。 當interval為0.0或無時,比較自上次呼叫或模組匯入以來經過的系統CPU時間,立即返回。 這意味著第一次呼叫它會返回一個無意義的0.0值,應該忽略它。 在這種情況下,為確保準確性,建議在兩次呼叫之間至少呼叫0.1秒。
# 每隔兩秒重新整理CPU使用率,累計8次 >>> for x in range(8): ... print(psutil.cpu_percent(interval=2, percpu=True)) [30.5, 17.8, 30.2, 24.6] [16.3, 20.2, 14.0, 14.0] [12.1, 3.9, 4.7, 3.9] [26.4, 16.3, 18.6, 16.3] [13.1, 9.3, 7.8, 10.1] [33.6, 40.3, 48.4, 34.4] [17.6, 8.5, 14.7, 7.8] [23.1, 7.8, 21.5, 8.5]
統計CPU核心數
# 預設統計CPU邏輯核心數 >>> psutil.cpu_count() # CPU邏輯核心數 4 >>> psutil.cpu_count(logical=False) # cpu物理核心數 2
CPU頻率
# 顯示當前cpu的主頻率 >>> psutil.cpu_freq() scpufreq(current=1876.0, min=0.0, max=1896.0)
負載
# 以元組的形式返回最近1、5和15分鐘內的平均系統負載。 在Windows上,這是透過使用Windows API模擬的,該API產生一個執行緒,該執行緒保持在後臺執行,並每5秒更新一次結果,從而模仿UNIX行為。 因此,在Windows上,第一次呼叫此方法,在接下來的5秒鐘內,它將返回無意義的(0.0,0.0,0.0)元組。 >>> psutil.getloadavg() (0.0, 0.01, 0.05)
獲取記憶體資訊
# windows 10 返回記憶體使用情況 >>> memory = psutil.virtual_memory() >>> memory svmem(total=8463876096, available=2596061184, percent=69.3, used=5867814912, free=2596061184) >>> memory.total 8463876096 # centos7.8 >>> psutil.virtual_memory() svmem(total=1927192576, available=1060913152, percent=45.0, used=693989376, free=103620608, active=1383866368, inactive=288067584, buffers=143511552, cached=986071040, shared=589824, slab=93745152)
返回的是單位是位元組Byte
重點關注的引數:
-
total=8463876096 總共8.46GB
-
available=2596061184 可用2.59GB
-
percent=69.3 使用率69.3%
-
used=5867814912 已使用5.86GB
獲取swap 記憶體資訊
# windows 10 >>> psutil.swap_memory() sswap(total=13326721024, used=9382895616, free=3943825408, percent=70.4, sin=0, sout=0)
獲取磁碟資訊 獲取磁碟分割槽資訊
In [35]: psutil.disk_partitions() Out[35]: [sdiskpart(device='/dev/vda1', mountpoint='/', fstype='ext4', opts='rw,relatime,data=ordered')]
獲取指定分割槽的使用情況
# centos 7.8 In [36]: psutil.disk_usage('/') Out[36]: sdiskusage(total=42140479488, used=12435881984, free=27755200512, percent=30.9) # windows 10 In [32]: psutil.disk_usage('C:\\') Out[32]: sdiskusage(total=125917933568, used=89807781888, free=36110151680, percent=71.3)
獲取硬碟的IO個數,讀寫資訊
# windows 10 In [37]: psutil.disk_io_counters() Out[37]: sdiskio(read_count=7703266, write_count=11199399, read_bytes=209586859008, write_bytes=217863440384, read_time=46821, write_time=5137) # 獲取單個分割槽的 io個數,讀寫資訊 In [38]: psutil.disk_io_counters(perdisk=True) Out[38]: {'PhysicalDrive0': sdiskio(read_count=980771, write_count=399173, read_bytes=39607087616, write_bytes=8268857344, read_time=38514, write_time=1396), 'PhysicalDrive1': sdiskio(read_count=6723984, write_count=10805960, read_bytes=169995229696, write_bytes=209674449408, read_time=8309, write_time=3743)}
獲取網路資訊 獲取網路讀寫位元組/包的個數
# windows 10 In [39]: psutil.net_io_counters() Out[39]: snetio(bytes_sent=45955043, bytes_recv=736052740, packets_sent=383832, packets_recv=589165, errin=0, errout=0, dropin=0, dropout=0) # windows 10 輸出每個網路介面的IO資訊 In [40]: psutil.net_io_counters(pernic=True) Out[40]: {'Ethernet': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'Local Area Connection* 11': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ......}
獲取系統範圍的套接字連線
# inet 代表 IPv4 and IPv6 In [42]: psutil.net_connections(kind='inet') Out[42]: [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254), pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987), pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=60759), raddr=addr(ip='72.14.234.104', port=80), status='ESTABLISHED', pid=None), pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=51314), raddr=addr(ip='72.14.234.83', port=443), status='SYN_SENT', pid=None) ...]
獲取網路介面資訊
>>> psutil.net_if_addrs() {'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)], 'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]} >>>
獲取網路介面狀態
>>> psutil.net_if_stats() {'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500), 'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536)}
獲取使用者資訊
>>> psutil.users() [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352), suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]
獲取開機時間
In [49]: import datetime # 獲取系統開機時間,以Linux時間戳格式返回 In [50]: psutil.boot_time() Out[50]: 1595251273.0 # 轉換為人可讀的方式 In [51]: datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") Out[51]: '2020-07-20 21:21:13'
獲取程式資訊 獲取所有程式資訊
# 獲取所有程式pid In [52]: psutil.pids() Out[52]: [1, 2, 4, ...] # 例項化一個Process物件,引數為程式PID In [2]: p = psutil.Process(4313) In [3]: p Out[3]: psutil.Process(pid=4313, name='ipython', status='running', started='21:23:58') # 程式bin路徑 In [4]: p.exe() Out[4]: '/usr/bin/python3.6' # 程式工作目錄絕對路徑 In [5]: p.cwd() Out[5]: '/root' # 程式號 In [7]: p.pid Out[7]: 4313 # 父程式號 In [8]: p.ppid() Out[8]: 4139 # 程式狀態 In [11]: p.status() Out[11]: 'running' # 程式 rss,vms資訊 In [19]: p.memory_info() Out[19]: pmem(rss=44388352, vms=347344896, shared=5902336, text=4096, lib=0, data=113049600, dirty=0) # 程式記憶體利用率 In [20]: p.memory_percent() Out[20]: 2.303264995557974
Linux | Windows | macOS |
---|---|---|
| ||
|
||
|
||
|
||
|
||
|
|
|
|
| |
|
| |
speedup: +2.6x | speedup: +1.8x / +6.5x |
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2730709/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python筆記之psutil模組(自動化運維利器psutil玩轉系統監控及管理)Python筆記運維
- Python自動化運維之IPy模組Python運維
- python中系統資訊模組--psutilPython
- 自動化運維工具之Puppet模組運維
- 運維自動化之賬單系統運維
- Python獲取系統資訊模組psutil(轉載)Python
- IT運維之自動化運維運維
- Python系統效能資訊模組psutil安裝報錯解決一例Python
- 半自動化運維之伺服器資訊維護運維伺服器
- 什麼是自動化運維?為什麼選擇Python做自動化運維?運維Python
- 自動化運維之puppet的學習(如何找到你需要的模組)運維
- [Linux]Ansible自動化運維② - 工具與模組Linux運維
- MySQL自動化運維之安裝篇MySql運維
- 自動化運維 Expect運維
- 用自動化運維工具解放IT運維運維
- 運維自動化之使用PHP+MYSQL+SHELL打造私有監控系統(七)運維PHPMySql
- Oracle 自動化運維-Python連線OracleOracle運維Python
- python自動化運維之多執行緒Python運維執行緒
- 自動化運維-Python paramiko 實現無客戶端系統巡檢運維Python客戶端
- 運維效率之資料遷移自動化運維
- 自動化運維 Ansible運維
- 運維自動化之基於python語言的文字介面的運維管理軟體薦運維Python
- Python+Django+Ansible Playbook自動化運維PythonDjango運維
- Python自動化運維之高階函式薦Python運維函式
- 自動化運維工具之Puppet常用資源(一)運維
- 自動化運維工具之Puppet常用資源(二)運維
- 自動化運維工具之Puppet基礎入門運維
- 品運維自動化之cobbler的安裝序運維
- mysql-inception自動化運維MySql運維
- Ansible自動化運維工具運維
- 效能優化——統計資訊——SQLServer自動更新和自動建立統計資訊選項 (轉載)優化SQLServer
- 簡化IT運維工作,就要學會使用自動化運維工具!運維
- 簡單介紹python自動化運維常用庫Python運維
- 半自動化運維之動態新增資料檔案(一)運維
- 半自動化運維之動態新增資料檔案(二)運維
- Cobbler自動化批量安裝Linux作業系統 - 運維總結Linux作業系統運維
- psutil獲取作業系統負載資訊作業系統負載
- CrazyWing:Python自動化運維開發實戰 十七、PythonPython運維