linux ulimit的若干坑

一、ulimit简介

ulimit是bash内键命令,它具有一套参数集,用于为由它生成的shell进程及其子进程的资源使用设置限制。可以使用help ulimit查询手册

二、ulimit命令使用

      Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置linux用户的最大进程数
      可以用ulimit - a来显示当前的各种用户进程限制
      下面我把某Linux用户的最大进程数设为10000个
                   ulimit -u 10240
                  对于需要做许多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 -Hs 64:硬限制资源,线程栈大小为64k
                ulimit -Sn 32:软限制资源,32个文件描述符
                ulimit -a:显示当前所有limit信息
                ulimit -c unlimited:对生成的core文件大小不进行限制
                ulimit -f 2048:限制进程可创建的最大文件大小为2048blocks
                ulimt -i 32:限制最大可加锁内存大小为kbytes
                ulimit -p 512:限制管道缓冲区的大小为512kbytes
                ulimit -u 64:限制用户最多可以使用64个进程
          注意:这个当中的硬限制是实际的限制,而软限制,是warning限制,只会做出warning;其中ulimit命令本身就有分软硬设置,默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数一起改变

三、ulimit的使用方式及作用范围

3.1、在用户的启动脚本里

如果用户使用的是bash,就可以在用户目录下的.bashrc文件中,加入ulimit -u 64,来限制用户最多可以使用64个进程,此外,可以在于.bashrc功能相当的启动脚本中加入ulimit

3.2、应用程序的启动脚本中

  编写个简单的启动脚本startmyapp
      #/bin/sh
      ulimit -n 512
      myapp.sh
   以这个startmyapp启动myapp.sh时,myapp.sh这个脚本打开的文件句柄数不超过512个

3.3、直接控制台输入

    [root@web ~]#ulimit -p 512
    限制管道缓冲区为256k

四、ulimit相关配置文件

需要注意一点:/etc/security/limits.d下也可以设置noproc最大进参数的限制:即 /etc/security/limits.d/下的文件覆盖了/etc/security/limits.conf设置的值 

主配置文件:/etc/security/limits.conf
分段配置文件:/etc/security/limits.d/*.conf
    通过修改系统的/etc/security/limits.conf配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述
    格式如下:
                    #<domain>  <type>  <item>  <value>
     名称                                                含义
      domain                                  表示用户或者组的名字,还可以使用*作为通配符代表所有用户,组名前面加@和用户名区别
      type                                    可以有两个值,soft和hard,soft指的是当前系统生效的设置值,hard表明系统中所能设定的最大值,用-就表示同时设置了soft和hard的值
      item                                    表明需要限定的资源,可以有很多候选值,如stack,cpu等,分别表示最大的堆栈大小,占用 的cpu时间,noproc是代表进程数,nofile是代表文件打开数
      value                                    对应相应的值
编辑保存之后,需要重新登录一次才能生效
取值范围注意:ulimit -n的最大值是220 =1048576 ,也就是最大 1048576 多加个1都会报错哦!

4.1、soft和hard一起设置才好使

* soft nofile 1000000
* hard nofile 1000000

如果只是设置一个,那么是不起作用的

4.2、啥时候ulimit的设置才生效

退出当前session,重新登录后或者直接命令行执行

ulimit -n 1000000
ulimit -u unlimited

4.3、nofile不能设置unlimited,noproc可以

如果设置

* soft nofile unlimited
* hard nofile unlimited

那么你将被登录拒绝报错,因此nofile不能设置unlimited

五、修改linux 最大文件限制数 ulimit不生效 排查顺序

5.1、临时修改当前交互终端的limit值

查询当前终端的文件句柄数: ulimit -n 回车,一般的系统默认的1024.

修改文件句柄数为65535,ulimit -n 65535 .此时系统的文件句柄数为65535.

5.2、将ulimit 值添加到/etc/profile文件中(适用于有root权限登录的系统)

为了每次系统重新启动时,都可以获取更大的ulimit值,将ulimit 加入到/etc/profile 文件底部。

 

echo ulimit -n 65535 >>/etc/profile
source /etc/profile    #加载修改后的profile
ulimit -n     #显示65535,修改完毕!

 

5.3、查看环境变量设置是否有问题

OK,好多朋友都以为大功告成了,可以突然发现自己再次登录进来的时候,ulimit的值还是1024,这是为什么呢?
关键的原因是你登录的用户是什么身份,是不是root用户,由于服务器的root用户权限很大,一般是不能用来登录的,都是通过自己本人的登录权限进行登录,并通过sudo方式切换到root用户下进行工作。 用户登录的时候执行sh脚本的顺序:
/etc/profile.d/file
/etc/profile
/etc/bashrc
/mingjie/.bashrc
/mingjie/.bash_profile

由于ulimit -n的脚本命令加载在第二部分,用户登录时由于权限原因在第二步还不能完成ulimit的修改,所以ulimit的值还是系统默认的1024。

解决办法:
修改linux的软硬件限制文件/etc/security/limits.conf.

在文件尾部添加如下代码:

* soft nofile 10240
* hard nofile 10240

5.4、检查linux pam模块设置

经过以上修改,在有些系统中,用一般用户再登陆,仍然没有修改过来,那么需要检查是否有如下文件,如果没有,则要添加如下内容:

# vim /etc/pam.d/sshd
[Add the line]
session    required   /lib/security/pam_limits.so

5.5、检查SSH服务登陆配置

如果仍然不行,那么需要修改如下文件:

# vim /etc/ssh/sshd_config
[May need to modify or add the line]
UsePrivilegeSeparation no

版权声明:
作者:WaterBear
链接:https://l-t.top/2094.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录