ulimit命令-限制linux内核的资源大小-(用户级,系统级2种限制)
ulimit命令-限制linux内核的资源大小
涉及到的文件:/etc/security/limits.conf /etc/sysctl.conf
ulimit -n查看linux系统的最大文件打开数
设置最大文件打开数的大小:
临时设置:ulimit -SHn 65535
-S表示软限制
-H表示硬限制
永久生效:文件:/etc/security/limits.conf
添加2行:
* soft nofile 65535
* hard nofile 65535
上面的*代表所有用户,对所有用户生效
将限制写在全局变量配置的文件/etc/profile里面,用source更新一下
echo "ulimit -SHn 65535" >> /etc/profile
source /etc/profile
上面的nproc是允许创建的子进程数目,不能过大,防止accidental fork bombs,一般4096比较合适
liunx中文件句柄有两个限制
一种是用户级的,一种是系统级的(也叫内核级)
Linux最大打开文件句柄数,即打开文件数最大限制,就是规定的单个进程能够打开的最大文件句柄数量(Socket连接也算在里面,默认大小1024)
系统级的最大限制:
cat /proc/sys/fs/file-max
用户级的最大限制
ulimit -n(默认是1024,向阿里云华为云这种云主机一般是65535)
查看某个进程的最大打开文件数和当前打开文件数
/proc/[pid]/limits 显示当前进程的资源限制
/proc/[pid]/fd 是一个目录,包含进程打开文件的情况
/proc/[pid]/task 查看某个进程的线程的详细信息
修改最大限制
用户级
用户级修改临时生效方法:(重启后失效)
ulimit -SHn 10000
ulimit 命令分软限制和硬限制,加-H就是硬限制,加-S就是软限制。默认显示的是软限制,如果运行ulimit 命令修改时没有加上-H或-S,就是两个参数一起改变。硬限制就是实际的限制,而软限制是警告限制,它只会给出警告
用户级修改永久有效方式:
vi /etc/security/limits.conf
修改配置文件/etc/security/limits.conf,加入:
soft nofile 65535
hard nofile 65535
echo “* soft nofile 65535” >> /etc/security/limits.conf
echo “* hard nofile 65535” >> /etc/security/limits.conf
表示所用的用户,但有的系统不认, 需要具体的用户名, 比如:
root soft nofile 65535
root hard nofile 65535
重新登录验证,或者reboot后验证。
系统级
其实上面的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。
假如,我们设置进程打开的文件句柄数是1024 ,但是系统总限制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以
系统级修改临时生效方式:
echo 655350 > /proc/sys/fs/file-max
系统级修改永久生效方式:
vi /etc/sysctl.conf
加入
#系统允许打开最大文件数
fs.file-max=655350
#进程允许打开最大文件数,这里注意nr_open要比nofile大,否则会出现登录不上
fs.nr_open=60000
sysctl -p
查看是否生效,如果不行,reboot即可。
####################################################
1 问题说明
Linux 系统默认的max open files = 1024
, 在大内存服务器中, 如果运行负载比较大的程序, 很容易发生error: too many open files
, 特别是提供大量静态文件访问的Web服务器、缓存服务器中这种错误更加常见.
open files
表示系统级别的能够打开的文件句柄的数量, 是系统级别的安全策略: 限制所有应用打开的文件数量.
发生error: too many open files
时, 如果不好定位程序问题, 可在系统的配置文件中做一定的修改.
为了让服务器重启之后, 配置仍然有效, 需要用永久生效的配置方法进行修改.
2 修改max open files
说明: 这里以Cent OS 6.5为例.
使用ulimit -a
命令可以查看当前系统的所有限制值, 括号中的命令是查看单项限制值的方式, 比如要查看系统可打开的最大文件数量(open files), 就可以用ulimit -n
命令: (具体命令说明请参考末尾部分的附录)
[root@localhost ~]# 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) 1031426
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) 10240 # 栈大小
cpu time (seconds, -t) unlimited # CPU时间
max user processes (-u) 131072
virtual memory (kbytes, -v) unlimited # 虚拟内存大小
file locks (-x) unlimited
(1) 短期修改, 重启服务器后即失效:
# 把文件句柄数改为65535
ulimit -n 65535
# 也可用下属方式修改:
ulimit -SHn 65535
# 其中-S是soft软限制模式, -H指hard硬限制模式;
# 默认是软限制, 如果只指定-n, 那就会同时配置-SH.
(2) 永久修改, 重启服务器也不变:
网络上常见的方式有如下三种:
① 在
/etc/security/limits.conf
最后增加如下两行记录:
# nofile - 可以打开的最大文件数, *通配符表示对所有用户有效 * soft nofile 65535 * hard nofile 65535
修改完成后保存, 退出当前用户并重新登录(不用重启服务器), 当前修改就会生效.
② 在
/etc/profile
中增加一行ulimit -SHn 65535
, 然后运行source /etc/profile
命令让修改立即生效.——
/etc/profile
文件是所有系统用户的配置文件, 修改后会影响当前系统的所有注册用户.③ 在
/etc/rc.local
文件中增加一行ulimit -SHn 65535
, 修改完后, 重启服务器就可生效.
值得注意的是, 博主在CentOS 6.5系统中测试, 发现只有第 ① 和第 ② 种方式才有效.
另外, 在《阿里巴巴Java开发手册》中, 关于最大文件句柄数有这样的描述:
【推荐】调大服务器所支持的最大文件句柄数(File Descriptor,简写为fd)。
说明:主流操作系统的设计是将 TCP/UDP 连接采用与文件一样的方式去管理,即一个连接对应于一个 fd。主流的 Linux 服务器默认所支持最大 fd 数量为 1024,当并发连接数很大时很容易因为 fd 不足而出现“open too many files”错误,导致新的连接无法建立。 建议将 Linux 服务器所支持的最大句柄数调高数倍(与服务器的内存数量相关)。
3 修改max user processes
(1) 问题描述: 在使用Java程序多线程大批量生成模拟数据时, Cent OS报出如下错误:
ulimit: max user processes: cannot modify limit
错误说明: Linux系统为每个用户都设置了一个最大进程数, 这个特性可以让我们控制服务器上现有用户可以创建的进程数量.
(2) 查看max user processes
:
# 与查看max open files类似, 可使用 ulimit -u查看max user processes:
ulimit -u
(3) 修改max user processes
:
① 方案一: 修改/etc/security/limits.conf
文件, 在文件最后添加下述内容:
* soft nproc 131072
* hard nproc 131072
② 方案二: 修改/etc/security/limits.d/90-nproc.conf
文件, 在文件最后添加下述内容:
# 用户进程数的默认限制, 下面这个是对root外的其他用户限制max user processes, 要注释掉:
# * soft nproc 1024
root soft nproc 131072
(4) 关于nproc配置信息的扩展说明:
对max user processes
的配置, Linux系统默认先读取/etc/security/limits.conf
中的信息, 如果/etc/security/limits.d/
目录下还有配置文件的话, 也会依次遍历读取, 最终, /etc/security/limits.d/
中的配置会覆盖/etc/security/limits.conf
中的配置.
另外, max open files
和max user processes
是不能配置unlimited
的 —— 极不安全的设置, 此时系统会使用默认的配置值. 对nproc
而言, 默认值的计算方法为:
# 计算公式为:
default_nproc = max_threads / 2;
# 其中, max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
# mempages是机器的物理页面个数, THREAD_SIZE=8K, 所以, 计算公式为:
default_nproc = max_threads / 2
= (mempages * PAGE_SIZE) / ( 2 * 8 *THREAD_SIZE )
= total_memory / 128K;
# 计算本机默认nproc配置:
cat /proc/meminfo | grep MemTotal
MemTotal: 115571480 kB
echo "115571480 / 128" | bc
902902
ulimit -u
902682
# 算出来default_nproc = 902902, 和实际的902682很接近,
# 因为物理页面会存储一些关键数据, 所以实际的比计算出来的要小一些.
4 附录: ulimit命令说明
(1) 列出所有当前资源极限, 命令为: ulimit -a
, 其他命令可参考输出信息中括号内的提示:
# ulimit -a 命令的输出信息:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited # 一个进程的数据段的最大值
scheduling priority (-e) 0
file size (blocks, -f) unlimited # Shell创建文件的最大体积, 1block = 512bytes
pending signals (-i) 1031426 # 最多允许多少个待处理的信号
max locked memory (kbytes, -l) 64 # 每个进程可以锁住的物理内存的最大值
max memory size (kbytes, -m) unlimited # 每个进程可以使用的常驻内存的最大值
open files (-n) 65535 # 每个进程可以同时打开的最大文件数, 不能是unlimited
pipe size (512 bytes, -p) 8 # 管道的最大值, 1block = 512bytes
POSIX message queues (bytes, -q) 819200 # POSIX的消息队列的最大值
real-time priority (-r) 0
stack size (kbytes, -s) 10240 # 单个进程能够使用的最大栈大小
cpu time (seconds, -t) unlimited # 单个进程的最大CPU时间, 也就是可使用CPU的秒数, 到硬极限时, 这个进程就会立即自杀; 到软极限时, 每秒发送一次限制超时信号SIGXCPU
max user processes (-u) 131072 # 单个用户可同时运行的最大进程数, 不能是unlimited
virtual memory (kbytes, -v) unlimited # 每个进程可使用的最大虚拟内存
file locks (-x) unlimited # 每个进程能锁住的最大文件个数
(2) ulimit的其他命令:
-H 设置某个给定资源的硬极限. 如果用户拥有root权限, 可以增大硬极限. 任何用户均可减少硬极限
-S 设置某个给定资源的软极限, 软极限可增大到硬极限的值
(3) 注意事项:
① 其中,
unlimited
是指不限制用户可以使用的资源, 但这个设置对系统可打开的最大文件数(max open files)和各个用户可同时运行的最大进程数(max user processes)无效.② 如果某个指标没有明确指定-H和-S限制, 那么当前的极限值就是 -H 和 -S 两者的极限值.
########################################
linux打开文件数
linux系统在使用过程中如果出现如下错误:
too many open files
此错误提示原因为打开文件数超过设定值,默认情况下为1024,可通过命令ulimit -n来查看,如图:
Linux上能打开的最大文件数主要受三个参数影响,分别是:
-
fs.file-max(系统级别参数):该参数表示整个操作系统可以打开的最大文件数量,但是此参数仅限于普通用户,root用户不受此限制,此参数的默认值是内存的10%,可通过命令(grep MemTotal /proc/meminfo | awk ‘{printf(“%d”,$2/10)}’) 获取
-
fs.nr_open(进程级别参数):限制单个进程上可以打开的最大文件数,针对不同用户可以配置不同的值,通常默认值为1024*1024=1048576
-
soft nofile(进程级别参数):限制单个进程上可以打开的最大文件数,只能在Linux上配置一次,不能针对不同用户配置不同的值
上面三个参数是存在一定的耦合关系的,因此配置值的时候还需要注意以下几点:
-
如果要修改soft nofile,那么hard nofile参数的值也需要一起改。如果hard nofile参数值设置的低,那么soft nofile参数的值设置的再高也没有用,实际生效的值会按照二者最低的来
-
如果修改了hard nofile,那么fs.nr_open也需要一起调整,要保证fs.nr_open参数值一定要大于hard nofile参数值),如果hard nofile的值设置的比fs.nr_open还大,会导致该用户无法登录,如果设置的是*,那么所有用户都无法登录
-
如果修改了fs.nr_open,但是是用的echo “xxx” > ../fs/nr_open命令来修改的(临时修改),改完后是可以生效的,但是只要机器一重启,那么之前通过echo命令设置的fs.nr_open值便会失效,用户还是无法登录。所以非常不建议使用echo的方式修改内核参数!!!
设置打开文件数
一、设置进程级别的最大打开文件数
设置进程级别的打开文件数,有两种方式,第一种是临时设置,第二种是永久设置
1、临时设置,可通过如下命令,如下:
ulimit -n 65535
注意:这个设置只是针对当前终端的,如果此时我们退出当前终端并重新连接,那么打开文件数又会变回1024,如图:
2、永久方式设置,编辑文件/etc/security/limits.conf,添加内容如下:
* soft nproc 65535 #限制用户最多打开的进程数,*表示所有用户
* hard nproc 65535 #限制用户最多打开的进程数
* soft nofile 65535 #限制用户最多打开的文件数(软限制)
* hard nofile 65535 #限制用户最多打开的文件数(硬限制)
soft | 软限制,可超过这个值,但超过会告警 |
hard | 硬限制,不能超过这个值,超过会报错 |
nproc | 操作系统对每个用户创建的进程数的限制 |
nofile | 每个进程可打开的文件数限制 |
注意:设置完成后退出终端并重新连接即可看到生效了,无需重启服务器
在centos7中也可以针对某个服务设置最大打开文件数,如图:
在centos7中,infinity等价于 65536
二、设置系统级别的打开文件数
1、临时生效,通过echo方式,如下:
echo 1500000 > /proc/sys/fs/nr_open # 注意修改规则要按照上方要求的来改
echo 180000 > /proc/sys/fs/file-max
2、永久生效(无需重启服务器):
编辑文件/etc/sysctl.conf,添加参数fs.nr_open和fs.file-max,如图:
设置完成后执行如下命令让配置生效:
sysctl -p
参考资料