进程资源限制(rlimit)
在Linux系統中,Resouce limit指在一個進程的執行過程中,它所能得到的資源的限制,比如進程的core file的最大值,虛擬內存的最大值等。
Resouce limit的大小可以直接影響進程的執行狀況。其有兩個最重要的概念:soft limit 和 hard limit。
struct rlimit {
rlim_t rlim_cur;
rlim_t rlim_max;
};
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則只有內核上限。
我們可以來看一下下面兩條命令的輸出。
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。從結果上可以看出soft limit和hard limit的區別。unlimited表示no 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) {
rlim_new.rlim_cur = rlim_new.rlim_max =
rlim.rlim_max;
(void) setrlimit(RLIMIT_CORE, &rlim_new);
}
}
?
setrligetrlimit和setrlimit函數
2008-07-03 17:20
每個進程都有一組資源限制,其中某一些可以用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 ur;/* 軟限制:當前限制 */
rlim rlim ax;/* 硬限制:rlimcur的最大值 */
};
這兩個函數不屬于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);
面列表為unix/linux 系統單進程資源參數限制,服務器開發中?RLIMIT_CORE 參數用得多(當需要產生core dump時)。
?
代碼片段:
?
[cpp]?view plaincopy?
?
?
| 名稱 | 意義 |
| RLIMIT_AS | 進程總共可用的內存大小的最大值 |
| RLIMIT_CORE | core文件的最大尺寸,如果為0說明不能創建core文件 |
| RLIMIT_CPU | CPU時間的最大值(單位:秒) |
| RLIMIT_DATA | 數據段大小的最大值 |
| RLIMIT_FSIZE | 創建文件的大小的最大值 |
| RLIMIT_LOCKS | 進程可建立的文件鎖的數量的最大值 |
| RLIMIT_MEMLOCK | 進程中使用mlock鎖定內存的最大尺寸 |
| RLIMIT_NOFILE | 進程中文件的打開數量的最大值 |
| RLIMIT_NPROC | 每個real user id的子進程數量的最大值 |
| RLIMIT_RSS | 最大常駐存儲區大小 |
| 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命令優化linux進程連接數等限
制
在Linux下面部署應用的時候,有時候會遇上Socket/File: Can’t open so many files的問題,比如還有Squid做代理,當文件打開數到900多時速能就非常快的下降,有可能打不開網頁.其實Linux是有文件句柄限制的,而且Linux默認不是很高,一般都是1024,生產服務器用其實很容易就達到這個數量.
[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操作系統對一個進程打開的文件句柄數量的限制(也包含打開的SOCKET數量,可影響MySQL的并發連接數目).這個值可用ulimit 命令來修改,但ulimit命令修改的數值只對當前登錄用戶的目前使用環境有效,系統重啟或者用戶退出后就會失效.
???? 系統總限制是在這里,/proc/sys/fs/file-max.可以通過cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
???? 另外還有一個,/proc/sys/fs/file-nr,可以看到整個系統目前使用的文件句柄數量
???? 查找文件句柄問題的時候,還有一個很實用的程序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 設置硬件資源限制.
-S 設置軟件資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes?
???? ulimit -d unlimited?
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
???? ulimit -m unlimited
-n size:設置內核可以同時打開的文件描述符的最大值【每個進程可以打開的文件數目】【也包含打開的SOCKET數量,可影響MySQL的并發連接數目】.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
???? ulimit -s unlimited
-t size:設置CPU使用時間的最大上限.單位:seconds
???? ulimit -t unlimited?
-v size:設置虛擬內存的最大值.單位:kbytes 5
-u 設置各linux 用戶的最大進程數
???? ulimit -u 10000?
============================================
#暫時修改直接使用
???? ulimit -參數 xx
如:
?? 同時修改軟硬設置?? ulimit -SHn 4500
----------------------------------------------------
# 永久地,通過將一個相應的 ulimit 語句添加到由登錄 shell 讀取的文件中, 即特定于 shell 的用戶資源文件,如
1)、解除 Linux 系統的最大進程數和最大文件打開數限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 8192
* hard nofile 8192
#如此每次用戶登錄后就依照此值設置。
說明:* 代表針對所有用戶
noproc 是代表最大進程數
nofile 是代表最大文件打開數
???? 可以將文件句柄限制統一改成軟11000,硬11000.配置文件最前面的是指domain,設置為星號代表全局,另外你也可以針對不同的用戶做出不同的限制
???? 注意.這個當中的硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning.其實ulimit命令本身就有分軟硬設置,加-H就是硬,加-S就是軟
???? 默認顯示的是軟限制,如果運行ulimit命令修改的時候沒有加上的話,就是兩個參數一起改變.
============================================
2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
???????? a、vi /etc/ssh/sshd_config?
???????????? 把 UserLogin 的值改為 yes,并把 # 注釋去掉
???????? b、重啟 sshd 服務:
?????????????? /etc/init.d/sshd restart
#新版本好像不用設置這個!也沒有這個配置選項
============================================
3)、修改所有 linux 用戶的環境變量文件:
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
============================================
特殊說明:
?? 注:上面這種方式只是改變了用戶登陸系統后的文件打開數,對于/etc/init.d /nginx這種的啟動腳本并不起作用,像這種啟動腳本,需要在腳本內 程序命令前加一行:
?? ulimit -HSn 65535
============================================
補充:可不設置
???? 生產服務器的配置說明
???? 有時候在程序里面需要打開多個文件,進行分析,系統一般默認數量是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文件有下面內容
session required /lib/security/$ISA/pam_limits.so
?? 這一行確保系統會執行這個限制。
----------------------------------------------------
3.一般用戶的.bash_profile
#ulimit -n 1024
重新登陸ok
轉載于:https://www.cnblogs.com/nealgavin/p/3797473.html
總結
以上是生活随笔為你收集整理的进程资源限制(rlimit)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系列:Ubuntu/fedor
- 下一篇: 暴露了智商