resource
--- 資源使用信息?
該模塊提供了測量和控制程序所利用的系統資源的基本機制。
符號常量被用來(lái)指定特定的系統資源,并要求獲得關(guān)于當前進(jìn)程或其子進(jìn)程的使用信息。
當系統調用失敗時(shí),會(huì )觸發(fā)一個(gè) OSError
。
資源限制?
資源的使用可以通過(guò)下面描述的 setrlimit()
函數來(lái)限制。每個(gè)資源都被一對限制所控制:一個(gè)軟限制和一個(gè)硬限制。軟限制是當前的限制,并且可以由一個(gè)進(jìn)程隨著(zhù)時(shí)間的推移而降低或提高。軟限制永遠不能超過(guò)硬限制。硬限制可以降低到大于軟限制的任何數值,但不能提高。(只有擁有超級用戶(hù)有效UID的進(jìn)程才能提高硬限制。)
可以被限制的具體資源取決于系統。它們在 man getrlimit(2) 中描述。 下面列出的資源在底層操作系統支持的情況下被支持;那些不能被操作系統檢查或控制的資源在本模塊中沒(méi)有為這些平臺定義。
- resource.RLIM_INFINITY?
用來(lái)表示無(wú)限資源的極限的常數。
- resource.getrlimit(resource)?
返回一個(gè)包含 resource 當前軟限制和硬限制的元組。如果指定了一個(gè)無(wú)效的資源,則觸發(fā)
ValueError
,如果底層系統調用意外失敗,則引發(fā)error
。
- resource.setrlimit(resource, limits)?
設置 resource 的新的消耗極限。參數 limits 必須是一個(gè)由兩個(gè)整數組成的元組
(soft, hard)
,描述了新的限制。RLIM_INFINITY
的值可以用來(lái)請求一個(gè)無(wú)限的限制。如果指定了一個(gè)無(wú)效的資源,如果新的軟限制超過(guò)了硬限制,或者如果一個(gè)進(jìn)程試圖提高它的硬限制,將觸發(fā)
ValueError
。當資源的硬限制或系統限制不是無(wú)限時(shí),指定一個(gè)RLIM_INFINITY
的限制將導致ValueError
。 一個(gè)有效 UID 為超級用戶(hù)的進(jìn)程可以請求任何有效的限制值,包括無(wú)限,但如果請求的限制超過(guò)了系統規定的限制,則仍然會(huì )產(chǎn)生ValueError
。如果底層系統調用失敗,
setrlimit
也可能觸發(fā)error
。VxWorks只支持設置
RLIMIT_NOFILE
。觸發(fā)一個(gè) auditing event
resource.setrlimit``使用參數 ``resource
,limits
。
- resource.prlimit(pid, resource[, limits])?
將
setrlimit()
和getrlimit()
合并為一個(gè)函數,支持獲取和設置任意進(jìn)程的資源限制。如果 pid 為0,那么該調用適用于當前進(jìn)程。 resource 和 limits 的含義與setrlimit()
相同,只是 limits 是可選的。當 limits 沒(méi)有給出時(shí),該函數返回進(jìn)程 pid 的 resource 限制。當 limits 被給定時(shí),進(jìn)程的 resource 限制被設置,并返回以前的資源限制。
當 pid 找不到時(shí),觸發(fā)
ProcessLookupError
;當用戶(hù)沒(méi)有進(jìn)程的CAP_SYS_RESOURCE
時(shí),觸發(fā)PermissionError
。觸發(fā)一個(gè) auditing event
resource.prlimit
帶有參數pid
,resource
,limits
。Availability: Linux 2.6.36 或更新版本帶有 glibc 2.13 或更新版本
3.4 新版功能.
這些符號定義了資源的消耗可以通過(guò)下面描述的 setrlimit()
和 getrlimit()
函數來(lái)控制。這些符號的值正是 C 程序所使用的常數。
Unix man 頁(yè)面 getrlimit(2) 列出了可用的資源。注意,并非所有系統都使用相同的符號或相同的值來(lái)表示相同的資源。本模塊并不試圖掩蓋平臺的差異——沒(méi)有為某一平臺定義的符號在該平臺上將無(wú)法從本模塊中獲得。
- resource.RLIMIT_CORE?
當前進(jìn)程可以創(chuàng )建的核心文件的最大大?。ㄒ宰止潪閱挝唬?。如果需要更大的核心文件來(lái)包含整個(gè)進(jìn)程的鏡像,這可能會(huì )導致創(chuàng )建一個(gè)部分核心文件。
- resource.RLIMIT_CPU?
一個(gè)進(jìn)程可以使用的最大處理器時(shí)間(以秒為單位)。如果超過(guò)了這個(gè)限制,一個(gè)
SIGXCPU
信號將被發(fā)送給進(jìn)程。(參見(jiàn)signal
模塊文檔,了解如何捕捉這個(gè)信號并做一些有用的事情,例如,將打開(kāi)的文件刷新到磁盤(pán)上)。
- resource.RLIMIT_FSIZE?
進(jìn)程可能創(chuàng )建的文件的最大大小。
- resource.RLIMIT_DATA?
進(jìn)程的堆的最大大?。ㄒ宰止潪閱挝唬?。
- resource.RLIMIT_STACK?
當前進(jìn)程的調用堆棧的最大大?。ㄗ止潱?。 這只影響到多線(xiàn)程進(jìn)程中主線(xiàn)程的堆棧。
- resource.RLIMIT_RSS?
應該提供給進(jìn)程的最大常駐內存大小。
- resource.RLIMIT_NPROC?
當前進(jìn)程可能創(chuàng )建的最大進(jìn)程數。
- resource.RLIMIT_NOFILE?
當前進(jìn)程打開(kāi)的文件描述符的最大數量。
- resource.RLIMIT_OFILE?
BSD 對
RLIMIT_NOFILE
的命名。
- resource.RLIMIT_MEMLOCK?
可能被鎖定在內存中的最大地址空間。
- resource.RLIMIT_VMEM?
進(jìn)程可能占用的最大映射內存區域。
- resource.RLIMIT_AS?
進(jìn)程可能占用的地址空間的最大區域(以字節為單位)。
- resource.RLIMIT_MSGQUEUE?
可分配給 POSIX 消息隊列的字節數。
Availability: Linux 2.6.8 或更新版本。
3.4 新版功能.
- resource.RLIMIT_NICE?
進(jìn)程的 Nice 級別的上限(計算為 20 - rlim_cur )。
Availability: Linux 2.6.12 或更新版本
3.4 新版功能.
- resource.RLIMIT_RTPRIO?
實(shí)時(shí)優(yōu)先級的上限。
Availability: Linux 2.6.12 或更新版本
3.4 新版功能.
- resource.RLIMIT_RTTIME?
在實(shí)時(shí)調度下,一個(gè)進(jìn)程在不進(jìn)行阻塞性系統調用的情況下,可以花費的 CPU 時(shí)間限制(以微秒計)。
Availability: Linux 2.6.25 或更新版本
3.4 新版功能.
- resource.RLIMIT_SIGPENDING?
進(jìn)程可能排隊的信號數量。
Availability: Linux 2.6.8 或更新版本。
3.4 新版功能.
- resource.RLIMIT_SBSIZE?
這個(gè)用戶(hù)使用的套接字緩沖區的最大大?。ㄗ止潝担?。這限制了這個(gè)用戶(hù)在任何時(shí)候都可以持有的網(wǎng)絡(luò )內存數量,因此也限制了 mbufs 的數量。
Availability: FreeBSD 9 或更新版本
3.4 新版功能.
- resource.RLIMIT_SWAP?
這個(gè)用戶(hù) ID 的所有進(jìn)程可能保留或使用的交換空間的最大大?。ㄗ止潝担?。這個(gè)限制只有在 vm.overcommit sysctl的第 1 位被置 1 時(shí)才會(huì )被強制執行。請參閱 tuning(7) 以獲得關(guān)于這個(gè)系統檢測器的完整介紹。
Availability: FreeBSD 9 或更新版本
3.4 新版功能.
- resource.RLIMIT_NPTS?
該用戶(hù) ID 創(chuàng )建的偽終端的最大數量。
Availability: FreeBSD 9 或更新版本
3.4 新版功能.
- resource.RLIMIT_KQUEUES?
這個(gè)用戶(hù) ID 被允許創(chuàng )建的最大 kqueue 數量。
Availability: FreeBSD 11 或更新版本。
3.10 新版功能.
資源用量?
這些函數被用來(lái)檢索資源使用信息。
- resource.getrusage(who)?
這個(gè)函數返回一個(gè)對象,描述當前進(jìn)程或其子進(jìn)程所消耗的資源,由 who 參數指定。 who 參數應該使用下面描述的
RUSAGE_*
常數之一來(lái)指定。一個(gè)簡(jiǎn)單的示例:
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))
返回值的字段分別描述了某一特定系統資源的使用情況,例如,在用戶(hù)模式下運行的時(shí)間或進(jìn)程從主內存中換出的次數。有些值取決于內部的時(shí)鐘周期,例如進(jìn)程使用的內存量。
為了向后兼容,返回值也可以作為一個(gè) 16 個(gè)元素的元組來(lái)訪(fǎng)問(wèn)。
返回值中的
ru_utime
和ru_stime
字段是浮點(diǎn)值,分別代表在用戶(hù)模式下執行的時(shí)間和在系統模式下執行的時(shí)間。其余的值是整數。關(guān)于這些值的詳細信息,請查閱 getrusage(2) man page 。這里介紹一個(gè)簡(jiǎn)短的摘要。索引
字段
資源
0
ru_utime
用戶(hù)模式下的時(shí)間(浮點(diǎn)數秒)
1
ru_stime
系統模式下的時(shí)間(浮點(diǎn)數秒)
2
ru_maxrss
最大的常駐內存大小
3
ru_ixrss
共享內存大小
4
ru_idrss
未共享的內存大小
5
ru_isrss
未共享的堆棧大小
6
ru_minflt
不需要 I/O 的頁(yè)面故障數
7
ru_majflt
需要 I/O 的頁(yè)面故障數
8
ru_nswap
swap out 的數量
9
ru_inblock
塊輸入操作數
10
ru_oublock
塊輸出操作數
11
ru_msgsnd
發(fā)送消息數
12
ru_msgrcv
收到消息數
13
ru_nsignals
收到信號數
14
ru_nvcsw
主動(dòng)上下文切換
15
ru_nivcsw
被動(dòng)上下文切換
如果指定了一個(gè)無(wú)效的 who 參數,這個(gè)函數將觸發(fā)一個(gè)
ValueError
。在特殊情況下,它也可能觸發(fā)error
異常。
- resource.getpagesize()?
返回一個(gè)系統頁(yè)面的字節數。(這不需要和硬件頁(yè)的大小相同)。
下面的 RUSAGE_*
符號被傳遞給 getrusage()
函數,以指定應該為哪些進(jìn)程提供信息。
- resource.RUSAGE_SELF?
傳遞給
getrusage()
以請求調用進(jìn)程消耗的資源,這是進(jìn)程中所有線(xiàn)程使用的資源總和。
- resource.RUSAGE_CHILDREN?
傳遞給
getrusage()
以請求被終止和等待的調用進(jìn)程的子進(jìn)程所消耗的資源。
- resource.RUSAGE_BOTH?
傳遞給
getrusage()
以請求當前進(jìn)程和子進(jìn)程所消耗的資源。并非所有系統都能使用。
- resource.RUSAGE_THREAD?
傳遞給
getrusage()
以請求當前線(xiàn)程所消耗的資源。 并非所有系統都能使用。3.2 新版功能.