這一部分的提出是為了防止失控的進(jìn)程破壞系統(tǒng)的性能
nuix和Linux跟蹤進(jìn)程使用的大部分資源,允許用戶和系統(tǒng)管理員使用對(duì)進(jìn)程的資源限制
設(shè)置的限制有兩種: 硬限制和軟限制
硬限制是可以在任何時(shí)候任何進(jìn)程中設(shè)置 但硬限制只能由超級(jí)用戶提起
軟限制是內(nèi)核實(shí)際執(zhí)行的限制,任何進(jìn)程都可以將軟限制設(shè)置為任意小于等于對(duì)進(jìn)程限制的硬限制的值
———————以下內(nèi)容為轉(zhuǎn)載(突然發(fā)現(xiàn)這方面有好資源便直接引用了)—————————
getrlimit和setrlimit函數(shù)
每個(gè)進(jìn)程都有一組資源限制,其中某一些可以用getrlimit和setrlimit函數(shù)查詢和更改。
#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兩個(gè)函數(shù)
返回:若成功為0,出錯(cuò)為非0
對(duì)這兩個(gè)函數(shù)的每一次調(diào)用都指定一個(gè)資源以及一個(gè)指向下列結(jié)構(gòu)的指針。
struct rlimit{
rlim rlim rlimit_ur;/* 軟限制:當(dāng)前限制 */
rlim rlim rlim_ax;/* 硬限制:rlimcur的最大值 */
};
可用的值
RLIMIT _AS 進(jìn)程可用的內(nèi)存的最大數(shù)量,包括堆棧、全局變量、動(dòng)態(tài)內(nèi)存
RLIMIT _CORE 內(nèi)核生成的core文件的最大大小
RLIMIT _CPU 所用的全部cpu時(shí)間 以秒計(jì)算
RLIMIT _DATA 數(shù)據(jù)存儲(chǔ)的最大容量,以字節(jié)計(jì)算,不包括程序分配的動(dòng)態(tài)存儲(chǔ)空間
RLIMIT _FSIZE 打開文件的最大數(shù)目
RLIMIT _MEMLOCK
RLIMIT _NOFILE
RLIMIT _NPROC 進(jìn)程可以產(chǎn)生的最大子進(jìn)程數(shù)量
RLIMIT _RSS 可以隨時(shí)使用的內(nèi)存最大容量
RLIMIT _STACK 堆棧存儲(chǔ)區(qū)的最大容量
這兩個(gè)函數(shù)不屬于POSIX.1,但SVR4和4.3+BSD提供它們。SVR4在上面的結(jié)構(gòu)中使用基本系統(tǒng)數(shù)據(jù)類型rlim。其它系統(tǒng)則將這
兩個(gè)成員定義為整型或長(zhǎng)整型。
進(jìn)程的資源限制通常是在系統(tǒng)初啟時(shí)由0#進(jìn)程建立的,然后由后續(xù)進(jìn)程繼承。在SVR4中,系統(tǒng)默認(rèn)值可以查看文
件/etc/conf/cfd/mtune在4.3+BSD中,系統(tǒng)默認(rèn)值分散在多個(gè)頭文件中。
在更改資源限制時(shí),須遵循下列三條規(guī)則:
1.任何一個(gè)進(jìn)程都可將一個(gè)軟限制更改為小于或等于其硬限制。
2.任何一個(gè)進(jìn)程都可降低其硬限制值,但它必須大于或等于其軟限制值。這種降低,對(duì)普通用戶而言是不可逆反的。
3.只有超級(jí)用戶可以提高硬限制。
一個(gè)無(wú)限量的限制由常數(shù)RLIM NFINITY指定。
這兩個(gè)函數(shù)的resource參數(shù)取下列值之一。注意并非所有資源限制都受到SVR4和4.3+BSD的支持。
RLMITCORE(SVR4及4.3+BSD)core文件的最大字節(jié)數(shù),若其值為0則阻止創(chuàng)建core文件。
RLIMIT PU(SVR4及4.3+BSD)CPU時(shí)間的最大量值(秒),當(dāng)超過(guò)此軟限止時(shí),向該進(jìn)程發(fā)送SIGXCPU信號(hào)。
RLIMIT ATA(SVR4及4.3+BSD)數(shù)據(jù)段的最大字節(jié)長(zhǎng)度。這是圖7.3中初始化數(shù)據(jù)、非初始化數(shù)據(jù)以及堆的總和。
RLIMIT SIZE(SVR4及4.3+BSD)可以創(chuàng)建的一個(gè)文件的最大字節(jié)長(zhǎng)度。當(dāng)超過(guò)此軟限制時(shí),則向該進(jìn)程發(fā)送SIGFSZ信號(hào)。
RLIMIT EMLOCK(4.3+BSD)鎖定在存儲(chǔ)器地址空間(尚末實(shí)現(xiàn))。
RLIMIT OFILE(SVR4)每個(gè)進(jìn)程最多打開的文件數(shù)。更改此限制將影響到sysconf函數(shù)在參數(shù)-sc-OPEN-MAX中返回的值(2.5.4節(jié)
)。見程序2.3。
RLIMIT PROC(4.3+BSD)每個(gè)實(shí)際用戶ID所擁有的最大子進(jìn)程數(shù)。更改此限制將影響到sysconf函數(shù)在參數(shù) CHILDMAX中返回的
值(2.5.4節(jié))。
RLIMIT FILE(4.3+BSD)與SVR4的RLIMIT OFILE相同。
RLIMIT SS(4.3+BSD)最大駐內(nèi)存集字節(jié)長(zhǎng)度(RSS)。如果物理存儲(chǔ)器供子應(yīng)求,則系統(tǒng)核將從進(jìn)程處取回超過(guò)RSS的部分。
RLIMIT TACK(SVR4及4.3+BSD)棧的最大字節(jié)長(zhǎng)度。見圖7.3。
RLIMIT MEM(SVR4)可映照地址空間的最大字節(jié)長(zhǎng)度。這影響到mmap函數(shù)(12.9節(jié))。
資源限制影響到調(diào)用進(jìn)程并由其子進(jìn)程繼承。這就意味著為了影響一個(gè)用戶的所有后續(xù)進(jìn)程,需將資源限制設(shè)置構(gòu)造在shell
之中。確實(shí),Bourne Shell和Kornshell具有內(nèi)部ulimit命令,CShell具有內(nèi)部limit命令。(umask和chdir也必須是shell內(nèi)部的)
。
較早的BourmeShell,例如由貝克萊提供的一種,不支持ulimit命令。較新的KornShell的ulimit命令具有-H和-s選擇項(xiàng),以
分別檢查和修改硬和軟的限制,但它們尚末編寫入文檔。
?
?簡(jiǎn)單的用例:
#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);
}
---------------------------------------------------------------------------------------------------------------------------------------------
對(duì)每個(gè)進(jìn)程都有一組資源限制,其中一些可以用getrlimit和setrlimit函數(shù)查詢和更改
getrlimit和setrlimit:資源限制 (getrlimit and setrlimit: Resource Limits)
這兩個(gè)系統(tǒng)函數(shù)是和resource limit相關(guān)的。你用過(guò)ulimit命令嗎?(反正我沒(méi)用過(guò))
對(duì)于每個(gè)資源來(lái)說(shuō)有兩個(gè)limit:一個(gè)是hard limit,一個(gè)是soft limit,其中后者永遠(yuǎn)不能超過(guò)前者,并且只有擁有superuser權(quán)限的進(jìn)程可以更改前者。
getrlimit和setrlimit的參數(shù)相同:第一個(gè)參數(shù)是資源的類型,第二個(gè)參數(shù)是rlimit結(jié)構(gòu)的指針,這個(gè)結(jié)構(gòu)里面就只有兩個(gè)成員:hard limit和soft limit
幾個(gè)重要的資源類型
RLIMIT_CPU:程序執(zhí)行的最大CPU時(shí)間,單位是秒。超過(guò)之后程序中止,中止的信號(hào)是SIGXCPU
RLIMIT_DATA:程序執(zhí)行的最大內(nèi)存
RLIMIT_NPROC:程序孵出的最大子進(jìn)程數(shù)量
RLIMIT_NOFILE:程序打開的文件的最大數(shù)量
--------------------
如果你碰到類似的錯(cuò)誤提示
ulimit: max user processes: cannot modify limit: 不允許的操作
ulimit: open files: cannot modify limit: 不允許的操作
為啥root用戶是可以的?普通用戶又會(huì)遇到這樣的問(wèn)題?
看一下/etc/security/limits.conf大概就會(huì)明白。
linux對(duì)用戶有默認(rèn)的ulimit限制,而這個(gè)文件可以配置用戶的硬配置和軟配置,硬配置是個(gè)上限。
超出上限的修改就會(huì)出“不允許的操作”這樣的錯(cuò)誤。
在limits.conf加上
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240
就是限制了任意用戶的最大線程數(shù)和文件數(shù)為10240。