python psutil模塊的使用


雖然也可以查看api文檔,但是也轉過來。

原文地址:https://blog.csdn.net/cpongo5/article/details/88820174

psutil (python system and process utilities) 是一個跨平台的第三方庫,能夠輕松實現獲取系統運行的進程和系統利用率(包擴CPU、內存、磁盤、網絡等)信息。它主要用於系統監控、分析、限制系統資源和進程的管理。它實現了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持的操作系統包括:Linux,Windows,macOS,,AIX等等。同時支持python2與python3版本,當前最新版本為5.4.8。

1. psutil的安裝
1
pip install psutil
2. psutil獲取系統性能信息之CPU
2.1. cpu_times CPU運行時間
psutil.cpu_times(percpu = False )將每個特定狀態下CPU運行的時間以元組的形式返回。

CPU運行狀態 解釋
user 進程執行用戶態代碼耗費的CPU時間。
nice 在優先級高的用戶級別執行時CPU占用率的百分比。
system 內核執行系統調用所使用的CPU時間。
idle CPU空閑並且系統沒有未完成的磁盤I / O請求的時間百分比。
iowait CPU等待I/O輸入輸出的時間
irq CPU用於維護硬件中斷所花費的時間百分比。
softirq CPU用於服務軟件中斷所花費的時間百分比。
steal 在虛擬化環境中運行的其他操作系統所花費的時間
guest CPU用於運行虛擬處理器的時間百分比。
dpc 服務延遲過程調用所花費的時間
interrupt 服務硬件中斷所花費的時間
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## ubuntu系統
### 獲取CPU運行的時間信息

>>> import psutil
>>> psutil.cpu_times()
scputimes(user=42.85, nice=4.64, system=40.27, idle=4864.93, iowait=5.94, irq=0.0, softirq=2.16, steal=0.0, guest=0.0, guest_nice=0.0)


### 獲取每個邏輯CPU的信息

>>> psutil.cpu_times(percpu=True)
[scputimes(user=13.2, nice=1.74, system=13.84, idle=2712.55, iowait=1.62, irq=0.0, softirq=0.57, steal=0.0, guest=0.0, guest_nice=0.0),
scputimes(user=10.48, nice=0.87, system=10.49, idle=2719.36, iowait=1.45, irq=0.0, softirq=0.21, steal=0.0, guest=0.0, guest_nice=0.0),
scputimes(user=12.4, nice=1.36, system=10.22, idle=2721.21, iowait=1.37, irq=0.0, softirq=0.7, steal=0.0, guest=0.0, guest_nice=0.0),
scputimes(user=11.28, nice=0.65, system=9.2, idle=2723.23, iowait=1.5, irq=0.0, softirq=0.83, steal=0.0, guest=0.0, guest_nice=0.0)]

## windows操作系統

>>> psutil.cpu_times()
scputimes(user=10006.453125, system=5947.421875, idle=155528.3125, interrupt=209.296875, dpc=187.203125)
2.2. cpu_percent cpu利用率
psutil.cpu_percent(interval = None,percpu = False )返回一個浮點數,表示當前系統范圍的CPU利用率百分比。如果interval=0.1,表示0.1sCPU的平均使用率。如果interval=0或者None時,比較自上次調用或模塊導入后經過的系統CPU時間,立即返回。所有第一次的返回的數據是個無意義的數據。當percpu是True返回表示利用率的浮點數列表,以每個邏輯CPU的百分比表示。

1
2
3
4
5
6
7
8
9
10
11
#與上次調用經過時間內的cpu的使用率
>>> psutil.cpu_percent()
1.3

#當前1s內cpu的使用率
>>> psutil.cpu_percent(interval=1)
0.3

## 4個邏輯cpu的使用率
>>> psutil.cpu_percent(interval=1,percpu=True)
[1.0, 1.0, 0.0, 0.0]
2.3. cpu_times_percent 特定CPU狀態的利用率
psutil.cpu_times(percpu=True)提供每個特定CPU時間的利用率百分比 。 interval和 percpu參數的含義與icpu_percent()中的含義相同。

