Linux - ulimit命令详解与修改不生效

一、抛异常

首先抛个异常:java.io.FileNotFoundException: (*********)Too many open files。

原因是由于linux限制了一次会话中,程序最大同时打开文件数目。

使用命令查看:

ulimit -n   //默认值为1024

临时修改(退出会话失效):

ulimit -n XXXX

永久修改(修改/etc/security/limits.conf文件,设置用户最大打开文件数 ):文件末尾添加如下,具体大小建议65536

*       -        nofile         65536

注意 nofile 参数在 type 类型上有2个可能的选项:hard 和 soft ,这两个值都需要设置,“-”代表同时设置这2个值为后面的数字。

hard limit 只是作为 soft limit 的上限,soft limit 才是你设置的系统当前限制。当你设置 hard limit 后,soft limit 的值就只能小于 hard limit 。普通用户可以降低 hard limit 的值,但是不能提高它,只有 root 用户才能提高 hard limit。

参考版本:

*        hard    nproc           64000
*        soft      nproc           64000
*        hard     nfile             64000
*        soft      nfile             64000
*        soft      stack           unlimited
*        soft      core             unlimited
*        soft      core             unlimited
*        hard     core             unlimited
*        soft      memlock      250000000
*        hard     memlock      250000000
*        -       nofile         65536


二、root用户修改后其他用户不生效

在root用户修改为65536后,用其他用户登录服务器检测ulimit -n 还是1024。那么就是该用户未生效。


1. 方案一

使用root用户进行如下操作:

vi /etc/ssh/sshd_config

将# UseLogin no修改如下:

UseLogin yes
//如果没升级 ssh 则添加修改如下
UsePAM yes

重启sshd服务 :

service sshd restart

修改/etc/pam.d/login

#添加以下内容,注意写你自己系统pam_limits.so的绝对路径
session    required  /usr/lib64/security/pam_limits.so

修改/etc/security/limits.d/下的配置文件

[root@localhost limits.d]# ll
总用量 8
-rw-r--r-- 1 root root 72 7月  20 15:31 20-nofile.conf
-rw-r--r-- 1 root root 74 7月  20 15:31 20-nproc.conf

如下图所示:

2. 方案二

如果还不行(实际上已经改过来了,只是其他用户看到的是默认值),建议升级openssh或者重装openssh

如果直接使用其他用户如test登录之后ulimit -n还是1024并且着急使用,那么不妨尝试使用root用户登录然后切换到test用户再操作。

三、ulimit命令详解

1. ulimit是什么

ulimit命令用来限制系统用户对shell资源的访问。

解释如下:

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战,而实际应用的环境要比这种假设复杂的多。

例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。


2. 语法格式

语法如下:

[root@localhost limits.d]# ulimit 
unlimited

选项如下:

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

实例如下:

[root@localhost limits.d]# ulimit  -a                
core file size          (blocks, -c) 0                #core文件的最大值为100 blocks。
data seg size           (kbytes, -d) unlimited      #进程的数据段可以任意大。
scheduling priority             (-e) 0              
file size               (blocks, -f) unlimited      #文件可以任意大。
pending signals                 (-i) 7184           #最多有98304个待处理的信号。
max locked memory       (kbytes, -l) 64             #一个任务锁住的物理内存的最大值为32KB。
max memory size         (kbytes, -m) unlimited      #一个任务的常驻物理内存的最大值。
open files                      (-n) 655360         #一个任务最多可以同时打开1024的文件。
pipe size            (512 bytes, -p) 8              #管道的最大空间为4096字节。
POSIX message queues     (bytes, -q) 819200         #POSIX的消息队列的最大值为819200字节。
real-time priority              (-r) 0              
stack size              (kbytes, -s) 8192           #进程的栈的最大值为10240字节。
cpu time               (seconds, -t) unlimited      #进程使用的CPU时间。
max user processes              (-u) 7184           #当前用户同时打开的进程(包括线程)的最大个数为98304。
virtual memory          (kbytes, -v) unlimited      #没有限制进程的最大地址空间。
file locks                      (-x) unlimited      #所能锁住的文件的最大个数没有限制。

【Tips】

查看系统可接受的最大打开文件数(一般默认已足够,不用修改)

[root@localhost limits.d]# cat /proc/sys/fs/file-max
179721

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`ulimit`是Linux/Unix系统下一个用于控制进程资源限制的命令。使用`ulimit`命令可以查看或设置进程在运行时可以使用的各种资源限制,包括CPU时间,内存大小,文件打开数等等。 `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) 63522 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 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) 63522 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited ``` 上述输出显示了当前进程可以使用的所有资源限制,以及各个限制的具体值。 常用的`ulimit`命令参数包括: - `-c`:core文件的最大值(单位为blocks)。 - `-d`:进程数据段的最大值(单位为KB)。 - `-f`:文件大小的最大值(单位为blocks)。 - `-n`:打开文件的最大数量。 - `-t`:进程CPU时间的最大值(单位为秒)。 - `-v`:进程虚拟内存的最大值(单位为KB)。 - `-m`:进程物理内存的最大值(单位为KB)。 例如,要将当前进程可以打开的最大文件数设置为2048,可以使用如下命令: ``` ulimit -n 2048 ``` 需要注意的是,`ulimit`命令所做的设置只对当前进程及其子进程有效,而对其他进程没有影响。如果需要全局修改系统的资源限制,需要修改系统配置文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值