一文解密Python進(jìn)行監(jiān)控進(jìn)程的黑科技
在計(jì)算機(jī)系統(tǒng)管理和應(yīng)用性能優(yōu)化中,監(jiān)控進(jìn)程的CPU、內(nèi)存和IO使用率是非常重要的任務(wù)。Python作為一種功能強(qiáng)大的編程語(yǔ)言,可以輕松地實(shí)現(xiàn)這些監(jiān)控任務(wù)。小編將介紹如何使用Python寫一個(gè)簡(jiǎn)單使用的監(jiān)控進(jìn)程的CPU、內(nèi)存和IO使用率的工具。
準(zhǔn)備工作
啥也不說(shuō),先裝庫(kù):psutil
是一個(gè)跨平臺(tái)用于獲取系統(tǒng)信息(包括進(jìn)程信息)的流行庫(kù);安裝命令:
pip install psutil
監(jiān)控CPU使用率
使用psutil
庫(kù)可以輕松地監(jiān)控進(jìn)程的CPU使用率。以下是一個(gè)示例代碼,演示了如何監(jiān)控一個(gè)指定進(jìn)程的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() # 替換為你要監(jiān)控的進(jìn)程ID monitoring_duration = 60 # 監(jiān)控持續(xù)時(shí)間(秒) monitor_cpu(target_process_id, monitoring_duration)
通過(guò)cpu_percent()
獲取進(jìn)程的CPU使用率,然后調(diào)整interval
參數(shù),控制采樣時(shí)間間隔,再加個(gè)循環(huán),就實(shí)現(xiàn)了不停獲取數(shù)據(jù)信息的小腳本,自己可以擴(kuò)展將結(jié)果寫入文件或者數(shù)據(jù)庫(kù)種用來(lái)持久化輸出了。
監(jiān)控內(nèi)存使用率
psutil
庫(kù)的memory_info()
方法可以獲取進(jìn)程的內(nèi)存占用,廢話不多說(shuō)上代碼:???????
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"內(nèi)存使用量: {memory_info.rss / (1024 * 1024):.2f} MB") print(f"內(nèi)存使用率: {memory_percent:.2f}%") time.sleep(1) if __name__ == "__main__": target_process_id = os.getpid() # 替換為你要監(jiān)控的進(jìn)程ID monitoring_duration = 60 # 監(jiān)控持續(xù)時(shí)間(秒) monitor_memory(target_process_id, monitoring_duration)
其中rss
屬性可以獲取實(shí)際使用物理內(nèi)存,memory_info()
獲取進(jìn)程的內(nèi)存信息,簡(jiǎn)短的代碼就實(shí)現(xiàn)了內(nèi)存監(jiān)控,可以自己適當(dāng)擴(kuò)展了。
監(jiān)控IO使用率
psutil
庫(kù)的io_counters()
方法可以監(jiān)控進(jìn)程的IO操作,廢話不多說(shuō),上代碼:???????
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"讀取字節(jié)數(shù): {io_counters.read_bytes}") # 要變成MB,需要除1024/1024 print(f"寫入字節(jié)數(shù): {io_counters.write_bytes}") time.sleep(1) if __name__ == "__main__": target_process_id = os.getpid() # 替換為你要監(jiān)控的進(jìn)程ID monitoring_duration = 60 # 監(jiān)控持續(xù)時(shí)間(秒) monitor_io(target_process_id, monitoring_duration)
io_counters()
方法返回了進(jìn)程的IO計(jì)數(shù)器信息,可以讀取和寫入的字節(jié)數(shù)。
小工具代碼整合
上面3個(gè)小函數(shù)已經(jīng)實(shí)現(xiàn)了監(jiān)控我門常規(guī)的信息了,現(xiàn)在我們的要求是要同時(shí)監(jiān)控,而不是監(jiān)控完這個(gè)再監(jiān)控那個(gè),對(duì)吧。so 小編使用異步編程來(lái)簡(jiǎn)單帶大伙玩一下,完整代碼如下:
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"讀取字節(jié)數(shù): {io_counters.read_bytes / 1024 / 1024} MB") print(f"寫入字節(jié)數(shù): {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"內(nèi)存使用量: {memory_info.rss / (1024 * 1024):.2f} MB") print(f"內(nèi)存使用率: {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("請(qǐng)輸入進(jìn)程ID:")) duration = int(input("請(qǐng)輸入監(jiān)控時(shí)長(zhǎng)(秒):")) 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())
到此這篇關(guān)于一文解密Python進(jìn)行監(jiān)控進(jìn)程的黑科技的文章就介紹到這了,更多相關(guān)Python監(jiān)控進(jìn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCharm Terminal終端命令行Shell設(shè)置方式
這篇文章主要介紹了PyCharm Terminal終端命令行Shell設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python?異步之如何啟動(dòng)獲取事件循環(huán)
這篇文章主要為大家介紹了Python?異步之如何啟動(dòng)獲取事件循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Pycharm使用爬蟲時(shí)遇到etree紅線問(wèn)題及解決
這篇文章主要介紹了Pycharm使用爬蟲時(shí)遇到etree紅線問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Python編程深度學(xué)習(xí)計(jì)算庫(kù)之numpy
今天小編就為大家分享一篇關(guān)于Python編程深度學(xué)習(xí)計(jì)算庫(kù)之numpy,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Python?echarts實(shí)現(xiàn)數(shù)據(jù)可視化實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Python?echarts實(shí)現(xiàn)數(shù)據(jù)可視化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03