1
2
>>> psutil.cpu_times_percent(interval=1 )
scputimes(user=0.0, nice=0.0, system=0.5, idle=99.5, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
2.4. cpu_count CPU的數量
psutil.cpu_count()返回系統中邏輯CPU的物理個數或者邏輯個數。

1
2
3
4
5
6
7
8
9
10
##windows操作系統 VM虛擬機雙核為2個單核處理器
### 邏輯cpu個數
>>> psutil.cpu_count()
8
### 物理cpu個數
>>> psutil.cpu_count(logical=False)
4
### 當前可用cpu個數
>>> len(psutil.Process().cpu_affinity())
8
2.5. cpu_stats CPU 統計信息
cpu_stats() 將各種CPU統計信息作以元組形式返回。

CPU信息 解釋
ctx_switches 啟動后的上下文切換次數
interrupts 自引導以來的中斷數
soft_interrupts 自引導以來的軟件中斷次數
syscalls 自引導以來的系統調用次數
1
2
3
4
5
6
7
8
## ubuntu系統

>>> psutil.cpu_stats()
scpustats(ctx_switches=4589481, interrupts=2532478, soft_interrupts=719197, syscalls=0)

## windows系統
>>> psutil.cpu_stats()
scpustats(ctx_switches=344724592, interrupts=270222602, soft_interrupts=0, syscalls=1234130591)
2.6. cpu_freq CPU頻率
psutil.cpu_freq(percpu = False )將CPU頻率作為名稱包返回,包括 以Mhz表示的當前,最小和最大頻率。如果percpu是True並且系統支持每CPU頻率檢索,則為每個CPU返回一個頻率列表,否則返回包含單個元素的列表(僅支持linux系統)。如果無法確定最小值和最大值,則將它們設置為0。在Linux 當前頻率上報告實時值,在所有其他平台上它代表最大值。

1
2
3
4
5
6
7
8
9
10
11
## windows系統

>>> psutil.cpu_freq()
scpufreq(current=2594.0, min=0.0, max=2594.0)
>>> psutil.cpu_freq(percpu=False)
scpufreq(current=2594.0, min=0.0, max=2594.0)


wmic:root\cli>cpu list brief
DeviceID Manufacturer MaxClockSpeed
CPU0 GenuineIntel 2594
3 psutil獲取系統性能信息之內存
3.1. virtual_memory() 物理內存使用情況
內存信息 解釋
total 總物理內存
available 在沒有系統進入SWAP下立即提供的內存。
percent 使用內存占比
used 使用的物理內存
free 沒有使用的物理內存
active 當前正在使用或最近使用的物理內存
inactive 標記未使用的內存
buffers buffers使用的緩存
cached ccached使用的緩存
shared 顯示被共享使用的物理內存大小
slab 內核數據結構緩存
1
2
3
4
5
6
7
8
9
#windows

>>> psutil.virtual_memory()
svmem(total=8473522176, available=1940721664, percent=77.1, used=6532800512, free=1940721664)

#Linux

>>> psutil.virtual_memory()
svmem(total=2070257664, available=777777152, percent=62.4, used=1090142208, free=80498688, active=1195728896, inactive=459780096, buffers=164036608, cached=735580160, shared=10145792, slab=221949952)
3.2. swap_memory() 交換內存使用情況
1
2
3
4
5
6
7
8
9
10
11
#Windows上的sin和sout總是設置為0

>>> psutil.swap_memory()
sswap(total=10151243776, used=7573495808, free=2577747968, percent=74.6, sin=0, sout=0)

#Linux
# sin:系統從磁盤累計換入的字節數
#sout:系統從磁盤累計換出的字節數

>>> psutil.swap_memory()
sswap(total=2144333824, used=7090176, free=2137243648, percent=0.3, sin=0, sout=6705152)
4 psutil獲取系統性能信息之此磁盤
4.1. disk_partitions 獲取所有磁盤信息
1
2
3
4
5
6
7
8
9
10
11
12
#windows

>>> from psutil import *
>>> disk_partitions()
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), #固態硬盤
sdiskpart(device='D:\\', mountpoint='D:\\', fstype='FAT32', opts='rw,removable'), #U盤
sdiskpart(device='E:\\', mountpoint='E:\\', fstype='', opts='cdrom')] #光盤

#Linux

>>> psutil.disk_partitions()
[sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,relatime,errors=remount-ro')]
4.2. disk_usage 獲取單個磁盤信息
1
2
3
4
5
6
7
8
9
10
11
12
# windows

>>> disk_usage('C:\\')
sdiskusage(total=126491697152, used=86524149760, free=39967547392, percent=68.4)
>>> disk_usage('D:\\')
sdiskusage(total=134184173568, used=1953497088, free=132230676480, percent=1.5)
>>> disk_usage('E:\\')
PermissionError: [WinError 21] 設備未就緒。

# linux
>>> psutil.disk_usage("/dev/sda1")
sdiskusage(total=1016070144, used=0, free=1016070144, percent=0.0)
4.3. psutil.disk_io_counters 獲取IO信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#如果perdisk為True系統上安裝的每個物理磁盤返回信息

# widows

>>> disk_io_counters()
sdiskio(read_count=870403, write_count=665904, read_bytes=36953495552, write_bytes=20282217984, read_time=1565, write_time=871)

#linux

>>> psutil.disk_io_counters()
sdiskio(read_count=53366, #讀取次數
write_count=9803, #寫入次數
read_bytes=709110784, #讀取字節數
write_bytes=417996800, #寫入字節數
read_time=29572, #讀取時間
write_time=4656, #寫入時間
read_merged_count=1034, #合並讀取的次數
write_merged_count=10158,#合並寫入的次數
busy_time=17792 #實際做I/0操作的時間
)
5 psutil獲取系統性能信息之網絡
5.1. psutil.net_connections 獲取網絡套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
#windows
>>> net_connections()
[sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, type=1, laddr=addr(ip='::', port=1536), raddr=(), status='LISTEN', pid=724),
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=2, laddr=addr(ip='::1', port=5353), raddr=(), status='NONE', pid=4208),
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=2, laddr=addr(ip='0.0.0.0', port=58044), raddr=(), status='NONE', pid=14420),
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=1, laddr=addr(ip='127.0.0.1', port=36600), raddr=(), status='LISTEN', pid=6116),
sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, type=1, laddr=addr(ip='::1', port=26672), raddr=addr(ip='::1', port=35432))]


