前言

Linux系统中可以设置关于资源的使用限制,比如:进程数量,文件句柄数,连接数等等。

在日常的工作中应该遇到过:

-bash: fork: retry: Resource temporarily unavailable

或者

too many open files

这些类似的操作错误,前者是由于当前用户的进程数超出限制,后者由于当前用户的文件打开数超出限制。

下面就简单的介绍下配置用户进程数和文件打开数。

一.ulimit命令

Provides control over the resources available to the shell and to processes started by it, on systems that allow such control.

Linux的man文档中是这样描述ulimit的:提供了当前shell控制系统资源的能力。从这里可以分析出ulimit的特点:

  • 可控系统资源:cpu、memory、process、file等等
  • 控制的 作用域在当前shell会话中

ulimit的语法:

ulimit [-HSTabcdefilmnpqrstuvx [limit]]

分为参数和值两部分,参数用于表示特定的资源类型,值表示在对特定的资源进行限制的量度。

命令参数 描述 例子
-H 设置硬资源限制,一旦设置不能增加 ulimit –Hs 64;限制硬资源,线程栈大小为 64K
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置 ulimit –Sn 32;限制软资源,32 个文件描述符
-a 显示当前所有的 limit 信息 ulimit – a;显示当前所有的 limit 信息
-c 最大的 core 文件的大小, 以 blocks 为单位 ulimit –c unlimited; 对生成的 core 文件的大小不进行限制
-d 进程最大的数据段的大小,以 Kbytes 为单位 ulimit -d unlimited;对进程的数据段大小不进行限制
-f 进程可以创建文件的最大值,以 blocks 为单位 ulimit –f 2048;限制进程可以创建的最大文件大小为 2048 blocks
-l 最大可加锁内存大小,以 Kbytes 为单位 ulimit –l 32;限制最大可加锁内存大小为 32 Kbytes
-m 最大内存大小,以 Kbytes 为单位 ulimit – m unlimited;对最大内存不进行限制
-n 可以打开最大文件描述符的数量 ulimit –n 128;限制最大可以使用 128 个文件描述符
-p 管道缓冲区的大小,以 Kbytes 为单位 ulimit –p 512;限制管道缓冲区的大小为 512 Kbytes
-s 线程栈大小,以 Kbytes 为单位 ulimit – s 512;限制线程栈的大小为 512 Kbytes
-t 最大的 CPU 占用时间,以秒为单位 ulimit – t unlimited;对最大的 CPU 占用时间不进行限制
-u 用户最大可用的进程数 ulimit – u 64 限制用户最多可以使用 64 个进程
-v 进程最大可用的虚拟内存,以 Kbytes 为单位 ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes

根据以上表格所列,如果需要设置当前用户的最大进程数和文件打开数只要如下设置即可:

  • ulimit -u 8192 设置当前用户的最大进程数为8192,只在当前shell中生效
  • ulimit -n 8192 设置当前用户的最大文件打开数8192,只在当前shell中生效

同时可以通过参数-a查看当前用户的所有限制情况:

[post@PostOS ~]$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127510
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 32768
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

可以通过max user processes和open files 看出当前post用户的最大进程数和最大打开文件数分别为32768和8192。

二.设置配置文件

前面介绍了ulimit的方式修改系统资源的限制,但是有局限性:ulimit只对当前shell会话生效。如果重新打开一个shell,配置又重新变成之前的限制了。如果需要永久生效需要修改文件让其配置持久化。

配置文件主要分为:

  • 将命令写至profile和bashrc中,相当于在登陆时自动动态修改限制
  • 在/etc/security/limits.conf中添加记录(需重启生效,并且在/etc/pam.d/中的seesion有使用到limit模块)

第一种方式很好理解,就是每次shell用户登录时,加载当前的用户的profile执行ulimit命令,以达到修改资源限制。

下面主要介绍下:如何修改/etc/security/limits.conf。

#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open file descriptors
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
#
#<domain> <type> <item> <value>
# #* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4 # End of file
* soft nofile 32768
* hard nofile 65536
#use for oracle
postgres soft nproc 2047
postgres hard nproc 16384
postgres soft nofile 2048
postgres hard nofile 65536
postgres soft stack 10240

从文件的注释说明中可以看出该文件的配置含义,配置主要分为四个部分:

  • domain部分:用来表示用户名或者组名。@后接用户名或者组名表示用户名或者组名;*表示所有用户
  • type部分:表示资源层面,有两种值soft和hard。soft表示在软件层面,hard表示在硬件层面
  • item部分:表示可以限制的资源类型。core限制核心的文件大小;locks表示用户可以持有的最大文件锁数量;nproc表示最大的进程数;nofile表示最大的打开文件句柄数
  • value部分:限制的资源数量的值

