resource — 資源使用資訊


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

可用性: Unix,而非 WASI。

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

在系統呼叫失敗時會引發 OSError

exception 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,則呼叫將應用於當前程序。resourcelimitssetrlimit() 中的含義相同,只是 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 程式使用的常量完全相同。

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

程序可以佔用的最大對映記憶體區域。

可用性: FreeBSD >= 11。

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。

在 3.4 版本中新增。

resource.RLIMIT_SWAP

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

可用性: FreeBSD。

在 3.4 版本中新增。

resource.RLIMIT_NPTS

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

可用性: FreeBSD。

在 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 中新增。