#Linux

>>> psutil.net_connections()
[sconn(fd=6, family=2, type=2, laddr=addr(ip='0.0.0.0', port=68), raddr=(), status='NONE', pid=652)]
5.2. psutil.net_if_addrs 獲取網卡的信息
1
2
3
4
5
6
7
8
9
10
11
# windows

>>> net_if_addrs()
{'VMware Network Adapter VMnet1': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='00-50-56-C0-00-01', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.153.1', netmask='255.255.255.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::4192:c5d1:8fff:98c6', netmask=None, broadcast=None, ptp=None)],
'VMware Network Adapter VMnet8': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='00-50-56-C0-00-08', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.78.1', netmask='255.255.255.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::40d2:696a:cacb:8388', netmask=None, broadcast=None, ptp=None)],
'Loopback Pseudo-Interface 1': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='::1', netmask=None, broadcast=None, ptp=None)]}

#linux
>>> psutil.net_if_addrs()
{'lo': [snicaddr(family=2, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snicaddr(family=10, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=17, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)],
'eth0': [snicaddr(family=2, address='192.168.78.139', netmask='255.255.255.0', broadcast='192.168.78.255', ptp=None), snicaddr(family=10, address='fe80::20c:29ff:fef4:4e44%eth0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=17, address='00:0c:29:f4:4e:44', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
5.3. psutil.net_if_stats 獲取網絡接口的狀態
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# windows

>>> net_if_stats()
{'以太網': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500),
'VMware Network Adapter VMnet1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500),
'VMware Network Adapter VMnet8': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500),
'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500),
'WLAN': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
'本地連接* 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
'本地連接* 1': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500)}
>>>

# Linux

>>> psutil.net_if_stats()
{'lo': snicstats(isup=True, duplex=0, speed=0, mtu=65536), 'eth0': snicstats(isup=True, duplex=2, speed=1000, mtu=1500)}
5.4. psutil.net_io_counters 獲取網口的流量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# psutil.net_io_counters(pernic = False) 如果pernic為True系統上安裝的每個網絡接口返回信息。
# windows

>>> net_io_counters()
snetio(bytes_sent=176300623, #發送字節
bytes_recv=402338143, #接受字節
packets_sent=2509858, #發送包數
packets_recv=713322, #接受包數
errin=0, #接受錯誤數
errout=0, #發送錯誤數
dropin=0, #丟棄傳入數據包數量
dropout=0) #丟棄傳出數據包數量


# Linux
>>> psutil.net_io_counters()
snetio(bytes_sent=83801, bytes_recv=31649461, packets_sent=1277, packets_recv=21180, errin=0, errout=0, dropin=0, dropout=0)
6 psutil獲取系統性能信息之其他
6.1. 獲取開機時間
1
2
3
>>>import datetime,psutil
>>>datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
'2018-11-09 15:01:10'
6.2. 獲取當前用戶
1
2
>>> psutil.users()
[suser(name='root', terminal=None, host='0.4.0.0', started=1541862557.0, pid=None)]
6.3. 獲取PID
1
2
>>> psutil.pids()
[0, 4, 120, 404, 592, 724, 796, 816, 936, 964, 972, 344, 496, 1180, 1336, 1508, 1540, 1568, 1592, 1644, 1696, 1720]
6.4. 獲取進程信息
1
2
3
4
5
6
>>> for x in psutil.process_iter():
... print(x)
...
psutil.Process(pid=592, name='csrss.exe', started='2018-11-09 15:01:18')
psutil.Process(pid=724, name='wininit.exe', started='2018-11-09 15:01:24')
psutil.Process(pid=736, name='svchost.exe', started='2018-11-10 17:20:13')

---------------------
版權聲明:本文為CSDN博主「堅持669」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/cpongo5/article/details/88820174


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM