Как получить текущий дисковый ввод-вывод и сетевой ввод-вывод в процентах с помощью Python?

Я хочу написать код Python для чтения дискового ввода-вывода и сетевого ввода-вывода в процентах, как мы видим в диспетчере задач Windows. В настоящее время я использую psutil.disk_io_counters() и psutil.net_io_counters(). Благодаря этому я получаю чтение байтов и запись байтов для дискового ввода-вывода и получение байтов и отправление байтов для сетевого ввода-вывода. . Но я не знаю, как перевести их в проценты. Также замечено, что disk_io_counters() и net_io_counters() не дают значения экземпляра. Я попробовал предложение, представленное в этом ссылка. Но я не получил желаемое значение. Моя ОС — Windows, но я хочу, чтобы скрипт использовался независимо от платформы. Итак, без установки каких-либо инструментов, таких как iotop или iostat, можно ли получить нужные мне значения? Я пробовал следующий код:

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

Я также попробовал следующий код, чтобы проверить, дает ли использование psutil.io_counters() мгновенный дисковый ввод-вывод или нет. Код:

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.counters(), и увидел, что по прошествии времени он меняется в порядке возрастания. Это означает, что он добавляет дисковый ввод-вывод с начала процессов. Ниже приведен снимок:

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

person M. P    schedule 19.03.2018    source источник
comment
Будет ли разумной мерой деление счетчика disk_io на размер диска и сетевых байтов на пропускную способность вашей сети? Вы можете сравнить полученные значения со значениями, показанными в диспетчере задач, чтобы быть уверенным.   -  person raghav710    schedule 19.03.2018
comment
Ваш вопрос кажется дубликатом заголовка stackoverflow.com/questions/31860163/. Это то, что вы ищите?   -  person raghav710    schedule 19.03.2018
comment
@ raghav710 да, этот вопрос уже задавался ранее, и я также упомянул его в своем вопросе, предоставив ссылку. Но ответ, который был дан в этом вопросе, недостаточен. Потому что в этом случае эти значения disk io и network io не относятся к этому экземпляру. Я имею в виду ценность момента. На это нет ответов.   -  person M. P    schedule 19.03.2018
comment
@ raghav710 Не могли бы вы рассказать мне, как получить размер диска. и пропускная способность моей сети...   -  person M. P    schedule 19.03.2018
comment
@ raghav710 извините, я неправильно понял вопрос. Итак, вы хотите, чтобы ваш disk_io был в процентах от disk_io на данный момент?   -  person raghav710    schedule 19.03.2018


Ответы (1)


Вопрос:

Получите сведения об использовании диска и сети процессом в процентах от общего использования диска и сети на данный момент.

Решение

Из того, что я проверил вручную (в Windows, используя шаги, указанные здесь), значения read_bytes и write_bytes для yourProcess.io_counters() должны дать вам дисковый ввод-вывод для процесса. В сочетании с общим вводом-выводом с использованием psutil.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)

Но для использования сети задача не кажется такой простой. Как упоминалось здесь

Насколько я знаю, большинство (все?) операционных систем не предоставляют эти метрики, так что нет, к сожалению, это (процессная версия 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)
person raghav710    schedule 19.03.2018
comment
Спасибо за ваш ответ. Но я попробовал ваш код, и этот код предоставляет только диск io текущего процесса. Не общий системный диск io. и это также не значение экземпляра. если вы используете свой код внутри цикла for, вы можете видеть, что дисковый ввод-вывод всегда увеличивается. - person M. P; 20.03.2018
comment
Можете ли вы уточнить, что такое значение экземпляра, чтобы я мог улучшить свой ответ? Я понял, что значение экземпляра означает это для текущего процесса и, следовательно, ответ. - person raghav710; 20.03.2018
comment
Термин экземпляр означает измерение дискового ввода-вывода процесса P в момент времени T. Если я измеряю дисковый ввод-вывод для любого процесса в момент времени t, это даст мне чтение и запись, которые точно произошли только в момент времени t, а не из всех чтение и запись происходили с момента времени 0 до t. Если мы печатаем дисковый ввод-вывод внутри цикла, он увеличивается, т. Е. Он берет сумму всех дисковых вводов-выводов этого процесса с момента времени 0 (когда процесс начинается) до t. Но каким-то образом ваш ответ дал мне подсказку рассчитать дисковый ввод-вывод системы, учитывая все запущенные процессы и вычитая дисковый ввод-вывод времени t-1 до t. Спасибо.. - person M. P; 20.03.2018
comment
@ MP Мне интересно понять изменение значений во время цикла. Я обновил свой ответ значениями, напечатанными в цикле, и вижу, что значение остается прежним. Можете ли вы помочь мне понять? - person raghav710; 20.03.2018
comment
извините, я не упомянул о временной задержке внутри цикла. вы должны помещать задержку внутри цикла после каждой печати. В противном случае диск времени t будет напечатан 10 раз. поэтому установка задержки в 1 с гарантирует, что вы читаете диск io этого процесса через каждую 1 секунду. Опять же, командная задача будет создавать постоянный дисковый ввод-вывод, потому что каждый раз будет выполняться одинаковое количество операций чтения/записи. Поэтому, чтобы проверить это правильно, вы должны распечатать дисковый ввод-вывод всех запущенных процессов внутри цикла, установив временную задержку. Там вы можете видеть, что дисковый ввод-вывод процесса увеличивается, потому что он добавляет весь дисковый ввод-вывод с самого начала. - person M. P; 20.03.2018
comment
Я обновляю скрипт, через который вы можете видеть. - person M. P; 20.03.2018