进程资源限制(rlimit)
在Linux系統(tǒng)中,Resouce limit指在一個進程的執(zhí)行過程中,它所能得到的資源的限制,比如進程的core file的最大值,虛擬內(nèi)存的最大值等。
Resouce limit的大小可以直接影響進程的執(zhí)行狀況。其有兩個最重要的概念:soft limit 和 hard limit。
struct rlimit {
rlim_t rlim_cur;
rlim_t rlim_max;
};
soft limit是指內(nèi)核所能支持的資源上限。比如對于RLIMIT_NOFILE(一個進程能打開的最大文件 數(shù),內(nèi)核默認是1024),soft limit最大也只能達到1024。對于RLIMIT_CORE(core文件的大小,內(nèi)核不做限制),soft limit最大能是unlimited。
hard limit在資源中只是作為soft limit的上限。當(dāng)你設(shè)置hard limit后,你以后設(shè)置的soft limit只能小于hard limit。要說明的是,hard limit只針對非特權(quán)進程,也就是進程的有效用戶ID(effective user ID)不是0的進程。具有特權(quán)級別的進程(具有屬性CAP_SYS_RESOURCE),soft limit則只有內(nèi)核上限。
我們可以來看一下下面兩條命令的輸出。
sishen@sishen:~$ ulimit -c -n -s
core file size (blocks, -c) 0
open files (-n) 1024
stack size (kbytes, -s) 8192
sishen@sishen:~$ ulimit -c -n -s -H
core file size (blocks, -c) unlimited
open files (-n) 1024
stack size (kbytes, -s) unlimited
-H表示顯示的是hard limit。從結(jié)果上可以看出soft limit和hard limit的區(qū)別。unlimited表示no limit, 即內(nèi)核的最大值。
對于resouce limit的讀取修改,有兩種方法。
使用shell內(nèi)建命令ulimit?
使用getrlimit和setrlimit API?
ulimit是改變shell的resouce limit,并達到改變shell啟動的進程的resouce limit效果(子進程繼承)。
usage:ulimit [-SHacdefilmnpqrstuvx [limit]]
當(dāng)不指定limit的時候,該命令顯示當(dāng)前值。這里要注意的是,當(dāng)你要修改limit的時候,如果不指定-S或者-H,默認是同時設(shè)置soft limit和hard limit。也就是之后設(shè)置時只能減不能增。所以,建議使用ulimit設(shè)置limit參數(shù)是加上-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) {
rlim_new.rlim_cur = rlim_new.rlim_max =
rlim.rlim_max;
(void) setrlimit(RLIMIT_CORE, &rlim_new);
}
}
?
setrligetrlimit和setrlimit函數(shù)
2008-07-03 17:20
每個進程都有一組資源限制,其中某一些可以用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兩個函數(shù)
返回:若成功為0,出錯為非0
對這兩個函數(shù)的每一次調(diào)用都指定一個資源以及一個指向下列結(jié)構(gòu)的指針。
struct rlimit{
rlim rlim ur;/* 軟限制:當(dāng)前限制 */
rlim rlim ax;/* 硬限制:rlimcur的最大值 */
};
這兩個函數(shù)不屬于POSIX.1,但SVR4和4.3+BSD提供它們。SVR4在上面的結(jié)構(gòu)中使用基本系統(tǒng)數(shù)據(jù)類型rlim。其它系統(tǒng)則將這兩個成員定義為整型或長整型。
進程的資源限制通常是在系統(tǒng)初啟時由0#進程建立的,然后由后續(xù)進程繼承。在SVR4中,系統(tǒng)默認值可以查看文件/etc/conf/cfd/mtune在4.3+BSD中,系統(tǒng)默認值分散在多個頭文件中。
在更改資源限制時,須遵循下列三條規(guī)則:
1.任何一個進程都可將一個軟限制更改為小于或等于其硬限制。
2.任何一個進程都可降低其硬限制值,但它必須大于或等于其軟限制值。這種降低,對普通用戶而言是不可逆反的。
3.只有超級用戶可以提高硬限制。
一個無限量的限制由常數(shù)RLIM NFINITY指定。
這兩個函數(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時間的最大量值(秒),當(dāng)超過此軟限止時,向該進程發(fā)送SIGXCPU信號。
RLIMIT ATA(SVR4及4.3+BSD)數(shù)據(jù)段的最大字節(jié)長度。這是圖7.3中初始化數(shù)據(jù)、非初始化數(shù)據(jù)以及堆的總和。
RLIMIT SIZE(SVR4及4.3+BSD)可以創(chuàng)建的一個文件的最大字節(jié)長度。當(dāng)超過此軟限制時,則向該進程發(fā)送SIGFSZ信號。
RLIMIT EMLOCK(4.3+BSD)鎖定在存儲器地址空間(尚末實現(xiàn))。
RLIMIT OFILE(SVR4)每個進程最多打開的文件數(shù)。更改此限制將影響到sysconf函數(shù)在參數(shù)-sc-OPEN-MAX中返回的值(2.5.4節(jié))。見程序2.3。
RLIMIT PROC(4.3+BSD)每個實際用戶ID所擁有的最大子進程數(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é)長度(RSS)。如果物理存儲器供子應(yīng)求,則系統(tǒng)核將從進程處取回超過RSS的部分。
RLIMIT TACK(SVR4及4.3+BSD)棧的最大字節(jié)長度。見圖7.3。
RLIMIT MEM(SVR4)可映照地址空間的最大字節(jié)長度。這影響到mmap函數(shù)(12.9節(jié))。
資源限制影響到調(diào)用進程并由其子進程繼承。這就意味著為了影響一個用戶的所有后續(xù)進程,需將資源限制 設(shè)置構(gòu)造在shell之中。確實,Bourne Shell和Kornshell具有內(nèi)部ulimit命令,CShell具有內(nèi)部limit命令。(umask和chdir也必須是shell內(nèi)部的)。
較早的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);
面列表為unix/linux 系統(tǒng)單進程資源參數(shù)限制,服務(wù)器開發(fā)中?RLIMIT_CORE 參數(shù)用得多(當(dāng)需要產(chǎn)生core dump時)。
?
代碼片段:
?
[cpp]?view plaincopy?
?
?
| 名稱 | 意義 |
| RLIMIT_AS | 進程總共可用的內(nèi)存大小的最大值 |
| RLIMIT_CORE | core文件的最大尺寸,如果為0說明不能創(chuàng)建core文件 |
| RLIMIT_CPU | CPU時間的最大值(單位:秒) |
| RLIMIT_DATA | 數(shù)據(jù)段大小的最大值 |
| RLIMIT_FSIZE | 創(chuàng)建文件的大小的最大值 |
| RLIMIT_LOCKS | 進程可建立的文件鎖的數(shù)量的最大值 |
| RLIMIT_MEMLOCK | 進程中使用mlock鎖定內(nèi)存的最大尺寸 |
| RLIMIT_NOFILE | 進程中文件的打開數(shù)量的最大值 |
| RLIMIT_NPROC | 每個real user id的子進程數(shù)量的最大值 |
| RLIMIT_RSS | 最大常駐存儲區(qū)大小 |
| RLIMIT_SBSIZE | socket緩沖的大小的最大值 |
| RLIMIT_STACK | 棧的最大尺寸 |
| RLIMIT_VMEM | =RLIMIT_AS |
?
?
平臺支持
?
| 限制 | FreeBSD 5.2.1 | Linux 2.4.22 | Mac OS X 10.3 | Solaris 9 |
| RLIMIT_AS | N | ? | N | ? |
| RLIMIT_CORE | ? | ? | ? | ? |
| RLIMIT_CPU | ? | ? | ? | ? |
| RLIMIT_DATA | ? | ? | ? | ? |
| RLIMIT_FSIZE | ? | ? | ? | ? |
| RLIMIT_LOCKS | N | ? | N | N |
| RLIMIT_MEMLOCK | ? | ? | ? | N |
| RLIMIT_NOFILE | ? | ? | ? | ? |
| RLIMIT_NPROC | ? | ? | ? | N |
| RLIMIT_RSS | ? | ? | ? | N |
| RLIMIT_SBSIZE | ? | N | N | N |
| RLIMIT_STACK | ? | ? | ? | ? |
| RLIMIT_VMEM | ? | N | N |
ulimit命令優(yōu)化linux進程連接數(shù)等限
制
在Linux下面部署應(yīng)用的時候,有時候會遇上Socket/File: Can’t open so many files的問題,比如還有Squid做代理,當(dāng)文件打開數(shù)到900多時速能就非常快的下降,有可能打不開網(wǎng)頁.其實Linux是有文件句柄限制的,而且Linux默認不是很高,一般都是1024,生產(chǎn)服務(wù)器用其實很容易就達到這個數(shù)量.
[root@mail data]# ulimit -a
core file size?????????? (blocks, -c) 0
data seg size?????????? (kbytes, -d) unlimited
scheduling priority???????????? (-e) 0
file size?????????????? (blocks, -f) unlimited
pending signals???????????????? (-i) 66560
max locked memory?????? (kbytes, -l) 32
max memory size???????? (kbytes, -m) unlimited
open files?????????????????????? (-n) 8192
pipe size???????????? (512 bytes, -p) 8
POSIX message queues???? (bytes, -q) 819200
real-time priority?????????????? (-r) 0
stack size?????????????? (kbytes, -s) 10240
cpu time?????????????? (seconds, -t) unlimited
max user processes?????????????? (-u) 66560
virtual memory?????????? (kbytes, -v) unlimited
file locks?????????????????????? (-x) unlimited
[separator]
???? 其中 “open files (-n) 1024 “是Linux操作系統(tǒng)對一個進程打開的文件句柄數(shù)量的限制(也包含打開的SOCKET數(shù)量,可影響MySQL的并發(fā)連接數(shù)目).這個值可用ulimit 命令來修改,但ulimit命令修改的數(shù)值只對當(dāng)前登錄用戶的目前使用環(huán)境有效,系統(tǒng)重啟或者用戶退出后就會失效.
???? 系統(tǒng)總限制是在這里,/proc/sys/fs/file-max.可以通過cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
???? 另外還有一個,/proc/sys/fs/file-nr,可以看到整個系統(tǒng)目前使用的文件句柄數(shù)量
???? 查找文件句柄問題的時候,還有一個很實用的程序lsof.可以很方便看到某個進程開了那些句柄.也可以看到某個文件/目錄被什么進程占用了
[root@kyouwar data0]# cat /proc/sys/fs/file-max
372901
[root@kyouwar data0]# cat /proc/sys/fs/file-nr?
3200???? 0?????? 372901
=====================================
ulimit 用于shell啟動進程所占用的資源。
可以使用該命令查看進程占用資源的情況。
使用方法:ulimit [-acdfHlmnpsStvw] [size]
-H 設(shè)置硬件資源限制.
-S 設(shè)置軟件資源限制.
-a 顯示當(dāng)前所有的資源限制.
-c size:設(shè)置core文件的最大值.單位:blocks
-d size:設(shè)置數(shù)據(jù)段的最大值.單位:kbytes?
???? ulimit -d unlimited?
-f size:設(shè)置創(chuàng)建文件的最大值.單位:blocks
-l size:設(shè)置在內(nèi)存中鎖定進程的最大值.單位:kbytes
-m size:設(shè)置可以使用的常駐內(nèi)存的最大值.單位:kbytes
???? ulimit -m unlimited
-n size:設(shè)置內(nèi)核可以同時打開的文件描述符的最大值【每個進程可以打開的文件數(shù)目】【也包含打開的SOCKET數(shù)量,可影響MySQL的并發(fā)連接數(shù)目】.單位:n
-p size:設(shè)置管道緩沖區(qū)的最大值.單位:kbytes
-s size:設(shè)置堆棧的最大值.單位:kbytes
???? ulimit -s unlimited
-t size:設(shè)置CPU使用時間的最大上限.單位:seconds
???? ulimit -t unlimited?
-v size:設(shè)置虛擬內(nèi)存的最大值.單位:kbytes 5
-u 設(shè)置各linux 用戶的最大進程數(shù)
???? ulimit -u 10000?
============================================
#暫時修改直接使用
???? ulimit -參數(shù) xx
如:
?? 同時修改軟硬設(shè)置?? ulimit -SHn 4500
----------------------------------------------------
# 永久地,通過將一個相應(yīng)的 ulimit 語句添加到由登錄 shell 讀取的文件中, 即特定于 shell 的用戶資源文件,如
1)、解除 Linux 系統(tǒng)的最大進程數(shù)和最大文件打開數(shù)限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 8192
* hard nofile 8192
#如此每次用戶登錄后就依照此值設(shè)置。
說明:* 代表針對所有用戶
noproc 是代表最大進程數(shù)
nofile 是代表最大文件打開數(shù)
???? 可以將文件句柄限制統(tǒng)一改成軟11000,硬11000.配置文件最前面的是指domain,設(shè)置為星號代表全局,另外你也可以針對不同的用戶做出不同的限制
???? 注意.這個當(dāng)中的硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning.其實ulimit命令本身就有分軟硬設(shè)置,加-H就是硬,加-S就是軟
???? 默認顯示的是軟限制,如果運行ulimit命令修改的時候沒有加上的話,就是兩個參數(shù)一起改變.
============================================
2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
???????? a、vi /etc/ssh/sshd_config?
???????????? 把 UserLogin 的值改為 yes,并把 # 注釋去掉
???????? b、重啟 sshd 服務(wù):
?????????????? /etc/init.d/sshd restart
#新版本好像不用設(shè)置這個!也沒有這個配置選項
============================================
3)、修改所有 linux 用戶的環(huán)境變量文件:
vi /etc/profile
ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited
============================================
4)、生效
???? 修改完重新登錄就可以見到.可以用ulimit -a 查看確認.)
----------------------------------------------------
???? 注意:如果你使用squid的話,你要在/etc/init.d/squid的文件加入ulimit -HSn 65535.另外,在squid.conf中也要加入max_filedesc 16384
============================================
特殊說明:
?? 注:上面這種方式只是改變了用戶登陸系統(tǒng)后的文件打開數(shù),對于/etc/init.d /nginx這種的啟動腳本并不起作用,像這種啟動腳本,需要在腳本內(nèi) 程序命令前加一行:
?? ulimit -HSn 65535
============================================
補充:可不設(shè)置
???? 生產(chǎn)服務(wù)器的配置說明
???? 有時候在程序里面需要打開多個文件,進行分析,系統(tǒng)一般默認數(shù)量是1024,(用ulimit -a可以看到)對于正常使用是夠了,但是對于程序來講,就太少了。
修改2個文件。
1./etc/security/limits.conf
vi /etc/security/limits.conf
加上:
* soft nofile 8192
* hard nofile 20480
----------------------------------------------------
2./etc/pam.d/login
session required /lib/security/pam_limits.so
?? 另外確保/etc/pam.d/system-auth文件有下面內(nèi)容
session required /lib/security/$ISA/pam_limits.so
?? 這一行確保系統(tǒng)會執(zhí)行這個限制。
----------------------------------------------------
3.一般用戶的.bash_profile
#ulimit -n 1024
重新登陸ok
轉(zhuǎn)載于:https://www.cnblogs.com/nealgavin/p/3797473.html
總結(jié)
以上是生活随笔為你收集整理的进程资源限制(rlimit)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系列:Ubuntu/fedor
- 下一篇: 暴露了智商