resource — Информация об использовании ресурсов


Этот модуль предоставляет основные механизмы для измерения и контроля системных ресурсов, используемых программой.

Availability: Unix, не WASI.

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

При сбое системного вызова выдается сообщение OSError.

exception resource.error

Утративший силу псевдоним OSError.

Изменено в версии 3.3: После PEP 3151 этот класс стал псевдонимом OSError.

Лимиты ресурсов

Использование ресурсов можно ограничить с помощью функции setrlimit(), описанной ниже. Каждый ресурс контролируется парой ограничений: мягким и жестким. Мягкий лимит - это текущий лимит, который может быть понижен или повышен процессом с течением времени. Мягкий предел никогда не может превышать жесткий предел. Жесткий лимит может быть снижен до любого значения, превышающего мягкий лимит, но не повышен. (Только процессы с эффективным UID суперпользователя могут повышать жесткий лимит).

Конкретные ресурсы, которые могут быть ограничены, зависят от системы. Они описаны на странице getrlimit(2) man. Ресурсы, перечисленные ниже, поддерживаются, если их поддерживает базовая операционная система; ресурсы, которые не могут быть проверены или контролироваться операционной системой, не определены в этом модуле для этих платформ.

resource.RLIM_INFINITY

Константа, используемая для обозначения предела неограниченного ресурса.

resource.getrlimit(resource)

Возвращает кортеж (soft, hard) с текущими мягкими и жесткими ограничениями ресурса. Вызывает ValueError, если указан недопустимый ресурс, или error, если базовый системный вызов неожиданно завершился неудачей.

resource.setrlimit(resource, limits)

Устанавливает новые лимиты потребления ресурса. Аргумент limits должен представлять собой кортеж (soft, hard) из двух целых чисел, описывающих новые лимиты. Значение RLIM_INFINITY может быть использовано для запроса неограниченного лимита.

Вызывает ValueError, если указан недопустимый ресурс, если новый мягкий лимит превышает жесткий лимит или если процесс пытается повысить свой жесткий лимит. Указание предела RLIM_INFINITY, когда жесткий или системный предел для этого ресурса не является неограниченным, приведет к появлению ValueError. Процесс с эффективным UID суперпользователя может запросить любое допустимое значение лимита, включая неограниченный, но ValueError все равно будет поднят, если запрошенный лимит превышает установленный системой лимит.

setrlimit может также вызвать error, если базовый системный вызов завершился неудачно.

VxWorks поддерживает только настройку RLIMIT_NOFILE.

Поднимает auditing event resource.setrlimit с аргументами resource, limits.

resource.prlimit(pid, resource[, limits])

Объединяет setrlimit() и getrlimit() в одну функцию и поддерживает получение и установку лимитов ресурсов произвольного процесса. Если pid равен 0, то вызов применяется к текущему процессу. resource и limits имеют то же значение, что и в setrlimit(), за исключением того, что limits является необязательным.

Если значение limits не задано, функция возвращает ресурсный лимит процесса pid. Если limits задан, устанавливается ресурсный лимит процесса и возвращается прежний ресурсный лимит.

Вызывает ProcessLookupError, если pid не может быть найден, и PermissionError, если у пользователя нет CAP_SYS_RESOURCE для данного процесса.

Поднимает auditing event resource.prlimit с аргументами pid, resource, limits.

Availability: Linux >= 2.6.36 с glibc >= 2.13.

Added in version 3.4.

Эти символы определяют ресурсы, потреблением которых можно управлять с помощью функций setrlimit() и getrlimit(), описанных ниже. Значения этих символов в точности соответствуют константам, используемым в программах на языке C.

На странице Unix man для getrlimit(2) перечислены доступные ресурсы. Обратите внимание, что не все системы используют один и тот же символ или одно и то же значение для обозначения одного и того же ресурса. Этот модуль не пытается скрыть различия между платформами — символы, не определенные для платформы, не будут доступны из этого модуля на этой платформе.

resource.RLIMIT_CORE

Максимальный размер (в байтах) файла ядра, который может создать текущий процесс. Это может привести к созданию неполного файла ядра, если для содержания всего образа процесса потребовалось бы ядро большего размера.

resource.RLIMIT_CPU

Максимальное количество процессорного времени (в секундах), которое может использовать процесс. Если этот лимит превышен, процессу посылается сигнал SIGXCPU. (См. документацию модуля signal для получения информации о том, как перехватить этот сигнал и сделать что-нибудь полезное, например, смыть открытые файлы на диск).

resource.RLIMIT_FSIZE

Максимальный размер файла, который может создать процесс.

resource.RLIMIT_DATA

Максимальный размер (в байтах) кучи процесса.

resource.RLIMIT_STACK

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

resource.RLIMIT_RSS

Максимальный размер резидентного набора, который должен быть доступен процессу.

resource.RLIMIT_NPROC

Максимальное количество процессов, которые может создать текущий процесс.

resource.RLIMIT_NOFILE

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

resource.RLIMIT_OFILE

Название BSD для RLIMIT_NOFILE.

resource.RLIMIT_MEMLOCK

Максимальное адресное пространство, которое может быть заблокировано в памяти.

resource.RLIMIT_VMEM

