使用ulimit 命令、/etc/security/limits.conf航唆、proc 調(diào)整系統(tǒng)參數(shù)
Linux是有文件句柄限制的胀蛮,而且Linux默認(rèn)不是很高,一般都是1024糯钙,生產(chǎn)服務(wù)器用其實(shí)很容易就達(dá)到這個(gè)數(shù)量
系統(tǒng)總限制是在這里粪狼,/proc/sys/fs/file-max.可以通過(guò)cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
/proc/sys/fs/file-nr任岸,可以看到整個(gè)系統(tǒng)目前使用的文件句柄數(shù)量
在Linux下面部署應(yīng)用的時(shí)候再榄,有時(shí)候會(huì)遇上Socket/File: Can’t open so many files的問(wèn)題
在使用linux做為關(guān)鍵應(yīng)用的過(guò)程中,特別是大壓力負(fù)載的時(shí)候演闭,經(jīng)常會(huì)遇到一些諸如“too many open files”不跟,“系統(tǒng)默認(rèn)最大線程數(shù)是多少?如何調(diào)整米碰?”等問(wèn)題窝革。此時(shí),我們就必須使用ulimit或proc去調(diào)整系統(tǒng)的某些參數(shù)吕座。
查找文件句柄問(wèn)題的時(shí)候虐译,還有一個(gè)很實(shí)用的程序lsof.可以很方便看到某個(gè)進(jìn)程開了那些句柄.也可以看到某個(gè)文件/目錄被什么進(jìn)程占用了.
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
修改完重新登錄就可以見到,使用 ulimit -a 查看確認(rèn)
- ulimit 命令
1.只對(duì)當(dāng)前tty(終端有效)吴趴,若要每次都生效的話漆诽,可以把ulimit參數(shù)放到對(duì)應(yīng)用戶的.bash_profile里面;
2.ulimit命令本身就有分軟硬設(shè)置锣枝,加-H就是硬厢拭,加-S就是軟;
3.默認(rèn)顯示的是軟限制撇叁,如果運(yùn)行ulimit命令修改的時(shí)候沒有加上的話供鸠,就是兩個(gè)參數(shù)一起改變.生效;
+ 命令參數(shù)
-H 設(shè)置硬件資源限制.
-S 設(shè)置軟件資源限制.
-a 顯示當(dāng)前所有的資源限制.
-c size:設(shè)置core文件的最大值.單位:blocks
-d size:設(shè)置數(shù)據(jù)段的最大值.單位:kbytes
-f size:設(shè)置創(chuàng)建文件的最大值.單位:blocks
-l size:設(shè)置在內(nèi)存中鎖定進(jìn)程的最大值.單位:kbytes
-m size:設(shè)置可以使用的常駐內(nèi)存的最大值.單位:kbytes
-n size:設(shè)置內(nèi)核可以同時(shí)打開的文件描述符的最大值.單位:n
-p size:設(shè)置管道緩沖區(qū)的最大值.單位:kbytes
-s size:設(shè)置堆棧的最大值.單位:kbytes
-t size:設(shè)置CPU使用時(shí)間的最大上限.單位:seconds
-v size:設(shè)置虛擬內(nèi)存的最大值.單位:kbytes
unlimited 是一個(gè)特殊值陨闹,用于表示不限制
+ 設(shè)置
- 針對(duì)所有用戶的設(shè)置楞捂,在/etc/security/limits.conf文件,其是可以對(duì)系統(tǒng)用戶趋厉、組進(jìn)行cpu寨闹、文件數(shù)等限制的,通過(guò)它可以針對(duì)某個(gè)用戶或全部進(jìn)行限制君账。但不能超越系統(tǒng)的限制繁堡;
(*表示所有用戶、soft表示可以超出,但只是警告帖蔓;hard表示絕對(duì)不能超出矮瘟,unlimited用于表示不限制)
- 如果想對(duì)所有用戶設(shè)置,也可以放在/etc/profile文件里面塑娇,下面是該文件里面的默認(rèn)參數(shù):
ulimit -S -c 0 > /dev/null 2>&1
-
/proc 目錄
-
/proc 目錄包括很多系統(tǒng)當(dāng)前狀態(tài)的參數(shù)
/proc/meminfo
/proc/cpuinfo
/proc/sys/fs/file-max #系統(tǒng)總限制
/proc/sys/fs/file-nr #整個(gè)系統(tǒng)目前使用的文件句柄數(shù)量 proc目錄中的值可以進(jìn)行動(dòng)態(tài)的設(shè)置澈侠,若希望永久生效,可以修改/etc/sysctl.conf文件埋酬,并使用下面的命令確認(rèn): #sysctl -p
-
/etc/security/limit.conf
注意:要使 limits.conf 文件配置生效哨啃,必須要確保 pam_limits.so 文件被加入到啟動(dòng)文件中。查看 /etc/pam.d/login 文件中有:session required /lib/security/pam_limits.so
+ 描述
limits.conf文件實(shí)際是Linux PAM(插入式認(rèn)證模塊写妥,Pluggable Authentication Modules)中 pam_limits.so 的配置文件拳球,突破系統(tǒng)的默認(rèn)限制,對(duì)系統(tǒng)訪問(wèn)資源有一定保護(hù)作用珍特。 limits.conf 和sysctl.conf區(qū)別在于limits.conf是針對(duì)用戶祝峻,而sysctl.conf是針對(duì)整個(gè)系統(tǒng)參數(shù)配置。
+ 工作原理
limits.conf是 pam_limits.so的 配置文件扎筒,然后/etc/pam.d/下的應(yīng)用程序調(diào)用pam_***.so模塊莱找。譬如說(shuō),當(dāng)用戶 訪問(wèn)服務(wù)器嗜桌,服務(wù)程序?qū)⒄?qǐng)求發(fā)送到PAM模塊奥溺,PAM模塊根據(jù)服務(wù)名稱在/etc/pam.d目 錄下選擇一個(gè)對(duì)應(yīng)的服務(wù)文件,然后根據(jù)服務(wù)文件的內(nèi)容選擇具體的PAM模塊進(jìn)行處理
example:限制admin用戶登錄到sshd的服務(wù)不能超 過(guò)2個(gè)
在/etc/pam.d/sshd中添加:session required pam_limits.so
echo "session required pam_limits.so" >> /etc/pam.d/sshd
在/etc/security/limits.conf中添加:admin - maxlogins 2
注意:
查看應(yīng)用程序能否被PAM支持骨宠,用ldd
同理limits.conf要使用就必須保證/etc/pam.d/login 中有下面:session required pam_limits.so
+ 文件格式 username|@groupname type resource limit
1. username|@groupname
設(shè)置需要被限制的用戶名浮定,組名前面加@和用戶名區(qū)別。也可用通配符*來(lái)做所有用戶的限制
2. type soft层亿、hard桦卒、-
soft 指的是當(dāng)前系統(tǒng)生效的設(shè)置值。hard 表明系統(tǒng)中所能設(shè)定的最大值匿又。soft 的限制不能比har 限制高方灾。用 - 就表明同時(shí)設(shè)置了soft 和hard的值
3. resource: 表示要限制的資源
* core - 限制內(nèi)核文件的大小
core file : 當(dāng)一個(gè)程序崩潰時(shí),在進(jìn)程當(dāng)前工作目錄的core文件中復(fù)制了該進(jìn)程的存儲(chǔ)圖像琳省。core文件僅僅是一個(gè)內(nèi)存映象(同時(shí)加上調(diào)試信息),主要是用來(lái)調(diào)試的躲撰。core文件是個(gè)二進(jìn)制文件针贬,需要用相應(yīng)的工具來(lái)分析程序崩潰時(shí)的內(nèi)存映像,系統(tǒng)默認(rèn)core文件的大小為0拢蛋,所以沒有被創(chuàng)建桦他。可以用ulimit命令查看和修改core文件的大小。
#ulimit -c 0 #ulimit -c 1000 #ulimit -c unlimited
注意:如果想讓修改永久生效快压,則需要修改配置文件圆仔,如 .bash_profile、/etc/profile或/etc/security/limits.conf
* date - 最大數(shù)據(jù)大小
* fsize - 最大文件大小
* memlock - 最大鎖定內(nèi)存地址空間
* nofile - 打開文件的最大數(shù)目
對(duì)于需要做許多套接字連接并使它們處于打開狀態(tài)的應(yīng)用程序而言蔫劣,最好通過(guò)使用ulimit -n坪郭,或者通過(guò)設(shè)置nofile參數(shù),為用戶把文件描述符的數(shù)量設(shè)置得比默認(rèn)值高一些
* rss - 最大持久設(shè)置大小
* stack - 最大棧大小
* cpu - 以分鐘為單位的最多 CPU 時(shí)間
* noproc - 進(jìn)程的最大數(shù)目
* as - 地址空間限制
* maxlogins - 此用戶允許登錄的最大數(shù)目
4. 設(shè)置
* 暫時(shí)生效脉幢,ulimit 命令
* 永久生效歪沃,通過(guò)將一個(gè)相應(yīng)的 ulimit 語(yǔ)句添加到由登錄 shell 讀取的文件之一(例如 ~/.profile),即特定于 shell 的用戶資源文件嫌松;或者通過(guò)編輯 /etc/security/limits.conf