0

我想编写一个 Python 代码以百分比形式读取磁盘 IO 和网络 IO,就像我们在 Windows 任务管理器中看到的那样。目前我正在使用psutil.disk_io_counters()psutil.net_io_counters()。通过这个,我得到了磁盘 IO 的字节读取字节写入,以及网络 IO接收的字节和发送的字节。但我不知道如何将它们转换为百分比。还观察到disk_io_counters()net_io_counters()没有给出实例值。我已经尝试过此链接中提供的建议。但我没有得到想要的价值。我的操作系统是 Windows,但我希望脚本以独立于平台的方式使用。因此,无需安装任何工具,例如iotopiostat,是否可以获得我需要的值?我尝试了以下代码:

import psutil, os
print('Disk: ',psutil.disk_io_counters())
print('Network: ',psutil.net_io_counters())

我还尝试了以下代码来检查是否使用psutil.io_counters()提供即时磁盘 IO。代码是:

import psutil
import time
for x in range(10):
    for proc in psutil.process_iter():
        io_counters = proc.io_counters() 
        disk_usage_process = io_counters[2] + io_counters[3] # read_bytes + write_bytes
        print("PID: ", proc.pid, "Disk", disk_usage_process)
    print('************************************************************')
    time.sleep(1)

但我观察到这些值不是那个时候的。为了证明我已经收集了两个系统进程的磁盘 IO,io.counters()并看到它在一段时间后以递增的顺序变化。这意味着它正在从进程的开头添加磁盘 IO。以下是快照:

PID:  10068 Disk 1597555    PID:  8608 Disk 99729700
PID:  10068 Disk 1597555    PID:  8608 Disk 99729828    
PID:  10068 Disk 1597555    PID:  8608 Disk 99729956
PID:  10068 Disk 1597555    PID:  8608 Disk 99730212
PID:  10068 Disk 1598271    PID:  8608 Disk 99730340
PID:  10068 Disk 1598271    PID:  8608 Disk 99730596
PID:  10068 Disk 1598271    PID:  8608 Disk 99730724
PID:  10068 Disk 1598271    PID:  8608 Disk 99730852
PID:  10068 Disk 1598271    PID:  8608 Disk 99731108
PID:  10068 Disk 1598271    PID:  8608 Disk 99731236
4

1 回答 1

3

问题

获取当前进程的磁盘使用量和网络使用量占总磁盘和网络使用量的百分比

解决方案

根据我手动检查的内容(在 Windows 上,使用此处给出的步骤),read_bytes和的write_bytesyourProcess.io_counters()应该为您提供进程的磁盘 I/O。结合使用的总 I/Opsutil.disk_io_counters()应该给你百分比

因此,您获取磁盘使用百分比的代码如下所示

 p = psutil.Process()
 io_counters = p.io_counters() 
 disk_usage_process = io_counters[2] + io_counters[3] # read_bytes + write_bytes
 disk_io_counter = psutil.disk_io_counters()
 disk_total = disk_io_counter[2] + disk_io_counter[3] # read_bytes + write_bytes
 print("Disk", disk_usage_process/disk_total * 100)

但对于网络使用来说,任务似乎并不那么容易。正如这里提到的

AFAIK 大多数(全部?)操作系统不公开这些指标,所以不,不幸的是,这(psutil.net_io_counters 的进程版本)是不可能的

更新:尝试循环运行

>>> p = psutil.Process()
>>> for i in range(10):
...   p.io_counters()
...
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
pio(read_count=141L, write_count=0L, read_bytes=651238L, write_bytes=0L, other_c
ount=3060L, other_bytes=37992L)
于 2018-03-19T09:43:38.327 回答