36.13. 资源-资源使用情况信息

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

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

为错误定义了一个 exception:

  • exception resource. error
    • 如果基础系统调用意外失败,则下面描述的Function可能会引发此错误。

36.13.1. 资源限制

可以使用下面介绍的setrlimit()函数来限制资源使用。每个资源由Pair限制控制:一个软限制和一个硬限制。软极限是当前极限,并且可以随着时间的流逝而降低或升高。软限制永远不能超过硬限制。硬限制可以降低到大于软限制的任何值,但不能提高。 (只有具有超级用户有效 UID 的进程才能提出硬限制.)

可以限制的特定资源取决于系统。它们在* getrlimit(2)*手册页中进行了描述。当底层 os 支持它们时,将支持下面列出的资源;那些平台无法在该模块中定义 os 无法检查或控制的资源。

  • resource. RLIM_INFINITY

    • 用于表示无限资源限制的常量。
  • resource. getrlimit(资源)

    • 返回一个 Tuples(soft, hard),其当前的软限制和硬限制为* resource *。如果指定了无效的资源,则引发ValueError;如果基础系统调用意外失败,则引发error
  • resource. setrlimit(资源限制)

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

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

如果基础系统调用失败,setrlimit也可能引发error

这些符号定义了可以使用下面介绍的setrlimit()getrlimit()Function控制其消耗的资源。这些符号的值恰好是 C 程序使用的常数。

  • getrlimit(2)*的 Unix 手册页列出了可用资源。请注意,并非所有系统都使用相同的符号或相同的值来表示相同的资源。该模块不会try掩盖平台差异-未为平台定义的符号将无法从该平台上的该模块中获得。
  • resource. RLIMIT_CORE

    • 当前进程可以创建的核心文件的最大大小(以字节为单位)。如果需要更大的内核来包含整个过程映像,则可能会导致创建部分内核文件。
  • resource. RLIMIT_CPU

    • 一个进程可以使用的最大处理器时间(以秒为单位)。如果超出此限制,则将SIGXCPUsignal 发送到该过程。 (有关如何捕获此 signal 并执行一些有用的操作(例如,将打开的文件刷新到磁盘)的信息,请参见signal模块文档。)
  • resource. RLIMIT_FSIZE

    • 进程可以创建的文件的最大大小。
  • resource. RLIMIT_DATA

    • 进程堆的最大大小(以字节为单位)。
  • resource. RLIMIT_STACK

    • 当前进程的调用堆栈的最大大小(以字节为单位)。这仅影响多线程进程中主线程的堆栈。
  • resource. RLIMIT_RSS

    • 该过程应使用的最大常驻集大小。
  • resource. RLIMIT_NPROC

    • 当前进程可以创建的最大进程数。
  • resource. RLIMIT_NOFILE

    • 当前进程的最大打开文件 Descriptors 数。
  • resource. RLIMIT_OFILE

  • resource. RLIMIT_MEMLOCK

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

    • 进程可能占用的最大 Map 内存区域。
  • resource. RLIMIT_AS

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

36.13.2. 资源使用

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

  • resource. getrusage()
    • 此函数返回一个对象,该对象描述由* who *参数指定的当前进程或其子进程消耗的资源。 * who *参数应使用下面描述的RUSAGE_*常量之一指定。

返回值的字段分别描述了如何使用特定的系统资源,例如。运行所花费的时间是用户模式或从主内存换出进程的次数。一些值取决于内部的时钟滴答,例如进程正在使用的内存量。

为了向后兼容,还可以将返回值作为 16 个元素的 Tuples 进行访问。

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

IndexFieldResource
0ru_utime用户模式下的时间(Float)
1ru_stime系统模式下的时间(Float)
2ru_maxrss最大居民人数
3ru_ixrss共享内存大小
4ru_idrss未共享的内存大小
5ru_isrss未共享的堆栈大小
6ru_minflt不需要 I/O 的页面错误
7ru_majflt需要 I/O 的页面错误
8ru_nswap换出次数
9ru_inblock块 Importing 操作
10ru_oublock块输出操作
11ru_msgsndmessages sent
12ru_msgrcvmessages received
13ru_nsignalssignals received
14ru_nvcsw自愿上下文切换
15ru_nivcsw非自愿上下文切换

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

在版本 2.3 中进行了更改:添加了对值的访问,作为返回对象的属性。

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

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

  • resource. RUSAGE_SELF

    • RUSAGE_SELF应该用于请求仅与流程本身有关的信息。
  • resource. RUSAGE_CHILDREN

    • 传递给getrusage()来请求调用过程的 subprocess 的资源信息。
  • resource. RUSAGE_BOTH

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