Linux系統的資源使用限制


  1、getrlimit和setrlimit

#include <sys/resource.h>
// 獲取或設置指定資源的使用限制
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

  每種資源都有相應的軟限制和硬限制,如以下結構所定義的:

struct rlimit {
    rlim_t rlim_cur;  // 軟限制。任何進程可將它設置為0~rlim_max
    rlim_t rlim_max;  // 硬限制(軟限制的上限)
};

  普通進程只能不可逆地降低它的硬限制(且不能小於軟限制)。超級用戶進程或具有CAP_SYS_RESOURCE能力的進程可以隨意改變它的兩個限制值。

  RLIM_INFINITY值表示在一個資源上沒有使用限制。在某些系統實現上,rlim_t是8字節無符號整數,而RLIM_INFINITY就是rlim_t類型的最大值。

  resource參數的常用值:

  RLIMIT_AS:進程虛擬內存(地址空間,Address Space)的最大字節長度。該限制會影響brk、mmap和mremap等。

  RLIMIT_CORE:core文件的最大字節長度。超出這個大小的core文件會被截短。指定0則表示不產生core文件。

  RLIMIT_CPU:CPU時間的使用限制(秒)。進程達到軟限制時,會收到一個SIGXCPU信號(默認會終止進程。但進程可以捕獲該信號)。如果進程繼續消耗CPU時間,它會每秒收到一個SIGXCPU信號,直到達到硬限制,並接收到SIGKILL信號(不同的實現在此處可能會有差別)。

  RLIMIT_DATA:進程數據段(初始化數據節、未初始化數據節和堆)的最大字節長度。該限制會影響brk和sbrk等。

  RLIMIT_FSIZE:進程所能創建的文件的最大字節長度。

  RLIMIT_LOCKS:進程可創建的flock鎖和fcntl租借鎖的總數(租借鎖是Linux特有的:fcntl可通過F_SETLEASE命令對文件加讀或寫的租借鎖。當另一個進程嘗試打開或截短該文件而產生沖突時,內核會通過信號通知持有租借鎖的進程。后者應當對此作出響應,如flush緩沖區或移除租借鎖等)。

  RLIMIT_MEMLOCK:進程使用mlock能夠鎖定在RAM中的最大字節長度(防止被換出到交換分區。內存的鎖定和解鎖以頁為單位)。該限制會影響mlock、mlockall和mmap等。

  RLIMIT_MSGQUEUE:調用進程的實際用戶所能分配的Posix消息隊列的最大字節長度。

  RLIMIT_NOFILE:進程所能打開(如使用open/pipe/socket)的文件描述符的最大值加1。注意,進程間的文件描述符是獨立的。超出該限制會拋出EMFILE錯誤。

  RLIMIT_NPROC:調用進程的實際用戶所能創建進程(在Linux上,更准確的說法是線程)的最大數目。超出該限制時,fork會失敗並拋出EAGAIN錯誤。

  RLIMIT_STACK:進程的棧的最大字節長度。超出該限制會收到SIGSEGV信號。

 

  2、ulimit:獲取或設置指定資源的使用限制。

  進程的資源限制通常是在系統初始化時由init進程建立的,然后由每個后續進程繼承。這就意味着為了影響一個用戶的所有后續進程,需要將資源限制的設置構造在shell之中(如bash中的ulimit)。

  1)常用選項:-H:指定硬限制,一般與其他選項一起使用;-S:指定軟限制,一般與其他選項一起使用;-a:列出所有的限制值;-c:core文件的最大大小;-f:此shell及其子進程可建立的文件的最大大小;-d:進程數據段的最大大小;-l:可鎖定內存的最大大小;-t:可用的最大CPU時間;-u:單一用戶所能創建的最大進程數。

 

 

 

不斷學習中。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM