resource — 资源使用信息


该模块提供了用于测量和控制程序使用的系统资源的基本机制。

可用性: Unix,而非 WASI。

使用符号常量来指定特定的系统资源,并请求有关当前进程或其子进程的使用信息。

在系统调用失败时会引发 OSError

exception resource.error

已弃用的 OSError 的别名。

在 3.3 版本中变更: 根据 PEP 3151,此类已成为 OSError 的别名。

资源限制

可以使用下面描述的 setrlimit() 函数来限制资源的使用。每个资源都由一对限制控制:软限制和硬限制。软限制是当前限制,可能会被进程随着时间的推移而降低或提高。软限制永远不能超过硬限制。硬限制可以降低到任何大于软限制的值,但不能提高。(只有有效 UID 为超级用户的进程才能提高硬限制。)

可以限制的具体资源是系统相关的。它们在 getrlimit(2) 手册页中进行了描述。当底层操作系统支持时,会支持下列资源;操作系统无法检查或控制的资源在本模块中不会为这些平台定义。

resource.RLIM_INFINITY

用于表示无限资源限制的常量。

resource.getrlimit(resource)

返回一个元组 (soft, hard),其中包含 resource 的当前软限制和硬限制。如果指定了无效资源,则引发 ValueError,如果底层系统调用意外失败,则引发 error

resource.setrlimit(resource, limits)

设置 resource 的新消耗限制。limits 参数必须是一个包含两个整数的元组 (soft, hard),用于描述新的限制。可以使用 RLIM_INFINITY 值来请求无限制的限制。

如果指定了无效资源,如果新的软限制超过了硬限制,或者如果进程试图提高其硬限制,则引发 ValueError。当该资源的硬限制或系统限制不是无限制的时,指定 RLIM_INFINITY 的限制将导致 ValueError。有效 UID 为超级用户的进程可以请求任何有效的限制值,包括无限制,但如果请求的限制超过系统施加的限制,仍然会引发 ValueError

如果底层系统调用失败,setrlimit 也可能会引发 error

VxWorks 仅支持设置 RLIMIT_NOFILE

使用参数 resourcelimits 引发 审计事件 resource.setrlimit

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

setrlimit()getrlimit() 合并到一个函数中,并支持获取和设置任意进程的资源限制。如果 pid 为 0,则调用将应用于当前进程。resourcelimitssetrlimit() 中的含义相同,只是 limits 是可选的。

当未给出 limits 时,该函数将返回进程 pidresource 限制。当给出 limits 时,将设置进程的 resource 限制并返回之前的资源限制。

当找不到 pid 时引发 ProcessLookupError,当用户没有该进程的 CAP_SYS_RESOURCE 时引发 PermissionError

使用参数 pidresourcelimits 引发 审计事件 resource.prlimit

可用性:Linux >= 2.6.36,带有 glibc >= 2.13。

在 3.4 版本中添加。

这些符号定义了可以使用下面描述的 setrlimit()getrlimit() 函数来控制其消耗的资源。这些符号的值与 C 程序使用的常量完全相同。

getrlimit(2) 的 Unix 手册页列出了可用的资源。请注意,并非所有系统都使用相同的符号或相同的值来表示相同的资源。此模块不会尝试掩盖平台差异——对于某个平台未定义的符号,在该平台上将不可用于此模块。

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

RLIMIT_NOFILE 的 BSD 名称。

resource.RLIMIT_MEMLOCK

可以在内存中锁定的最大地址空间。

resource.RLIMIT_VMEM

进程可以占用的最大映射内存区域。

可用性: FreeBSD >= 11。

resource.RLIMIT_AS

进程可以占用的最大地址空间区域(以字节为单位)。

resource.RLIMIT_MSGQUEUE

可以为 POSIX 消息队列分配的字节数。

可用性: Linux >= 2.6.8。

在 3.4 版本中添加。

resource.RLIMIT_NICE

进程的 nice 级别上限(计算为 20 - rlim_cur)。

可用性: Linux >= 2.6.12。

在 3.4 版本中添加。

resource.RLIMIT_RTPRIO

实时优先级的上限。

可用性: Linux >= 2.6.12。

在 3.4 版本中添加。

resource.RLIMIT_RTTIME

进程在没有进行阻塞系统调用的情况下,在实时调度下可以花费的 CPU 时间限制(以微秒为单位)。

可用性: Linux >= 2.6.25。

在 3.4 版本中添加。

resource.RLIMIT_SIGPENDING

进程可以排队的信号数量。

可用性: Linux >= 2.6.8。

在 3.4 版本中添加。

resource.RLIMIT_SBSIZE

此用户套接字缓冲区使用的最大大小(以字节为单位)。 这限制了网络内存量,因此也限制了此用户随时可以拥有的 mbuf 数量。

可用性: FreeBSD。

在 3.4 版本中添加。

resource.RLIMIT_SWAP

此用户 ID 的所有进程可以保留或使用的交换空间的最大大小(以字节为单位)。 仅当设置了 vm.overcommit sysctl 的第 1 位时,才会强制执行此限制。 有关此 sysctl 的完整说明,请参阅 tuning(7)

可用性: FreeBSD。

在 3.4 版本中添加。

resource.RLIMIT_NPTS

此用户 ID 创建的伪终端的最大数量。

可用性: FreeBSD。

在 3.4 版本中添加。

resource.RLIMIT_KQUEUES

允许此用户 ID 创建的最大 kqueue 数量。

可用性: FreeBSD >= 11。

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_utimeru_stime 是浮点值,分别表示在用户模式下执行所花费的时间和在系统模式下执行所花费的时间。其余值是整数。有关这些值的详细信息,请查阅 getrusage(2) 手册页。这里给出一个简短的摘要

索引

字段

资源

0

ru_utime

用户模式下的时间(浮点秒)

1

ru_stime

系统模式下的时间(浮点秒)

2

ru_maxrss

最大常驻集大小

3

ru_ixrss

共享内存大小

4

ru_idrss

非共享内存大小

5

ru_isrss

非共享堆栈大小

6

ru_minflt

不需要 I/O 的页面错误

7

ru_majflt

需要 I/O 的页面错误

8

ru_nswap

换出次数

9

ru_inblock

块输入操作

10

ru_oublock

块输出操作

11

ru_msgsnd

已发送的消息

12

ru_msgrcv

已接收的消息

13

ru_nsignals

已接收的信号

14

ru_nvcsw

自愿上下文切换

15

ru_nivcsw

非自愿上下文切换

如果指定了无效的 who 参数,此函数将引发 ValueError。在不寻常的情况下,它还可能引发 error 异常。

resource.getpagesize()

返回系统页中的字节数。(这不必与硬件页面大小相同。)

以下 RUSAGE_* 符号被传递给 getrusage() 函数,以指定应提供哪个进程的信息。

resource.RUSAGE_SELF

传递给 getrusage() 以请求调用进程所消耗的资源,这是进程中所有线程使用的资源的总和。

resource.RUSAGE_CHILDREN

传递给 getrusage(),以请求调用进程已终止并等待的子进程所消耗的资源。

resource.RUSAGE_BOTH

传递给 getrusage(),以请求当前进程和子进程所消耗的资源。可能并非在所有系统上都可用。

resource.RUSAGE_THREAD

传递给 getrusage(),以请求当前线程所消耗的资源。可能并非在所有系统上都可用。

在版本 3.2 中添加。