如上面的配置: #@student hard nproc 20,表示student用户在硬件上最大的进程数只有20,* soft nofile 32768表示软件上所有用户的最大文件打开数是32768。

只修改了这个文件还无法完成配置,还需要修改 /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
root soft nproc unlimited

从注释中可以看出,是针对用户进程的默认限制。从配置中可以看出root用户不做进程数量的限制,其他用户的最大进程数为8192。

关于Linux中为何既有/etc/security/limit.conf又还配置一个limits.d/90-nproc.conf,这个问题由于个人能力有限,无法回答。读者感兴趣可以自行研究,不吝赐教。

参考

ulimit限制之nproc问题

Linux中最大进程数和最大文件数的更多相关文章

  1. Linux中查看进程的多线程pstree, ps -L

    Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的 ...

  2. Linux 用户打开进程数的调整

    Linux 用户打开进程数的调整 参考文章: 关于RHEL6中ulimit的nproc限制(http://www.cnblogs.com/kumulinux/archive/2012/12/16/28 ...

  3. 1.1 Linux中的进程 --fork、孤儿进程、僵尸进程、文件共享分析

    操作系统经典的三态如下: 1.就绪态 2.等待(阻塞) 3.运行态 其转换状态如下图所示: 操作系统内核中会维护多个队列,将不同状态的进程加入到不同的队列中,其中撤销是进程运行结束后,由内核收回. 以 ...

  4. Linux中查看进程与日志

    转至:https://www.cnblogs.com/dengxiaoning/p/13336778.html Linux尽管使用频繁,仍然每次都还是需要到处去找相关的命令,如进程,日志之类的,既然这 ...

  5. 如何在 Linux 中查看进程占用的端口号【转】

    对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的.如果你需要处理端口相关的问题,这篇文章可能会对你有用. 端口是 Linux 系统上特定进程之间逻辑连接的标识, ...

  6. [转帖]Linux教程(8)-Linux中的进程和日志㐇、

    Linux教程(8)-Linux中的进程和日志 2018-08-20 23:42:23 钱婷婷 阅读数 3554更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  7. Linux中查看进程的多线程

    在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...

  8. <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向

    [root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...

  9. Linux中查看进程及杀死进程命令

    Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00 ...

随机推荐

  1. 01篇ELK日志系统——升级版集群之elasticsearch集群的搭建

    [ 前言:以前搭了个简单的ELK日志系统,以我个人的感觉来说,ELK日志系统还是非常好用的.以前没有弄这个ELK日志系统的时候,线上的项目出了bug,报错了,要定位错误是什么,错误出现在哪个java代 ...

  2. Django框架(十一)-- 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表、mvc和mtv模式

    一.inclusion_tag 1.作用 用于生成HTML片段,是数据由参数传入而变成动态 2.使用 # 1.app下新建一个模块,templatetags # 2.创建一个py文件(mytag.py ...

  3. Odoo甘特图

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826366.html 甘特图(注意:社区版不支持甘特图!所以不会显示) 水平条状的甘特图通常用于显示项目计 ...

  4. 【JavaScript】案例三:使用JS完成页面定时弹出广告——事件(onload)

     事件(onload) *注意点: 变量加var局部变量,不加var全局变量 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. 返回值:返回 ...

  5. CentOS7配置本地Yum源

    从CentOS7官网下载DVD中存在需要的大部分软件,所以在没有网络的情况下可以配置yum源为本地的DVD,下载速度快,软件稳定.1. 如果使用虚拟机,那么就在虚拟机中挂载DVD的iso文件.2. 使 ...

  6. 开始Golang之旅了

  7. 转载-mysql中文编码问题

    具体原理见:MySQL:windows中困扰着我们的中文乱码问题 分割线: 我的电脑win7 64位,这个问题可能是所有win系统出现的问题 我出现的问题: 是正确的 出现了中文的张三,则错误,编码错 ...

  8. wireshark-wincap安装问题

    winpcap关键模块 32位系统: C:\Windows\system32\wpcap.dll C:\Windows\system32\Packet.dll C:\Windows\system32\ ...

  9. ACE在Ubuntu下的安装和编译

    之前写了很多linux下的底层网络API的demo,这些demo可用于了解底层的网络通信过程,但是想做出好的服务器用于实际业务还是非常困难的,需要大量的代码实现,移植性也非常差,想要写出高性能架构的服 ...

  10. About Her

    突然想给黑寡妇写点儿东西......(也许很多都不是我写的,但是能表达我的心意) 1. 众人进量子领域前最后一句话是她笑着说"一分钟后见." 而最终没有回来的,只有她自己一个 2. ...