Linux Resource Limit

一、功能描述

在linux系統中,Resouce Limit指在一個進程的執行過程中,它所能得到的資源的限制,比如進程的core file的最大值,虛擬內存的最大值等。

其有兩個最重要的概念:soft limit 和 hard limit。

  • soft limit是指內核所能支持的資源上限。比如對於RLIMIT_NOFILE(一個進程能打開的最大文件數,內核默認是1024),soft limit最大也只能達到1024。對於RLIMIT_CORE(core文件的大小,內核不做限制),soft limit最大能是unlimited。
  • hard limit在資源中只是作爲soft limit的上限。當你設置hard limit後,你以後設置的soft limit只能小於hard limit。要說明的是,hard limit只針對非特權進程,也就是進程的有效用戶ID(effective user ID)不是0的進程。具有特權級別的進程(具有屬性CAP_SYS_RESOURCE),soft limit則只有內核上限。

二、使用方法

對於resouce limit的讀取修改,有兩種方法。

    * 使用shell內建命令ulimit
    * 使用getrlimit和setrlimit API

ulimit是改變shell的resouce limit,並達到改變shell啓動的進程的resouce limit效果(子進程繼承)。
usage:ulimit [-SHacdefilmnpqrstuvx [limit]]
當不指定limit的時候,該命令顯示當前值。這裏要注意的是,當你要修改limit的時候,如果不指定-S或者-H,默認是同時設置soft limit和hard limit。也就是之後設置時只能減不能增。所以,建議使用ulimit設置limit參數是加上-S。


getrlimit和setrlimit的使用也很簡單,manpage裏有很清楚的描述。
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
需要注意的是你在setrlimit,需要檢查是否成功來判斷新值有沒有超過hard limit。如下例:
if (getrlimit(RLIMIT_CORE, &rlim)==0) {
    rlim_new.rlim_cur = rlim_new.rlim_max = RLIM_INFINITY;
    if (setrlimit(RLIMIT_CORE, &rlim_new)!=0) {
       /* failed. try raising just to the old max */
       rlim_new.rlim_cur = rlim_new.rlim_max =
       rlim.rlim_max;
       (void) setrlimit(RLIMIT_CORE, &rlim_new);
    }
}

 

三、Linux系統調用--getrlimit/setrlimit函數詳解

用法:
include <sys/time.h>
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);


參數:
resource:可能的選擇有

RLIMIT_AS //進程的最大虛內存空間,字節爲單位。
RLIMIT_CORE //內核轉存文件的最大長度。設定最大的core文件,當值爲0時將禁止core文件非0時將設定產生的最大core文件大小爲設定的值
RLIMIT_CPU //最大允許的CPU使用時間,秒爲單位。當進程達到軟限制,內核將給其發送SIGXCPU信號,這一信號的默認行爲是終止進程的執行。然而,可以捕捉信號,處理句柄可將控制返回給主程序。如果進程繼續耗費CPU時間,核心會以每秒一次的頻率給其發送SIGXCPU信號,直到達到硬限制,那時將給進程發送 SIGKILL信號終止其執行。
RLIMIT_DATA //進程數據段的最大值。
RLIMIT_FSIZE //進程可建立的文件的最大長度。如果進程試圖超出這一限制時,核心會給其發送SIGXFSZ信號,默認情況下將終止進程的執行。
RLIMIT_LOCKS //進程可建立的鎖和租賃的最大值。
RLIMIT_MEMLOCK //進程可鎖定在內存中的最大數據量,字節爲單位。
RLIMIT_MSGQUEUE //進程可爲POSIX消息隊列分配的最大字節數。
RLIMIT_NICE //進程可通過setpriority() 或 nice()調用設置的最大完美值。
RLIMIT_NOFILE //指定比進程可打開的最大文件描述詞大一的值,超出此值,將會產生EMFILE錯誤。
RLIMIT_NPROC //用戶可擁有的最大進程數。

RLIMIT_RSS//最大駐內存集字節長度(RSS)如果物理存儲器供不應求則內核將從進程處取回超過RSS的部份
RLIMIT_RTPRIO //進程可通過sched_setscheduler 和 sched_setparam設置的最大實時優先級。
RLIMIT_SIGPENDING //用戶可擁有的最大掛起信號數。
RLIMIT_STACK //最大的進程堆棧,以字節爲單位。

rlim:描述資源軟硬限制的結構體,原型如下

struct rlimit {
    rlim_t rlim_cur; /* Soft limit */
    rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};

返回說明:
成功執行時,返回0。失敗返回-1,errno被設爲以下的某個值
EFAULT:rlim指針指向的空間不可訪問
EINVAL:參數無效
EPERM:增加資源限制值時,權能不允許

 

參考:http://www.cnblogs.com/yoleung/articles/1616659.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章