命 令:ulimitjava
功 能:控制shell程序的資源node
語 法:ulimit [-aHS][-c <core文件上限>][-d <數據節區大小>][-f <文件大 小>][-m <內存大小>][-n <文件數目>][-p <緩衝區大小>][-s <堆棧大小>][-t <CPU時間>][-u <程序數目>][-v <虛擬內存大小>]linux
補充說明:ulimit爲shell內建指令,可用來控制shell執行程序的資源。 shell
參 數: vim
-H 設置硬件資源限制,是管理員所設下的限制.tomcat
-S 設置軟件資源限制,是管理員所設下的限制.bash
-a 顯示當前全部的資源限制.服務器
-u 進程數目:用戶最多可啓動的進程數目.session
-c size:設置core文件的最大值.單位:blocksapp
-d size:設置程序數據段的最大值.單位:kbytes
-f size:設置shell建立文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可使用的常駐內存的最大值.單位:kbytes
-n size:設置內核能夠同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩衝區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
2. 系統調優
如前所述, ulimit -a 用來顯示當前的各類用戶進程限制。
Linux對於每一個用戶,系統限制其最大進程數。爲提升性能,能夠根據設備資源狀況,
設置各linux 用戶的最大進程數,下面我把某linux用戶的最大進程數設爲10000個:
ulimit -u 10000
對於須要作許多 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 是表明最大文件打開數
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
/**************************************
有時候在程序裏面須要打開多個文件,進行分析,系統通常默認數量是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
3. /proc目錄:
1)/proc目錄裏面包括不少系統當前狀態的參數,例如:引用
/proc/sys/fs/file-max
/proc/sys/fs/inode-max
是對整個系統的限制,並非針對用戶的;
2)proc目錄中的值能夠進行動態的設置,若但願永久生效,能夠修改/etc/sysctl.conf文件,並使用下面的命令確認:
# sysctl -p
ulimit 用於限制 shell 啓動進程所佔用的資源,支持如下各類類型的限制:
所建立的內核文件的大小、
進程數據塊的大小、
Shell 進程建立文件的大小、
內存鎖住的大小、
常駐內存集的大小、
打開文件描述符的數量、
分配堆棧的最大大小、
CPU 時間、
單個用戶的最大線程數、
Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。
做爲臨時限制,ulimit 能夠做用於經過使用其命令登陸的 shell 會話,在會話終止時便結束限制,並不影響於其餘 shell 會話。而對於長期的固定限制,ulimit 命令語句又能夠被添加到由登陸 shell 讀取的文件中,做用於特定的 shell 用戶。
二、使用ulimit
ulimit 經過一些參數選項來管理不一樣種類的系統資源。
ulimit 命令的格式爲:ulimit [options] [limit]
主要關注兩個:
1)open files:– 用戶能夠打開文件的最大數目
對應ulimit 的命令ulimit -n,可使用ulimit -n 臨時設置。
對應/etc/security/limits.conf的資源限制類型是:nofile
* soft nofile 4096
* hard nofile 4096
2)max user processes – 用戶能夠開啓進程/線程的最大數目
對應ulimit 的命令ulimit -u 臨時修改max user processes的值:ulimit -u 8192。
對應/etc/security/limits.conf的資源限制類型是: noproc
* soft nproc 8192
具體的 options 含義以及簡單示例能夠參考如下表格。
ulimit 參數說明
選項 含義-a 顯示當前系統全部的limit資源信息。 -H 設置硬資源限制,一旦設置不能增長。例如:ulimit – Hs 64;限制硬資源,線程棧大小爲 64K。-S 設置軟資源限制,設置後能夠增長,可是不能超過硬資源設置。例如:ulimit – Sn 32;限制軟資源,32 個文件描述符。-c 最大的core文件的大小,以 blocks 爲單位。例如:ulimit – c unlimited; 對生成的 core 文件的大小不進行限制。-f 進程能夠建立文件的最大值,以blocks 爲單位.例如:ulimit – f 2048;限制進程能夠建立的最大文件大小爲 2048 blocks。-d 進程最大的數據段的大小,以Kbytes 爲單位。例如:ulimit -d unlimited;對進程的數據段大小不進行限制。-m 最大內存大小,以Kbytes爲單位。例如:ulimit – m unlimited;對最大內存不進行限制。-n 能夠打開的最大文件描述符的數量。例如:ulimit – n 128;限制最大可使用 128 個文件描述符-s 線程棧大小,以Kbytes爲單位。例如:ulimit – s 512;限制線程棧的大小爲 512 Kbytes。-p 管道緩衝區的大小,以Kbytes 爲單位。例如ulimit – p 512;限制管道緩衝區的大小爲 512 Kbytes。-u 用戶最大可用的進程數。例如 limit – u 65536;限制用戶最多可使用 65536個進程。-v 進程最大可用的虛擬內存,以Kbytes 爲單位。ulimit – v 200000;限制最大可用的虛擬內存爲 200000 Kbytes。-t 最大CPU佔用時間,以秒爲單位。ulimit – t unlimited;對最大的 CPU 佔用時間不進行限制。-l 最大可加鎖內存大小,以Kbytes 爲單位。
1
咱們能夠經過如下幾種方式來使用 ulimit:
1、在用戶的啓動腳本中
若是用戶使用的是 bash,就能夠在用戶的目錄下的 .bashrc 文件中,加入 ulimit – u 64,來限制用戶最多可使用 64 個進程。此外,能夠在與 .bashrc 功能至關的啓動腳本中加入 ulimt。
2、在應用程序的啓動腳本中
若是用戶要對某個應用程序 myapp 進行限制,能夠寫一個簡單的腳本 startmyapp。
ulimit – s 512
myapp
之後只要經過腳本 startmyapp 來啓動應用程序,就能夠限制應用程序 myapp 的線程棧大小爲 512K。
3、直接在控制檯輸入
ulimit – p 256
限制管道的緩衝區爲 256K。
4、修改全部 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 使其生效
4、也能夠針對單個用戶的.bash_profile設置:
vi ~./.bash_profile
#ulimit -n 1024
從新登錄ok
三、用戶進程的有效範圍
ulimit 做爲對資源使用限制的一種工做,是有其做用範圍的。那麼,它限制的對象是單個用戶,單個進程,仍是整個系統呢?事實上,ulimit 限制的是當前 shell 進程以及其派生的子進程。舉例來講,若是用戶同時運行了兩個 shell 終端進程,只在其中一個環境中執行了 ulimit – s 100,則該 shell 進程裏建立文件的大小收到相應的限制,而同時另外一個 shell終端包括其上運行的子程序都不會受其影響:
Shell 進程 1
ulimit –s 100
cat testFile > newFile
File size limit exceeded
Shell 進程 2
cat testFile > newFile
ls –s newFile
323669 newFile
針對用戶永久生效:
那麼,是否有針對某個具體用戶的資源加以限制的方法呢?答案是有的,方法是經過修改系統的 /etc/security/limits.conf配置文件。該文件不只能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對限定的一個描述。
limits.conf的格式以下:
<domain> <type> <item> <value>
username|@groupname type resource limit
domain:username|@groupname:設置須要被限制的用戶名,組名前面加@和用戶名區別。也能夠用通配符*來作全部用戶的限制。
type:有 soft,hard 和 -,soft 指的是當前系統生效的設置值。hard 代表系統中所能設定的最大值。soft 的最大值不能超過hard的值。用 – 就代表同時設置了 soft 和 hard 的值。
resource:
core – 限制內核文件的大小
date – 最大數據大小
fsize – 最大文件大小
memlock – 最大鎖定內存地址空間
nofile – 打開文件的最大數目
rss – 最大持久設置大小
stack – 最大棧大小
cpu – 以分鐘爲單位的最多 CPU 時間
noproc – 進程的最大數目(系統的最大進程數)
as – 地址空間限制
maxlogins – 此用戶容許登陸的最大數目
要使 limits.conf 文件配置生效,必需要確保 pam_limits.so 文件被加入到啓動文件中。
查看 /etc/pam.d/login 文件中有:
session required /lib/security/pam_limits.so
例如:解除 Linux 系統的最大進程數和最大文件打開數限制:
vi /etc/security/limits.conf
# 添加以下的行
* soft noproc 20000 #軟鏈接
* hard noproc 20000 #硬鏈接
* soft nofile 4096
* hard nofile 4096
說明:* 表明針對全部用戶,noproc 是表明最大進程數,nofile 是表明最大文件打開數
須要注意一點:/etc/security/limits.d下也有noproc最大進參數的限制:
即 /etc/security/limits.d/下的文件覆蓋了/etc/security/limits.conf設置的值
這個是官網答疑:https://access.redhat.com/solutions/406663
# /etc/security/limits.conf
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#Also note that configuration files in /etc/security/limits.d directory,
#That means for example that setting a limit for wildcard domain here
[root@tr10-46-65-29 ~]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 8192
root soft nproc unlimited
如今已經能夠對進程和用戶分別作資源限制了,看似已經足夠了,其實否則。不少應用須要對整個系統的資源使用作一個總的限制,這時候咱們須要修改 /proc 下的配置文件。/proc 目錄下包含了不少系統當前狀態的參數,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,從文件的名字大體能夠猜出所限制的資源種類。
注意:
經過讀取/proc/sys/fs/file-nr能夠看到當前使用的文件描述符總數。另外,對於文件描述符的配置,須要注意如下幾點:
全部進程打開的文件描述符數不能超過/proc/sys/fs/file-max
單個進程打開的文件描述符數不能超過user limit中nofile的soft limit
nofile的soft limit不能超過其hard limit
nofile的hard limit不能超過/proc/sys/fs/nr_open
四、用戶進程的有效範圍
問題1:su切換用戶時提示:Resource temporarily unavailable
或者經過進程跟蹤 strace -p pid 看到:Resource temporarily unavailab
經過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) 63463
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
在上面這些參數中,一般咱們關注得比較多:
open files: 一個進程可打開的最大文件數.
max user processes: 系統容許建立的最大進程數量.
經過 ps -efL|grep java |wc -l
#24001
這個獲得的線程數居然是2萬多,遠遠超過4096
咱們可使用 ulimit -u 20000 修改max user processes的值,可是隻能在當前終端的這個session裏面生效,從新登陸後仍然是使用系統默認值。
正確的修改方式是修改/etc/security/limits.d/20-nproc.conf文件中的值。先看一下這個文件包含什麼:
$ cat /etc/security/limits.d/90-nproc.conf # Default limit for number of user's processes to prevent# accidental fork bombs.# See rhbz #432903 for reasoning.* soft nproc 8192
咱們只要修改上面文件中的8192這個值,便可。
問題2:linux 打開文件數 too many open files 解決方法
在運行某些命令或者 tomcat等服務器持續運行 一段時間後可能遇到 too many open files。
出現這句提示的緣由是程序打開的文件/socket鏈接數量超過系統設定值。
java進程若是遇到java.net.SocketException: Too many open files,接着可能致使域名解析ava.net.UnknownHostException:
緣由是用戶進程沒法打開系統文件了。
查看每一個用戶最大容許打開文件數量
ulimit -a
其中 open files (-n) 65535 表示每一個用戶最大容許打開的文件數量是65535 。 默認是1024。1024很容易不夠用。
永久修改open files 方法
vim /etc/security/limits.conf
在最後加入
* soft nofile 65535
* hard nofile 65535
或者只加入
* - nofile 65535
最前的 * 表示全部用戶,可根據須要設置某一用戶,例如
fdipzone soft nofile 8192
fdipzone hard nofile 8192
注意"nofile"項有兩個可能的限制措施。就是項下的hard和soft。 要使修改過得最大打開文件數生效,必須對這兩種限制進行設定。 若是使用"-"字符設定, 則hard和soft設定會同時被設定。
改完後註銷一下就能生效。
經過 ulimit -n或者ulimit -a 查看系統的最大文件打開數已經生效了。但此時查看進程的最大文件打開數沒有變,緣由是這個值是在進程啓動的時候設定的,要生效必須重啓!
ok,那就重啓吧,重啓完畢,結果發現依然沒變!這奇了怪了,後來通過很久的排查,最終確認問題是,該程序是經過 supervisord來管理的,也就是這進程都是 supervisord 的子進程,而 supervisord 的最大文件打開數仍是老的配置,此時必須重啓 supervisord 才能夠。
當你們遇到limits修改不生效的時候,請查一下進程是否只是子進程,若是是,那就要把父進程也一併重啓才能夠。
3274116 open files
8.利用lsof統計每一個進程打開的文件數目
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
9. 設置普通用戶下打開文件的最大值
ulimit -n 4096
-bash: ulimit: open files: cannot modify limit: Operation not permitted
9.1 在/etc/security/limits.conf中添加
* hard nofile 100000
* soft nofile 100000
9.2 /etc/pam.d/login 添加cat /proc/sys/fs/file-nr
864 0 3274116
have 864 out of max
session required /lib64/security/pam_limits.so
9.3 重啓 ssh2和rccron,這樣只進程就自動繼承了nofile/etc/init.d/ssh2 restartrccron restart