resource — 資源使用資訊


此模組提供了測量和控制程式所使用系統資源的基本機制。

可用性: Unix,不包括 WASI。

符號常量用於指定特定的系統資源,並請求有關當前程序或其子程序的使用資訊。

系統呼叫失敗時會引發 OSError

異常 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,則呼叫適用於當前程序。 resourcelimits 的含義與 setrlimit() 中相同,只是 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 程式使用的常量完全相同。

Unix 手冊頁 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_VMEM

程序可以佔用的最大對映記憶體區域。通常是 RLIMIT_AS 的別名。

可用性:Solaris、FreeBSD、NetBSD。

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、NetBSD。

在 3.4 版本加入。

resource.RLIMIT_SWAP

此使用者 ID 的所有程序可以保留或使用的交換空間的最大大小(以位元組為單位)。此限制僅在 vm.overcommit sysctl 的第 1 位設定時才強制執行。請參閱 tuning(7),以獲取此 sysctl 的完整描述。

可用性:FreeBSD >= 8。

在 3.4 版本加入。

resource.RLIMIT_NPTS

此使用者 ID 建立的偽終端的最大數量。

可用性:FreeBSD >= 8。

在 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 版本加入。