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比较合适

高级一点的做法:
将配置写到/etc/security/limits.d/nofile.conf  这种不直接写到系统limits文件中,当limits需要升级时,不会丢失配置
另外一种做法:
在系统启动过程中,执行一次ulimit -SHn 65533,比如可以写到/etc/rc.local中,或者/etc/profile中等

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 filesmax 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

参考资料

ulimit限制之nproc问题

linux修改max user processes limits

posted @ 2023-10-12 10:23  往事已成昨天  阅读(347)  评论(0编辑  收藏  举报