解密Python監控進程的黑科技:CPU、內存、IO使用率一目了然!
在計算機系統管理和應用性能優化中,監控進程的CPU、內存和IO使用率是非常重要的任務。Python作為一種功能強大的編程語言,可以輕松地實現這些監控任務。勇哥將介紹如何使用Python寫一個簡單使用的監控進程的CPU、內存和IO使用率的工具。
準備工作
啥也不說,先裝庫:psutil是一個跨平臺用于獲取系統信息(包括進程信息)的流行庫;安裝命令:
pip install psutil
監控CPU使用率
使用psutil庫可以輕松地監控進程的CPU使用率。以下是一個示例代碼,演示了如何監控一個指定進程的CPU使用率:
import psutil
import os
import time
def monitor_cpu(process_id, duration):
process = psutil.Process(process_id)
start_time = time.time()
while time.time() - start_time < duration:
cpu_percent = process.cpu_percent(interval=1)
print(f"CPU 使用率: {cpu_percent}%")
if __name__ == "__main__":
target_process_id = os.getpid() # 替換為你要監控的進程ID
monitoring_duration = 60 # 監控持續時間(秒)
monitor_cpu(target_process_id, monitoring_duration)
通過cpu_percent() 獲取進程的CPU使用率,然后調整interval參數,控制采樣時間間隔,再加個循環,就實現了不停獲取數據信息的小腳本,自己可以擴展將結果寫入文件或者數據庫種用來持久化輸出了。
監控內存使用率
psutil庫的memory_info()方法可以獲取進程的內存占用,廢話不多說上代碼:
import psutil
import os
import time
def monitor_memory(process_id, duration):
process = psutil.Process(process_id)
start_time = time.time()
while time.time() - start_time < duration:
memory_info = process.memory_info()
memory_percent = process.memory_percent()
print(f"內存使用量: {memory_info.rss / (1024 * 1024):.2f} MB")
print(f"內存使用率: {memory_percent:.2f}%")
time.sleep(1)
if __name__ == "__main__":
target_process_id = os.getpid() # 替換為你要監控的進程ID
monitoring_duration = 60 # 監控持續時間(秒)
其中rss屬性可以獲取實際使用物理內存,memory_info() 獲取進程的內存信息,簡短的代碼就實現了內存監控,可以自己適當擴展了。
監控IO使用率
psutil庫的io_counters()方法可以監控進程的IO操作,廢話不多說,上代碼:
import psutil
import os
import time
def monitor_io(process_id, duration):
process = psutil.Process(process_id)
start_time = time.time()
while time.time() - start_time < duration:
io_counters = process.io_counters()
print(f"讀取字節數: {io_counters.read_bytes}") # 要變成MB,需要除1024/1024
print(f"寫入字節數: {io_counters.write_bytes}")
time.sleep(1)
if __name__ == "__main__":
target_process_id = os.getpid() # 替換為你要監控的進程ID
monitoring_duration = 60 # 監控持續時間(秒)
monitor_io(target_process_id, monitoring_duration)
io_counters()方法返回了進程的IO計數器信息,可以讀取和寫入的字節數。
小工具代碼整合 上面3個小函數已經實現了監控我門常規的信息了,現在我們的要求是要同時監控,而不是監控完這個再監控那個,對吧。so 勇哥使用異步編程來簡單帶大伙玩一下,完整代碼如下:
import asyncio
import time
import psutil
async def monitor_io(process_id, duration):
process = psutil.Process(process_id)
start_time = time.time()
while time.time() - start_time < duration:
io_counters = process.io_counters()
print(f"讀取字節數: {io_counters.read_bytes / 1024 / 1024} MB")
print(f"寫入字節數: {io_counters.write_bytes / 1024 / 1024} MB")
await asyncio.sleep(1)
async def monitor_memory(process_id, duration):
process = psutil.Process(process_id)
start_time = time.time()
while time.time() - start_time < duration:
memory_info = process.memory_info()
memory_percent = process.memory_percent()
print(f"內存使用量: {memory_info.rss / (1024 * 1024):.2f} MB")
print(f"內存使用率: {memory_percent:.2f}%")
await asyncio.sleep(1)
async def monitor_cpu(process_id, duration):
process = psutil.Process(process_id)
start_time = time.time()
while time.time() - start_time < duration:
cpu_percent = process.cpu_percent(interval=1)
print(f"CPU 使用率: {cpu_percent}%")
await asyncio.sleep(1)
async def main():
process_id = int(input("請輸入進程ID:"))
duration = int(input("請輸入監控時長(秒):"))
tasks = [
monitor_io(process_id, duration),
monitor_memory(process_id, duration),
monitor_cpu(process_id, duration)
]
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())