Наибольшая область отображаемой памяти, которую может занимать процесс.

Availability: FreeBSD >= 11.

resource.RLIMIT_AS

Максимальная область (в байтах) адресного пространства, которую может занять процесс.

resource.RLIMIT_MSGQUEUE

Количество байт, которое может быть выделено для очередей сообщений POSIX.

Availability: Linux >= 2.6.8.

Added in version 3.4.

resource.RLIMIT_NICE

Потолок для уровня приятности процесса (рассчитывается как 20 - rlim_cur).

Availability: Linux >= 2.6.12.

Added in version 3.4.

resource.RLIMIT_RTPRIO

Потолок приоритета реального времени.

Availability: Linux >= 2.6.12.

Added in version 3.4.

resource.RLIMIT_RTTIME

Предельное время (в микросекундах) процессорного времени, которое процесс может потратить при планировании в реальном времени без выполнения блокирующего системного вызова.

Availability: Linux >= 2.6.25.

Added in version 3.4.

resource.RLIMIT_SIGPENDING

Количество сигналов, которые процесс может поставить в очередь.

Availability: Linux >= 2.6.8.

Added in version 3.4.

resource.RLIMIT_SBSIZE

Максимальный размер (в байтах) буфера сокета для данного пользователя. Это ограничивает объем сетевой памяти и, следовательно, объем mbufs, который может занимать этот пользователь в любой момент времени.

Availability: FreeBSD.

Added in version 3.4.

resource.RLIMIT_SWAP

Максимальный размер (в байтах) пространства подкачки, которое может быть зарезервировано или использовано всеми процессами этого идентификатора пользователя. Это ограничение выполняется только в том случае, если установлен бит 1 в sysctl vm.overcommit. Полное описание этого sysctl см. в разделе tuning(7).

Availability: FreeBSD.

Added in version 3.4.

resource.RLIMIT_NPTS

Максимальное количество псевдотерминалов, созданных этим идентификатором пользователя.

Availability: FreeBSD.

Added in version 3.4.

resource.RLIMIT_KQUEUES

Максимальное количество kqueues, которое может создать этот идентификатор пользователя.

Availability: FreeBSD >= 11.

Added in version 3.10.

Использование ресурсов

Эти функции используются для получения информации об использовании ресурсов:

resource.getrusage(who)

Эта функция возвращает объект, описывающий ресурсы, потребляемые либо текущим процессом, либо его дочерними процессами, указанными параметром who. Параметр who должен быть задан с помощью одной из констант RUSAGE_*, описанных ниже.

Простой пример:

from resource import *
import time

# a non CPU-bound task
time.sleep(3)
print(getrusage(RUSAGE_SELF))

# a CPU-bound task
for i in range(10 ** 8):
   _ = 1 + 1
print(getrusage(RUSAGE_SELF))

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

Для обратной совместимости возвращаемое значение также доступно в виде кортежа из 16 элементов.

Поля ru_utime и ru_stime возвращаемого значения - это значения с плавающей точкой, представляющие количество времени, затраченного на выполнение в пользовательском режиме, и количество времени, затраченного на выполнение в системном режиме, соответственно. Остальные значения - целые числа. Подробную информацию об этих значениях можно найти на странице getrusage(2). Здесь представлено краткое описание:

Индекс

Поле

Ресурс

0

ru_utime

время работы в пользовательском режиме (в плавающих секундах)

1

ru_stime

время работы в системном режиме (плавающие секунды)

2

ru_maxrss

максимальный размер резидентного набора

3

ru_ixrss

размер общей памяти

4

ru_idrss

размер нераспределенной памяти

5

ru_isrss

размер неразделенного стека

6

ru_minflt

Ошибки страниц, не требующие ввода/вывода

7

ru_majflt

ошибки страниц, требующие ввода/вывода

8

ru_nswap

количество подмен

9

ru_inblock

операции ввода блока

10

ru_oublock

операции вывода блока

11

ru_msgsnd

отправленные сообщения

12

ru_msgrcv

полученные сообщения

13

ru_nsignals

полученные сигналы

14

ru_nvcsw

добровольное переключение контекста

15

ru_nivcsw

непроизвольное переключение контекста

Эта функция вызовет исключение ValueError, если указан недопустимый параметр who. Она также может вызвать исключение error в необычных обстоятельствах.

resource.getpagesize()

Возвращает количество байт в системной странице. (Это не обязательно должно совпадать с размером аппаратной страницы).

Следующие символы RUSAGE_* передаются в функцию getrusage(), чтобы указать, для каких процессов должна быть предоставлена информация.

resource.RUSAGE_SELF

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

resource.RUSAGE_CHILDREN

Передается в getrusage(), чтобы запросить ресурсы, потребляемые дочерними процессами вызывающего процесса, которые были завершены и ожидали.

resource.RUSAGE_BOTH

Передайте значение getrusage(), чтобы запросить ресурсы, потребляемые как текущим процессом, так и дочерними процессами. Может быть доступно не на всех системах.

resource.RUSAGE_THREAD

Передается в getrusage() для запроса ресурсов, потребляемых текущим потоком. Может быть доступно не на всех системах.

Added in version 3.2.