Python获取磁盘使用信息,python获取GPU信息,python根据进程号获取进程信息,pynvml 获取GPU信息,psutil 获取进程信息,系统信息等
一、工具:psutil模塊
psutil是一個跨平臺模塊,試用相應方法可以直接獲取計算機CPU,內存,磁盤,網絡等資源使用情況;可以使用我們學習知識與這模塊用來做系統監控,性能分析;如果大家熟悉Linux系統,它能夠實現ps、top、lsof、netstat、df等命令功能。
1.1、psutil安裝:
psutil是第三方模塊,使用時候需要要安裝,相關說明鏈接地址:
https://pypi.org/project/psutil/?;
pip安裝方式:
pip install psutil驗證:
#導入模塊import psutil#查看版本信息psutil.version_info輸出信息:
(5, 4, 8)這里說明安裝成功(版本可能會不同,但是不影響使用);
1.2 獲取CPU信息
使用下面這些方法可以獲取計算機CPU數量,CPU使用率:
| cpu_count(logical=True) | 獲取CPU數量 |
| cpu_times(percpu=False) | 獲取不同狀態下CPU運行時間 |
| cpu_percent(interval=None, percpu=False) | 獲取CPU使用率 |
| cpu_times_percent(interval=None, percpu=False) | 獲取CPU各狀態占百分比 |
兩個個知識點需要簡單介紹下,這里只需要了解即可:
1)CPU數量:CPU分為物理CPU與邏輯CPU,之間關系如下:
1>物理CPU:計算機實際CPU數量,一般個人電腦1個;
2>核數:現在CPU基本都是多核,比如雙核,4核;
3>邏輯CPU:物理CPU*核數*超線程數
2)CPU運行狀態分為用戶態與內核態;
1>用戶態是指程序在內存運行,不直接訪問硬件資源;
2>用戶需要訪問硬件資源,需要系統調用,這部分有操作系統(內核)完成,稱為內核態,例如:讀寫文件,網絡數據收發,鍵盤事件獲取等;
下面我們來實際操作下(windows環境):
import psutil#獲取CPU不同狀態運行時間print(psutil.cpu_times())print('CPU 執行用戶進程時間:', psutil.cpu_times().user)print('CPU 執行系統調用時間:', psutil.cpu_times().system)print('CPU 空閑等待 時間:', psutil.cpu_times().idle)print('CPU 響應中斷 時間:', psutil.cpu_times().interrupt)#CPU使用率:不加參數為上一次調用到現在使用率print('CPU 使用率:',psutil.cpu_percent())#3秒內CPU使用率print('CPU 3秒內使用率:',psutil.cpu_percent(interval=3))#3秒內每個CPU使用率print('每個邏輯CPU使用率:',psutil.cpu_percent( percpu = True))#CPU各個狀態使用情況(百分比)print('CPU 各個狀態使用情況:',psutil.cpu_times_percent())#每個CPU各個狀態使用情況print('各個CPU 各個狀態使用情況:')cpuinfos = psutil.cpu_times_percent(percpu = True)for info in cpuinfos:print(info)運行結果如下:
scputimes(user=85326.484375, system=56630.8125, idle=2245745.0625, interrupt=5347.296875, dpc=1395.984375)CPU 執行用戶進程時間: 85326.484375CPU 執行系統調用時間: 56630.8125CPU 空閑等待 時間: 2245745.0625CPU 響應中斷 時間: 5347.296875CPU 使用率: 3.4CPU 3秒內使用率: 2.5每個邏輯CPU使用率: [7.0, 2.1, 4.5, 2.5, 2.7, 2.1, 2.1, 2.7]CPU 各個狀態使用情況: scputimes(user=1.4, system=1.5, idle=96.8, interrupt=0.3, dpc=0.0)各個CPU 各個狀態使用情況:scputimes(user=1.8, system=3.1, idle=93.0, interrupt=1.9, dpc=0.2)scputimes(user=0.4, system=1.6, idle=97.9, interrupt=0.1, dpc=0.0)scputimes(user=1.6, system=2.8, idle=95.5, interrupt=0.1, dpc=0.0)scputimes(user=1.0, system=1.4, idle=97.5, interrupt=0.1, dpc=0.0)scputimes(user=2.4, system=0.2, idle=97.3, interrupt=0.0, dpc=0.0)scputimes(user=1.1, system=1.0, idle=97.9, interrupt=0.0, dpc=0.0)scputimes(user=0.8, system=1.2, idle=97.9, interrupt=0.0, dpc=0.0)scputimes(user=1.8, system=0.7, idle=97.3, interrupt=0.1, dpc=0.0)對于不同系統,獲取內容稍微有所不同,大家可以在linux嘗試下操作。
1.3 獲取系統內存信息
程序在內存中運行,實際工作中我們需要對內存進行監控,如果內存使用接近100%,可能存在內存泄漏等問題;我們主要關注內存的total(內存總數),used(已使用),free(未使用)情況,相關方法如下:
| psutil.virtual_memory | 獲取內存使用情況,不同系統返回值不同 |
| psutil.swap_memory() | 獲取swap內存使用情況 |
實際操作如下(windows環境下):
import psutilmem = psutil.virtual_memory()print('系統內存:', mem)print('總 內存:', mem.total)print('空閑內存:', mem.available)print('使用內存:', mem.used)print('未使用內存:', mem.free)print('內存使用率:', mem.percent)print('swap 內存:', psutil.swap_memory())輸出結果:
系統內存: svmem(total=8494747648, available=5058498560, percent=40.5, used=3436249088, free=5058498560)總 內存: 8494747648空閑內存: 5058498560使用內存: 3436249088未使用內存: 5058498560內存使用率: 40.5swap 內存: sswap(total=15205634048, used=4902215680, free=10303418368, percent=32.2, sin=0, sout=0)看到這些數字有點暈,我們更喜歡M或者G來堆內存進行描述,修改下代碼:
import psutil#1M = 1024*1024#1G = 1024*1024*1024M = 1024*1024G = M * 1024mem = psutil.virtual_memory()print('系統內存:', mem)print('總 內存:%dM %fG'%(mem.total//M, mem.total/G))print('空閑內存:%dM %fG'%(mem.available//M, mem.available/G))print('使用內存:%dM %fG'%(mem.used//M, mem.used/G))print('未使用內存:%dM %fG'%(mem.free//M, mem.free/G))print('內存使用率:%d%%'% mem.percent)print('swap 內存:', psutil.swap_memory())輸出結果如下:
系統內存: svmem(total=8494747648, available=4726083584, percent=44.4, used=3768664064, free=4726083584)總 內存:8101M 7.911350G空閑內存:4507M 4.401508G使用內存:3594M 3.509842G未使用內存:4507M 4.401508G內存使用率:44%swap 內存: sswap(total=14668763136, used=5127331840, free=9541431296, percent=35.0, sin=0, sout=0)1.4 獲取系統磁盤
實際工作中我們需要關注硬盤空間及IO讀寫,如果硬盤空間不足就需要添加硬盤或者動態擴容,硬盤相應的方法如下:
| disk_partitions(all=False) | 獲取硬盤分區信息,返回分區列表 |
| disk_usage(path) | 獲取硬盤使用情況,path為路徑 |
| disk_io_counters(perdisk=False, nowrap=True) | 硬盤IO讀取信息 |
下面我們實際操作下:
import psutil#獲取硬盤分區devs = psutil.disk_partitions()#顯示硬盤信息:print(devs)#硬盤名稱與掛載點,文件類型:for dev in devs:print('硬盤名:%s, 掛載點:%s, 文件類型:%s'%(dev.device, dev.mountpoint, dev.fstype))輸出結果如下:
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='G:\\', mountpoint='G:\\', fstype='NTFS', opts='rw,fixed')]硬盤名:C:\, 掛載點:C:\, 文件類型:NTFS硬盤名:D:\, 掛載點:D:\, 文件類型:NTFS硬盤名:E:\, 掛載點:E:\, 文件類型:NTFS硬盤名:F:\, 掛載點:F:\, 文件類型:NTFS硬盤名:G:\, 掛載點:G:\, 文件類型:NTFS下面使用disk_usage方法來獲取G盤使用情況:
#根據前面打印信息G盤使用'G:\'表示print(psutil.disk_usage('G:\'))實際輸出結果:
File "", line 2print(psutil.disk_usage('G:\'))^SyntaxError: EOL while scanning string literal因為Python解釋器將\'轉義為單引號,所有會報錯,在這里我們表示\表示反斜杠;
修改后代碼:
下面我們查看每個硬盤信息:
import psutil#定義函數,參數為路徑def showDiskInfo(path):G = 1024*1024*1024diskinfo = psutil.disk_usage(path)#將字節轉換成Gprint('%s 大小: %dG, 已使用: %dG, 未使用: %dG, 使用百分比:%d%%'%\(path, diskinfo.total//G, diskinfo.used//G, diskinfo.free//G,diskinfo.percent))#獲取硬盤分區devs = psutil.disk_partitions()for dev in devs:#分別顯示每個showDiskInfo(dev.device)輸出結果:
C:\ 大小: 118G, 已使用: 66G, 未使用: 51G, 使用百分比:56%D:\ 大小: 117G, 已使用: 10G, 未使用: 107G, 使用百分比:8%E:\ 大小: 150G, 已使用: 58G, 未使用: 92G, 使用百分比:38%F:\ 大小: 149G, 已使用: 71G, 未使用: 78G, 使用百分比:47%G:\ 大小: 175G, 已使用: 155G, 未使用: 20G, 使用百分比:88%這樣每個硬盤使用情況我們都清楚了。
最后我們來看硬盤讀寫,主要信息為:讀寫數,讀寫字節,讀寫時間,操作如下:
輸出信息:
sdiskio(read_count=2702580, write_count=3112627, read_bytes=92492292608, write_bytes=72206786048, read_time=2702, write_time=3049){'PhysicalDrive0': sdiskio(read_count=98229, write_count=392179, read_bytes=8924618240, write_bytes=4908920832, read_time=37, write_time=289), 'PhysicalDrive1': sdiskio(read_count=2604351, write_count=2720448, read_bytes=83567674368, write_bytes=67297865216, read_time=2665, write_time=2760)}通過這些方法我們可以監控硬盤使用情況,如果硬盤空間不足,可以通過郵件報警,發送郵件方法我們后面章節詳細講解。
1.5 獲取進程信息
計算機中,每個程序都是一個進程或者多個進程,除去系統占用資源其他都被這些進程占用,比如我們的web服務,數據庫等;很多情況下因為程序自身問題,會導致CPU運行100%,內存耗盡,磁盤寫滿,最后導致服務崩潰,我們可以通過psutil下面2個方法獲取進程相關信息,主要方法如下:
| psutil.pids() | 獲取進程ID(每個進程都有唯一ID) |
| psutil.Process(pid) | 根據進程ID獲取進程Process對象 |
實際操作:
import psutil#獲取當前所有進程pids = psutil.pids()print(pids)#獲取ID為pids[0]的進程,process = psutil.Process(pids[0])print(process)輸出結果:
[0, 4, 120, 440, 624, 736, 744, ... ...]psutil.Process(pid=0, name='System Idle Process', started='19:55:14')結果中可以看到,進程的ID為0, 名稱為'System Idle Process';
我們再來看Process對象屬性(不同系統方法可能不同):???????
輸出結果如下:
進程名稱: System Idle Process運行狀態: running創建時間: 1543290248.0CPU信息: pcputimes(user=0.0, system=367377.99999999994, children_user=0.0, children_system=0.0)內存信息: 4.969912151832804e-05內存使用: pmem(rss=4096, vms=0, num_page_faults=2, peak_wset=4096, wset=4096, peak_paged_pool=0, paged_pool=0, peak_nonpaged_pool=0, nonpaged_pool=0, pagefile=0, peak_pagefile=0, private=0)IO信息: pio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, other_count=0, other_bytes=0)線程數: 4p.memory_info()返回pmem對象,其中rss為進程實際使用內存大小;
二、python獲取磁盤使用、GPU信息、根據進程號獲取進程信息,
pynvml 獲取GPU信息,psutil 獲取進程信息,系統信息等示例(另一臺電腦)
1、代碼:
import pynvml #獲取GPU信息 import psutil #獲取進程信息,系統信息等class Utils(object):# 獲取硬盤信息@staticmethoddef get_disk_info(path):G = 1024*1024diskinfo = psutil.disk_usage(path)# 將字節轉換成Ginfo = "path:%s total:%dG, used:%dG, free:%dG, used_percent:%d%%"%(path,diskinfo.total/G, diskinfo.used/G, diskinfo.free/G, diskinfo.percent)return info# 獲取硬盤分區@staticmethoddef get_disk_partitions():return psutil.disk_partitions()# 獲取當前所有進程@staticmethoddef get_current_process_pid():pids = psutil.pids()return pids# 獲取進程信息@staticmethoddef get_process_info(pid):#主要信息:進程名,狀態,創建時間,CPU內存使用情況,線程數p = psutil.Process(pid) # print('進程名稱:', p.name()) #進程名稱# print('運行狀態:', p.status()) #當前狀態# print('創建時間:', p.create_time()) #創建時間# print('CPU信息:', p.cpu_times()) #進程的cpu時間信息,主要:user,system運行時間# print('內存信息:', p.memory_percent())#進程內存利用率# print('內存使用:', p.memory_info()) #進程內存使用詳情# print('IO信息:', p.io_counters()) #進程的IO信息,包括讀寫IO數字及參數# print('線程數:', p.num_threads()) #進程開啟的線程數info = "name:{} pid:{} \nstatus:{} \ncreate_time:{} \ncpu_times:{} \nmemory_percent:{} \nmemory_info:{} \nio_counters:{} \nnum_threads:{}".format(p.name(), pid, p.status(), p.create_time(), p.cpu_times(), p.memory_percent(), p.memory_info(), p.io_counters(), p.num_threads()) return infoclass GpuInfo(object):def __init__(self):#初始化pynvml.nvmlInit()def get_gpu_device(self):deviceCount = pynvml.nvmlDeviceGetCount()gpu_list = []for i in range(deviceCount):handle = pynvml.nvmlDeviceGetHandleByIndex(i)print("GPU", i, ":", pynvml.nvmlDeviceGetName(handle))gpu_list.append(i)return gpu_listdef get_free_rate(self, gpu_id):handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)info = pynvml.nvmlDeviceGetMemoryInfo(handle)free_rate = int((info.free / info.total) * 100)return free_ratedef get_gpu_info(self, gpu_id):handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)info = pynvml.nvmlDeviceGetMemoryInfo(handle)M = 1024*1024gpu_info = "id:{} total:{}M free:{}M used:{}M free_rate:{}%".format(gpu_id, info.total/M, info.free/M, info.used/M, self.get_free_rate(gpu_id))return gpu_infodef release(self):#最后要關閉管理工具pynvml.nvmlShutdown()if __name__ == "__main__":print("磁盤信息----------------------------")devs = Utils.get_disk_partitions()for dev in devs:print(Utils.get_disk_info(dev.device))print(Utils.get_disk_info("/home"))print(Utils.get_disk_info("/data"))print("進程信息----------------------------")# # 需要管理員權限# pids = Utils.get_current_process_pid()# for pid in pids:# print(Utils.get_process_info(pid))print(Utils.get_process_info(6403))print("GPU信息----------------------------")gpu_info = GpuInfo()gpu_devices = gpu_info.get_gpu_device()print("GPU使用信息----------------------------")for gpuid in gpu_devices:print(gpu_info.get_gpu_info(gpuid))gpu_info.release()2、結果:
xy@avs05:~/test_code/test$ python utils.py 磁盤信息---------------------------- path:/dev/sda1 total:128773G, used:0G, free:128773G, used_percent:0% path:/dev/sdb1 total:128773G, used:0G, free:128773G, used_percent:0% path:/home total:899747G, used:844714G, free:9306G, used_percent:98% path:/data total:6811979G, used:3515451G, free:2953201G, used_percent:54% 進程信息---------------------------- name:python pid:6403 status:sleeping create_time:1572787886.51 cpu_times:pcputimes(user=16.6, system=2.32, children_user=0.0, children_system=0.0) memory_percent:0.01580510616382157 memory_info:pmem(rss=42692608, vms=510906368, shared=8900608, text=2342912, lib=0, data=56336384, dirty=0) io_counters:pio(read_count=5249, write_count=8001, read_bytes=16384, write_bytes=26464256, read_chars=1097175, write_chars=24049039) num_threads:2 GPU信息---------------------------- GPU 0 : b'GeForce RTX 2080 Ti' GPU 1 : b'GeForce RTX 2080 Ti' GPU 2 : b'GeForce RTX 2080 Ti' GPU 3 : b'GeForce RTX 2080 Ti' GPU 4 : b'GeForce RTX 2080 Ti' GPU 5 : b'GeForce RTX 2080 Ti' GPU 6 : b'GeForce RTX 2080 Ti' GPU 7 : b'GeForce RTX 2080 Ti' GPU使用信息---------------------------- id:0 total:10989.4375M free:7344.9375M used:3644.5M free_rate:66% id:1 total:10989.4375M free:6308.9375M used:4680.5M free_rate:57% id:2 total:10989.4375M free:10876.5625M used:112.875M free_rate:98% id:3 total:10989.4375M free:10978.5625M used:10.875M free_rate:99% id:4 total:10989.4375M free:10978.5625M used:10.875M free_rate:99% id:5 total:10989.4375M free:10978.5625M used:10.875M free_rate:99% id:6 total:10989.4375M free:9497.5625M used:1491.875M free_rate:86% id:7 total:10989.4375M free:5090.0625M used:5899.375M free_rate:46%?
總結
以上是生活随笔為你收集整理的Python获取磁盘使用信息,python获取GPU信息,python根据进程号获取进程信息,pynvml 获取GPU信息,psutil 获取进程信息,系统信息等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python随机数生成方法
- 下一篇: 关于计算机书籍的收集与整理(一)