Linux 硬限制和軟限制


http://www.cppblog.com/API/archive/2012/03/19/168289.html

 

這一部分的提出是為了防止失控的進程破壞系統的性能

nuix和Linux跟蹤進程使用的大部分資源,允許用戶和系統管理員使用對進程的資源限制

 設置的限制有兩種: 硬限制和軟限制

硬限制是可以在任何時候任何進程中設置  但硬限制只能由超級用戶提起

軟限制是內核實際執行的限制,任何進程都可以將軟限制設置為任意小於等於對進程限制的硬限制的值


———————以下內容為轉載(突然發現這方面有好資源便直接引用了)—————————

getrlimit和setrlimit函數 
  每個進程都有一組資源限制,其中某一些可以用getrlimit和setrlimit函數查詢和更改。

#include 
#include 
int getrlimit(int resource,struct rlimit *rlptr);
int setrlimit(int resource,const struct rlimit rlptr);
Both return: 0 if OK,nonzero on error兩個函數

  返回:若成功為0,出錯為非0

  對這兩個函數的每一次調用都指定一個資源以及一個指向下列結構的指針。

struct rlimit{
rlim rlim rlimit_ur;/* 軟限制:當前限制 */
rlim rlim rlim_ax;/* 硬限制:rlimcur的最大值 */
};

可用的值

RLIMIT _AS                進程可用的內存的最大數量,包括堆棧、全局變量、動態內存

RLIMIT _CORE           內核生成的core文件的最大大小

RLIMIT _CPU             所用的全部cpu時間 以秒計算

RLIMIT _DATA           數據存儲的最大容量,以字節計算,不包括程序分配的動態存儲空間

RLIMIT _FSIZE          打開文件的最大數目

RLIMIT _MEMLOCK  

RLIMIT _NOFILE      

RLIMIT _NPROC       進程可以產生的最大子進程數量

RLIMIT _RSS            可以隨時使用的內存最大容量

RLIMIT _STACK        堆棧存儲區的最大容量


  這兩個函數不屬於POSIX.1,但SVR4和4.3+BSD提供它們。SVR4在上面的結構中使用基本系統數據類型rlim。其它系統則將這

兩個成員定義為整型或長整型。

  進程的資源限制通常是在系統初啟時由0#進程建立的,然后由后續進程繼承。在SVR4中,系統默認值可以查看文

件/etc/conf/cfd/mtune在4.3+BSD中,系統默認值分散在多個頭文件中。

  在更改資源限制時,須遵循下列三條規則:

  1.任何一個進程都可將一個軟限制更改為小於或等於其硬限制。
  2.任何一個進程都可降低其硬限制值,但它必須大於或等於其軟限制值。這種降低,對普通用戶而言是不可逆反的。
  3.只有超級用戶可以提高硬限制。

  一個無限量的限制由常數RLIM NFINITY指定。

  這兩個函數的resource參數取下列值之一。注意並非所有資源限制都受到SVR4和4.3+BSD的支持。

  RLMITCORE(SVR4及4.3+BSD)core文件的最大字節數,若其值為0則阻止創建core文件。
  RLIMIT PU(SVR4及4.3+BSD)CPU時間的最大量值(秒),當超過此軟限止時,向該進程發送SIGXCPU信號。
  RLIMIT ATA(SVR4及4.3+BSD)數據段的最大字節長度。這是圖7.3中初始化數據、非初始化數據以及堆的總和。
  RLIMIT SIZE(SVR4及4.3+BSD)可以創建的一個文件的最大字節長度。當超過此軟限制時,則向該進程發送SIGFSZ信號。
  RLIMIT EMLOCK(4.3+BSD)鎖定在存儲器地址空間(尚末實現)。
  RLIMIT OFILE(SVR4)每個進程最多打開的文件數。更改此限制將影響到sysconf函數在參數-sc-OPEN-MAX中返回的值(2.5.4節

)。見程序2.3。
  RLIMIT PROC(4.3+BSD)每個實際用戶ID所擁有的最大子進程數。更改此限制將影響到sysconf函數在參數 CHILDMAX中返回的

值(2.5.4節)。
  RLIMIT FILE(4.3+BSD)與SVR4的RLIMIT OFILE相同。
  RLIMIT SS(4.3+BSD)最大駐內存集字節長度(RSS)。如果物理存儲器供子應求,則系統核將從進程處取回超過RSS的部分。
  RLIMIT TACK(SVR4及4.3+BSD)棧的最大字節長度。見圖7.3。
  RLIMIT MEM(SVR4)可映照地址空間的最大字節長度。這影響到mmap函數(12.9節)。

  資源限制影響到調用進程並由其子進程繼承。這就意味着為了影響一個用戶的所有后續進程,需將資源限制設置構造在shell

之中。確實,Bourne Shell和Kornshell具有內部ulimit命令,CShell具有內部limit命令。(umask和chdir也必須是shell內部的)

  較早的BourmeShell,例如由貝克萊提供的一種,不支持ulimit命令。較新的KornShell的ulimit命令具有-H和-s選擇項,以

分別檢查和修改硬和軟的限制,但它們尚末編寫入文檔。

?

?簡單的用例:

#include<sys/time.h>
#include<sys/resource.h>
#include<unistd.h>
int main()
{
  struct rlimit limit;
 char p = '1';
 limit.rlim_cur = RLIM_INFINITY;
 limit.rlim_max = RLIM_INFINITY;
 if(setrlimit(RLIMIT_CORE, &limit))
 {
  printf("set limit failed/n");
 }

 printf("p = %s/n",p);



---------------------------------------------------------------------------------------------------------------------------------------------

對每個進程都有一組資源限制,其中一些可以用getrlimit和setrlimit函數查詢和更改

getrlimit和setrlimit:資源限制 (getrlimit and setrlimit: Resource Limits)

這兩個系統函數是和resource limit相關的。你用過ulimit命令嗎?(反正我沒用過) 
對於每個資源來說有兩個limit:一個是hard limit,一個是soft limit,其中后者永遠不能超過前者,並且只有擁有superuser權限的進程可以更改前者。 
getrlimit和setrlimit的參數相同:第一個參數是資源的類型,第二個參數是rlimit結構的指針,這個結構里面就只有兩個成員:hard limit和soft limit 
幾個重要的資源類型 
RLIMIT_CPU:程序執行的最大CPU時間,單位是秒。超過之后程序中止,中止的信號是SIGXCPU 
RLIMIT_DATA:程序執行的最大內存 
RLIMIT_NPROC:程序孵出的最大子進程數量 
RLIMIT_NOFILE:程序打開的文件的最大數量


--------------------
如果你碰到類似的錯誤提示
ulimit: max user processes: cannot modify limit: 不允許的操作 
ulimit: open files: cannot modify limit: 不允許的操作

為啥root用戶是可以的?普通用戶又會遇到這樣的問題?
看一下/etc/security/limits.conf大概就會明白。
linux對用戶有默認的ulimit限制,而這個文件可以配置用戶的硬配置和軟配置,硬配置是個上限。
超出上限的修改就會出“不允許的操作”這樣的錯誤。

在limits.conf加上
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240

就是限制了任意用戶的最大線程數和文件數為10240。 


免責聲明!

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



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