閱讀950 返回首頁    go 阿裏雲 go 技術社區[雲棲]


rlimit Linux下限製資源的使用(Limiting Resource Usage)

在Linux環境編程下,我們可以具體的限製一個進程對資源的使用,當進程嚐試超過資源使用的限製,它可能會收到一個信號,或是因資源而失敗的係統調用。每個進程最初的獲得的限製來自父進程,但是後來可以更改這個限製。

有兩個關於資源限製的概念:

current limit:為係統規定的上限,也叫做"soft limit",因為進程通常將被限製在這個範圍內。

maxinum limit:為一個進程被允許建立current limit的最大值,也叫做"hard limit",因為一個進程無法避開它,一個進程低於他自己的maxinum limit,且隻有超級用戶可能提高它的maxinum limit。

struct rlimit {
rlim_t rlim_cur; //The current limit 
rlim_t rlim_max; //The maximum limit.
};

使用getrlimit,setrlimit,getrlimit64,setrlimit64(定義在<sys/resource.h>)來對上麵兩個值進行使用。

— Function: int getrlimit (int resource, struct rlimit *rlp)

   讀取類型為resource的限製值,並儲存在rlp中。

   返回值為0時成功,-1時失敗。失敗時可能將errno設置為EFAULT.

— Function: int setrlimit (int resource, const struct rlimit *rlp)

更新新的current limit 與 maxinum limit限製 ,參數resource為限製的類型(下方有參數表),*rlp帶更新的結構體。

同樣成功返回0,失敗返回-1.將errno設置為EPERM有如下兩種情況

1.設置的current limit 超過了maxinum limit的值。

    2.在不是超級用戶的情況下設置了maxinum limit。

同時這裏隻提到

struct rlimit64{

rlim64_t rlim_cur;

//This is analogous to rlimit.rlim_cur, but with a different type. 
rlim64_t rlim_max //This is analogous to rlimit.rlim_max, but with a different type.

}

下麵是具體可以限製的種類也就是resource列表

RLIMIT_CPU   CPU使用時間限製,如果運行時間長於該值,將會收到信號:SIGXCPU 該值以秒計量

RLIMIT_FSIZE   進程可創建文件大小限製,如果進程嚐試寫更大的文件將會受到信號:SIGXFSZ

RLIMIT_DATA   最大內存使用限製,如果進程嚐試分配內存並超出這個範圍,分配函數將會失敗

RLIMIT_STACK   進程使用棧的大小限製,如果進程嚐試擴展它的棧並超過這個值,那個會收到信號SIGSEGV 

RLIMIT_CORE   進程創建core文件大小限製,如果進程結束並且要存儲core文件高於該值,那麼core文件不會被創建,所以設置這個值為0回保證core文件從不被創建

RLIMIT_RSS   進程所能得到的最大物理內存,這個參數是係統調度程序和內存分配的向導,係統在有盈餘時將會給進程更多的內存

RLIMIT_MEMLOCK   在物理內存中最大被鎖內存數

RLIMIT_NPROC   同一用戶ID創建最大進程數,如果已經到達最大進程數再調用fork會失敗

RLIMIT_NOFILE RLIMIT_OFILE   進程可開最大文件數,如果超出最大數將會失敗,該值存在在GNU 和 4.4BSD,部分係統沒有。
RLIMIT_AS   進程總共可獲得的最大內存數,如果進程嚐試分配更多內存,那麼分配函數將會失敗。
RLIM_NLIMITS   所有參數值的限製,以上任何參數值都不能高於該值

— Constant: rlim_t RLIM_INFINITY
該常量被定義為無窮,在調用setrlimit的時候


轉載請注明出處謝謝

最後更新:2017-04-03 12:55:41

  上一篇:go SQL Server中clustered與nonclustered的區別
  下一篇:go js動態創建div等元素實例