resource — 资源使用信息 — Python 文档
resource — 资源使用信息
该模块提供了用于测量和控制程序使用的系统资源的基本机制。
符号常量用于指定特定的系统资源并请求有关当前进程或其子进程的使用信息。
系统调用失败时会引发 OSError。
- exception resource.error
OSError 的已弃用别名。
资源限制
可以使用下面描述的 setrlimit() 函数来限制资源使用。 每个资源都由一对限制控制:软限制和硬限制。 软限制是当前限制,可能会随着时间的推移由进程降低或提高。 软限制永远不能超过硬限制。 硬限制可以降低到任何大于软限制的值,但不能提高。 (只有具有超级用户有效 UID 的进程才能提高硬限制。)
可以限制的特定资源取决于系统。 它们在 getrlimit(2) 手册页中有描述。 当底层操作系统支持时,支持下面列出的资源; 操作系统无法检查或控制的资源未在该模块中为这些平台定义。
- resource.RLIM_INFINITY
- 常量用于表示无限资源的限制。
- resource.getrlimit(resource)
- 返回一个元组
(soft, hard)
,当前软和硬限制为 resource。 如果指定了无效资源,则引发 ValueError,如果底层系统调用意外失败,则引发 error。
- resource.setrlimit(resource, limits)
设置新的 资源 消耗限制。 limits 参数必须是描述新限制的两个整数的元组
(soft, hard)
。 RLIM_INFINITY 值可用于请求无限制的限制。如果指定了无效资源,如果新的软限制超过硬限制,或者进程试图提高其硬限制,则引发 ValueError。 当该资源的硬限制或系统限制不是无限时,指定限制 RLIM_INFINITY 将导致 ValueError。 具有超级用户有效 UID 的进程可以请求任何有效的限制值,包括无限制,但如果请求的限制超过系统施加的限制,仍然会引发 ValueError。
如果底层系统调用失败,
setrlimit
也可能引发 error。VxWorks 仅支持设置 RLIMIT_NOFILE。
- resource.prlimit(pid, resource[, limits])
将 setrlimit() 和 getrlimit() 组合在一个函数中,支持获取和设置任意进程的资源限制。 如果 pid 为 0,则调用适用于当前进程。 resource 和 limits 与 setrlimit() 的含义相同,除了 limits 是可选的。
当未给出 limits 时,该函数返回进程 pid 的 resource 限制。 当给定 limits 时,设置进程的 resource 限制并返回之前的资源限制。
当找不到 pid 时引发 ProcessLookupError,当用户没有进程的
CAP_SYS_RESOURCE
时引发 PermissionError。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 消息队列分配的字节数。
3.4 版中的新功能。
- resource.RLIMIT_NICE
进程良好级别的上限(计算为 20 - rlim_cur)。
3.4 版中的新功能。
- resource.RLIMIT_RTPRIO
实时优先权的上限。
3.4 版中的新功能。
- resource.RLIMIT_RTTIME
进程在不进行阻塞系统调用的情况下在实时调度下可以花费的 CPU 时间的时间限制(以微秒为单位)。
3.4 版中的新功能。
- resource.RLIMIT_SIGPENDING
进程可能排队的信号数。
3.4 版中的新功能。
- resource.RLIMIT_SBSIZE
此用户的套接字缓冲区使用的最大大小(以字节为单位)。 这限制了网络内存的数量,从而限制了该用户可以随时持有的 mbuf 数量。
3.4 版中的新功能。
- resource.RLIMIT_SWAP
此用户 ID 的所有进程可能保留或使用的交换空间的最大大小(以字节为单位)。 仅当设置了 vm.overcommit sysctl 的第 1 位时,才会强制执行此限制。 有关此 sysctl 的完整说明,请参阅 tuning(7)。
3.4 版中的新功能。
- resource.RLIMIT_NPTS
此用户 id 创建的最大伪终端数。
3.4 版中的新功能。
资源使用
这些函数用于检索资源使用信息:
- 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
不需要 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 版中的新功能。