Linux對於每一個用戶,系統限制其最大進程數。爲提升性能,能夠根據設備資源狀況,設置各linux 用戶的最大進程數。前端
ulimit主要是用來限制進程對資源的使用狀況的,它支持各類類型的限制,經常使用的有:
內核文件的大小限制
進程數據塊的大小限制
Shell進程建立文件大小限制
可加鎖內存大小限制
常駐內存集的大小限制
打開文件句柄數限制
分配堆棧的最大大小限制
CPU佔用時間限制用戶最大可用的進程數限制
Shell進程所能使用的最大虛擬內存限制
有個疑問:服務器資源是有限制的,limits.conf會限制資源,可是對於ulimit來講限制是粒度是哪些? linux
1)用戶 ? 進程? shell
2)若是是進程的限制,系統中會有多個進程,那全部的進程同時須要受限於用戶或整個系統的資源限制。vim
ulimit使用的基本格式爲:ulimit [options] [limit]centos
具體的options參數含義以下表所示:tomcat
選項 含義 -a 顯示當前系統全部的limit資源信息。 -H 設置硬資源限制,一旦設置不能增長。 -S 設置軟資源限制,設置後能夠增長,可是不能超過硬資源設置。 -c 最大的core文件的大小,以 blocks 爲單位。 -f 進程能夠建立文件的最大值,以blocks 爲單位. -d 進程最大的數據段的大小,以Kbytes 爲單位。 -m 最大內存大小,以Kbytes爲單位。 -n 查看進程能夠打開的最大文件描述符的數量。 -s 線程棧大小,以Kbytes爲單位。 -p 管道緩衝區的大小,以Kbytes 爲單位。 -u 用戶最大可用的進程數。 -v 進程最大可用的虛擬內存,以Kbytes 爲單位。 -t 最大CPU佔用時間,以秒爲單位。 -l 最大可加鎖內存大小,以Kbytes 爲單位。
其中ulimit -n用於限制進程可以打開的文件描述符的最大數目。由於任何設備在linux下都是文件,通訊的接口也有專門的接口文件負責,因此linux下進程tcp連接的最大併發量也受限於該值。bash
[root@centos5 ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited max nice (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 4096 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 max rt priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 4096 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited||<
其中 "open files (-n) 1024 "是Linux操做系統對一個進程打開的文件句柄數量的限制(也包含打開的SOCKET數量,可影響MySQL的併發鏈接數目)。服務器
這個值可用ulimit 命令來修改,但ulimit命令修改的數值只對當前登陸用戶的目前使用環境有效,系統重啓或者用戶退出後就會失效.markdown
有時候爲了方便起見,也能夠將用戶資源的限制統一由一個文件來配置,這個文件就是/etc/security/limits.conf,該文件不但能對指定用戶的資源進行限制,還能對指定組的資源進行限制。該文件的使用規則以下:session
<domain> <type> <item> <value>
其中:
domain表示用戶或者組的名字,還可使用 * 做爲通配符,表示任何用戶或用戶組。
Type 表示限制的類型,能夠有兩個值,soft 和 hard,分別表示軟、硬資源限制。軟限制是指限制用戶同時打開的文件數目,硬限制是指系統根據硬件資源(主要指內存)計算出來的最多可打開的文件數目。一般軟限制低於硬限制;建議不要將軟限制和硬限制修改過大。
item 表示須要限定的資源名稱,經常使用的有nofile、cpu、stack等。分別表示最大打開句柄數、佔用的cpu時間、最大的堆棧大小。
value 表示限制各類資源的具體數值。
除了limits.conf文件以外,還有一個/etc/security/limits.d目錄,能夠將資源限制建立一個文件放到這個目錄中,默認系統會首先去讀取這個目錄下的全部文件,而後纔去讀取limits.conf文件。全部資源限制設置完成後,退出shell終端,再次登陸shell終端後,ulimit設置便可自動生效。
注意:各類配置的生效方式。
對於須要作許多 socket 鏈接並使它們處於打開狀態的Java 應用程序而言,最好經過使用 ulimit -n xx 修改每一個進程可打開的文件數,缺省值是 1024。
ulimit -n 4096 將每一個進程能夠打開的文件數目加大到4096,缺省爲1024
其餘建議設置成無限制(unlimited)的一些重要設置是:
數據段長度:ulimit -d unlimited
最大內存大小:ulimit -m unlimited
堆棧大小:ulimit -s unlimited
CPU 時間:ulimit -t unlimited
虛擬內存:ulimit -v unlimited
配置生效方式
暫時地,適用於經過 ulimit 命令登陸 shell 會話期間。
永久地,經過將一個相應的 ulimit 語句添加到由登陸 shell 讀取的文件中, 即特定於 shell 的用戶資源文件,如:
1)、解除 Linux 系統的最大進程數和最大文件打開數限制:
vi /etc/security/limits.conf
# 添加以下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100
說明:* 表明針對全部用戶,noproc 是表明最大進程數,nofile 是表明最大文件打開數
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
保存後運行#source /etc/profile 使其生效
在使用ulimit時,有如下幾種使用方法:
(1)在用戶環境變量中加入
若是用戶使用的是bash,那麼就能夠在用戶目錄的環境變量文件.bashrc或者.bash_profile中加入「ulimit -u 128」來限制用戶最多可使用128個進程。
(2)在應用程序的啓動腳本中加入
若是應用程序是tomcat,那麼就能夠在tomcat的啓動腳本startup.sh腳本中加入「ulimit -n 65535」來限制用戶最多可使用65535個文件描述符。
(3)直接在shell命令終端執行ulimit命令
這種方法的資源限制僅僅在執行命令的終端生效,退出或者關閉終端後,設置失效,而且這個設置不影響其它shell終端。
公司服務器須要調整 ulimit的stack size 參數調整爲unlimited 無限,使用ulimit -s unlimited時只能在當時的shell見效,重開一個shell就失效了。。因而得在/etc/profile 的最後面添加ulimit -s unlimited 就能夠了,source /etc/profile使修改文件生效。
若是碰到相似的錯誤提示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。
查看系統級別資源限制:
1.系統級別:
sysctl -a (-a:顯示當前全部可用的值)
系統總限制:cat /proc/sys/fs/file-max 等一系列值,修改/etc/sysctl.conf 中也能夠控制
/proc/sys/fs/file-nr,能夠看到整個系統目前使用的文件句柄數量
修改此硬限制的方法是修改/etc/rc.local腳本,在腳本中添加以下行:
echo 8000037 > /proc/sys/fs/file-max
這是讓Linux在啓動完成後強行將系統級打開文件數硬限制設置爲800037。
這代表這臺Linux系統最多容許同時打開(即包含全部用戶打開文件數總和)800037個文件,是Linux系統級硬限制,全部用戶級的打開文件數限制都不該超過這個數值。該值是Linux系統在啓動時根據系統硬件資源情況計算出來的最佳的最大同時打開文件數限制,若是沒有特殊須要,不該該修改此限制,除非想爲用戶級打開文件數限制設置超過此限制的值。
查找文件句柄問題的時候,lsof能夠很方便看到某個進程開了那些句柄.也能夠看到某個文件/目錄被什麼進程佔用了.
2.session 設置:
ulimit -a # 查看全部的
ulimit -S -n1024 #設置當前會話的打開文件數軟鏈接數爲 1024.
ulimit -H -n1024 #設置當前會話的打開文件數硬鏈接數爲 1024.
ulimit -n 996 #設置當前會話的打開文件數硬&&軟鏈接數都爲 1024.
3.設置用戶(只針對用戶的每一個進程):
#<domain> <type> <item> <value>
#
* soft nofile 32768
* hard nofile 65536
ulimit -n vs. file-max ?
簡單的說, ulimit -n控制進程級別可以打開的文件句柄的數量, 而max-file表示系統級別的可以打開的文件句柄的數量。
ulimit -n的設置在重啓機器後會丟失,所以須要修改limits.conf的限制,limits.conf中有兩個值soft和hard,soft表明只警告,hard表明真正的限制
Cat /etc/security/limits.conf
* soft nofile 150000 * hard nofile 150000
這裏咱們把soft和hard設置成同樣的。
「cat /proc/sys/fs/file-max」,或「sysctl -a | grep fs.file-max」查看系統能打開的最大文件數。查看和設置例如:
[root@vm014601 ~]# sysctl -a |grep fs.file-max fs.file-max = 200592 [root@vm014601 ~]# echo "fs.file-max = 2005920" >> /etc/sysctl.conf [root@vm014601 ~]# sysctl -p [root@vm014601 ~]# cat /proc/sys/fs/file-max 2005920
file-nr是隻讀文件,第一個數表明了目前分配的文件句柄數;第二個數表明了系統分配的最大文件句柄數;好比線上系統查看結果:
# cat /proc/sys/fs/file-max 1106537 # cat /proc/sys/fs/file-nr 1088 0 1106537 # lsof | wc -l 1506
能夠看到file-nr和lsof的值不是很一致,可是數量級一致。爲何會不一致?緣由以下:
寫到lsof是列出系統所佔用的資源,可是這些資源不必定會佔用打開文件號的。如共享內存,信號量,消息隊列,內存映射.等,雖然佔用了這些資源,但不佔用打開文件號.
我曾經在前端機上很長時間都沒法獲得lsof | wc -l 的結果,這個時候能夠經過file-nr粗略的估算一下打開的文件句柄數。
參考資料:
linux下進程的進程最大數、最大線程數、進程打開的文件數和ulimit命令修改硬件資源限制