Skip to main content

35.11. resource —资源使用信息


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

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

OSError 在syscall失败时引发。

exception resource.error

OSError 的已弃用别名。

在 3.3 版更改: PEP 3151 之后,这个类被作为 OSError 的别名。

35.11.1. 资源限制

可以使用下面描述的 setrlimit() 功能来限制资源使用。每个资源由一对限制控制:软限制和硬限制。软限制是电流限制,并且可以随着时间过程由过程降低或升高。软限制不能超过硬限制。硬限制可以降低到大于软限制的任何值,但不能提高。 (只有具有超级用户的有效UID的进程可以提高硬限制。)

可以限制的具体资源是系统相关的。它们在 getrlimit(2) 手册页中描述。下面列出的资源在底层操作系统支持时支持;不能由操作系统检查或控制的资源在本模块中没有为这些平台定义。

resource.RLIM_INFINITY

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

resource.getrlimit(resource)

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

resource.setrlimit(resource, limits)

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

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

如果底层系统调用失败,setrlimit 也可以提高 error

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

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

当没有给出 limits 时,该函数返回过程 pidresource 限制。当给定 limits 时,设置进程的 resource 限制,并返回前一个资源限制。

当找不到 pid 时,抛出 ProcessLookupError,当用户的进程没有 CAP_SYS_RESOURCE 时,抛出 PermissionError

可用性: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

过程可能占用的映射内存的最大区域。

resource.RLIMIT_AS

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

resource.RLIMIT_MSGQUEUE

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

可用性:Linux 2.6.8或更高版本。

3.4 新版功能.

resource.RLIMIT_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 9或更高版本。

3.4 新版功能.

resource.RLIMIT_SWAP

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

可用性:FreeBSD 9或更高版本。

3.4 新版功能.

resource.RLIMIT_NPTS

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

可用性:FreeBSD 9或更高版本。

3.4 新版功能.

35.11.2. 资源使用

这些函数用于检索资源使用信息:

resource.getrusage(who)

此函数返回描述由 who 参数指定的当前进程或其子进程消耗的资源的对象。 who 参数应使用下面描述的 RUSAGE_* 常数之一指定。

返回值的字段各自描述特定系统资源如何被使用,例如,花费的运行时间是用户模式或进程被交换出主存储器的次数。一些值取决于内部的时钟节拍,例如。进程正在使用的内存量。

为了向后兼容,返回值也可以作为16个元素的元组访问。

返回值的字段 ru_utimeru_stime 是浮点值,分别表示在用户模式中执行所花费的时间量和在系统模式中执行所花费的时间量。其余值为整数。有关这些值的详细信息,请参阅 getrusage(2) 手册页。简要摘要如下:

指数

领域

资源

0

ru_utime

用户模式下的时间(float)

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 新版功能.