resource
— 资源使用信息¶
此模块提供基本机制来测量和控制程序使用的系统资源。
可用性:Unix,不包括 Emscripten,不包括 WASI。
符号常量用于指定特定系统资源并请求有关当前进程或其子进程的使用信息。
系统调用失败时会引发 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
。引发审计事件
resource.setrlimit
,其中包含参数resource
、limits
。
- resource.prlimit(pid, resource[, limits])¶
将
setrlimit()
和getrlimit()
合并到一个函数中,并支持获取和设置任意进程的资源限制。如果 pid 为 0,则调用适用于当前进程。resource 和 limits 的含义与setrlimit()
中的含义相同,但 limits 是可选的。当未给出 limits 时,该函数返回进程 pid 的 resource 限制。当给出 limits 时,将设置进程的 resource 限制,并返回以前的资源限制。
当找不到 pid 时引发
ProcessLookupError
,当用户对该进程没有CAP_SYS_RESOURCE
时引发PermissionError
。引发 审计事件
resource.prlimit
,带有参数pid
、resource
、limits
。可用性:Linux >= 2.6.36,glibc >= 2.13。
在版本 3.4 中添加。
这些符号定义了可以使用下面描述的 setrlimit()
和 getrlimit()
函数控制其消耗的资源。这些符号的值与 C 程序使用的常量完全相同。
手册页 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¶
RLIMIT_NOFILE
的 BSD 名称。
- resource.RLIMIT_MEMLOCK¶
可以在内存中锁定的最大地址空间。
- resource.RLIMIT_AS¶
进程可以占据的最大地址空间区域(以字节为单位)。
- 资源。RLIMIT_SBSIZE¶
此用户可使用的套接字缓冲区使用的最大大小(以字节为单位)。这限制了此用户在任何时候可能拥有的网络内存量,因此也限制了此用户可能拥有的 mbuf 数量。
可用性: FreeBSD。
在版本 3.4 中添加。
资源使用¶
这些函数用于检索资源使用信息
- 资源。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
不需要 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 中添加。