######

https://learn-linux.readthedocs.io/zh_CN/latest/administration/kernel/rlimit.html

############

资源限制

资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。

rlimit 可控制的系统资源包括: 内存 、 文件 、  、 CPU调度 、 进程数 等。 优秀系统管理员设置合适的 rlimit 值,避免某个用户或某个进程占用过多系统资源而拖垮系统。

本文介绍设置 rlimit 的来龙去脉,具体 rlimit 值属于 系统调优 范畴,暂不全面涉及。

ulimit命令

ulimit 是一个 Shell 内置命令,由于查看、调整当前 Shell 进程的 rlimit 值。 以 bash 为例,查看所有 rlimit 值:

  1. $ ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 3709
  7. max locked memory (kbytes, -l) 16384
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 1024
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 8192
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 3709
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

注解

资源项详细介绍请参考文章末尾处附录的表格。

也可以查看某项资源的限制,以进程打开 文件描述符 数( RLIMIT_NOFILE )为例:

  1. $ ulimit -n
  2. 1024

由此可见,当前 Shell 进程最多只能打开 1024 个 文件描述符 ,由该 Shell 启动的程序也是如此。 接着实现一个简单的程序,不断创建 套接字 ( socket ),以验证这一点:

  1. $ python detect-max-fd.py
  2. error no: 24
  3. error string: Too many open files
  4. fd range: [3, 1023]

显然,程序无法无限地创建 套接字 。 当 文件描述符 达到 rlimit 限制时, 相关 系统调用将失败, 错误码为 EMFILE ,即 Too many open files 。 成功打开的套接字文件描述符范围从 3 到 1023 ,与 1024 的上限相吻合。

注解

进程前三个文件描述符 0 、 1 、 2 分别是 stdin 、 stdout 以及 stderr 。

当然了,可以通过 ulimit 调整 文件描述符 上限:

  1. $ ulimit -Sn 512

注解

-S 选项指定 软限制 ,资源软硬限制之别请见下一小节。

这时,进程能打开的 文件描述符 变少了:

  1. $ python detect-max-fd.py
  2. error no: 24
  3. error string: Too many open files
  4. fd range: [3, 511]

注解

detect-max-fd.py 源码以及原理剖析请查看文章附录,位于末尾处。

软硬之分

资源限制有软硬之分, 软限制 ( soft )和 硬限制 ( hard )。

软限制 是一般意义的资源限制, 直接作用于用户或者进程 。 ulimit 默认返回软限制:

  1. $ ulimit -n
  2. 1024

也可通过 -S 选项显式指定返回 软限制 :

  1. $ ulimit -Sn
  2. 1024

由上一小节,我们知道用户可以将软限制调低或调高。 如果普通用户可以无限制调高, rlimit 将失去限制用户的意义。 为此,内核引入了 硬限制 ,规定了软限制调整的上限。

ulimit 查看 硬限制 需要指定 -H 选项:

  1. $ ulimit -Hn
  2. 1048576

调整 软限制 时,不能超出 硬限制 ,否则报错:

  1. $ ulimit -Sn 10485760
  2. -bash: ulimit: open files: cannot modify limit: Invalid argument

同样,可以将 硬限制 调低:

  1. $ ulimit -n 1024

注解

设置 rlimit 限制时,未指定软硬,则同时设置。

一旦调低 硬限制 ,便没有后悔药,无法再调高了(除非出动 root 用户):

  1. $ ulimit -Hn 1048576
  2. -bash: ulimit: open files: cannot modify limit: Operation not permitted

因此,软硬限制之别可总结为以下几点:

  1. 软限制 直接起作用;
  2. 软限制 不能超出 硬限制 ;
  3. 硬限制 只能调低;

配置文件

通过配置文件设置 rlimit 值,可永久生效,也可突破 ulimit 不能调高 硬限制 的局限。 配置文件 limits.conf 位于 /etc/security/limits.conf ,格式如下:

  1. root soft nofile 1000000
  2. root hard nofile 1000000
  3.  
  4. * soft nofile 1000000
  5. * hard nofile 1000000

每个配置行由 4 个字段组成,分别是:

  •  ( domain )
  • 类型 ( type )
  • 资源项 ( item )
  •  ( value )

其中,  可以是用户或者用户组(以 @ 开头,例如 @admin ), * 则表示任意用户; 类型 分为两种,分别对应 软限制 ( soft )和 硬限制 ( hard ); 资源项 列表见附录。

配置编辑完毕后,重新登录即可生效,无需重启。

注解

limits.conf 是 pam_limits.so 的配置文件, 而 pam_limits.so 是 Linux 插入式认证模块 ( Pluggable Authentication Modules 简称 PAM )的子模块。

根据 PAM 机制,应用程序启动时,按 /etc/pam.d 配置加载 pam_xxxx.so 模块。 /etc/pam.d 下包含了 login 、 sshd 、 su 、 sudo 等程序的 PAM 配置文件, 因此用户重新登录时,将调用 pam_limits.so 加载 limits.conf 配置文件。

附录

rlimit资源项

表格-1 资源项
项目 ulimit选项 含义
as -v 地址空间 (虚拟内存空间)大小限制
chroot   chroot 目录
core -c 核心转储文件 大小限制
cpu -t CPU执行时间 限制
data -d 进程数据段 大小限制
fsize -f 文件大小 限制
locks -x 文件锁数量 限制
memlock -l 锁定内存 ( locked-in-memory )地址空间大小限制
maxlogins   用户登录数 限制
maxsyslogins   系统登录数 限制
msgqueue -q 消息队列内存 限制
nice -e nice值上限
nofile -n 文件描述符 数量限制
nproc -u 进程数量 限制
priority    
rss -m 常驻内存 ( resident set )大小限制
rtprio -r 实时调度优先级
rttime    
sigpending -i 排队信号 ( pending signals )数量限制
stack -s 进程栈大小 限制

detect-max-fd.py源码

这是一个 Python 程序,循环创建套接字,促使进程打开文件描述符达到上限:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  1. from socket import (
  2. socket,
  3. AF_INET,
  4. SOCK_STREAM,
  5. )
  6.  
  7. def main():
  8. sockets = []
  9.  
  10. while True:
  11. try:
  12. s = socket(AF_INET, SOCK_STREAM)
  13. sockets.append(s)
  14. except OSError as exc:
  15. print('error no: %s' % (exc.errno,))
  16. print('error string: %s' % (exc.strerror,))
  17.  
  18. print('fd range: [%d, %d]' % (
  19. sockets[0].fileno(),
  20. sockets[-1].fileno(),
  21. ))
  22.  
  23. break
  24.  
  25. if __name__ == '__main__':
  26. main()

第 8 行,用一个列表来存放已创建的套接字( Python 套接字对象); 第 12-13 行,循环创建套接字并追加到列表中,直到 OSError 异常(系统调用出错); 第 15-16 行,打印错误码; 第 18-21 行,打印首尾套接字的文件描述符。

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号 :

小菜学编程

资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。的更多相关文章

  1. Linux 下监控用户最大进程数参数(nproc)是否到达上限

    Linux 下监控用户最大进程数参数(nproc)是否到达上限的步骤: 1.查看各系统用户的进程(LWP)数: 注意:默认情况下采用 ps 命令并不能显示出所有的进程.因为 Linux 环境下执行多线 ...

  2. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  3. 十天学Linux内核之第二天---进程

    原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...

  4. Linux内核分析-创建新进程的过程

    分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long ...

  5. Linux内核分析— —创建新进程的过程

    分析Linux内核创建一个新进程的过程 实验过程 要求:使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环 ...

  6. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  7. 实验 六:分析linux内核创建一个新进程的过程

    实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  8. 作业六:分析Linux内核创建一个新进程的过程

    分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...

  9. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

随机推荐

  1. 【10.5NOIP普及模拟】sort

    [10.5NOIP普及模拟]sort 文章目录 [10.5NOIP普及模拟]sort 题目描述 输入 输出 输入输出样例 样例输入 样例输出 数据范围限制 解析 code 题目描述 小x和小y是好朋友 ...

  2. [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.2 变比M分析

    5.2 变比M分析 经过一些改进,第二章中的用于CCM稳态分析的相同技术和近似方法可以应用于DCM. (a)电感伏秒平衡.电感电压直流分量必须为0: \[<v_{L}>=\frac{1}{ ...

  3. 北航OO第三单元作业总结(3.1~3.3)

    JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...

  4. kali 2019-4中文乱码解决方法

    1.更换阿里源 编辑源,apt-get update && apt-get upgrade && apt-get clean ,更新好源和更新软件 #阿里云deb ht ...

  5. Java(133-151)【String类、static、Arrays类、Math类】

    1.字符串概述和特点 string在lang包里面,因此可以直接使用 字符串的内容不可变 2.字符串的构造方法和直接创建 三种构造方法 package cn.itcast.day08.demo01; ...

  6. redis的并发竞争问题是什么?如何解决这个问题?

    这个也是线上非常常见的一个问题,就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 而且 ...

  7. FastAPI项目实战:"异步"接口测试"平台"

    apiAutoTestWeb 是什么? apiAutoTest接口自动化测试工具的可视化版本,将原本对用例的操作转移到Web页面之上 用什么实现? 接口自动化测试:大体上测试逻辑将采用apiAutoT ...

  8. surging 如何使用流媒体服务

    前言 随着直播行业大火,各种直播类产品和产品层出不穷,能够满足各方人员的需求和互动,也使得斗鱼.虎牙.抖音都随着直播业的大火而欣欣向荣, 大家也对直播平台了解不少,也参与使用,但是怎么样才能研发出视频 ...

  9. hdu 2841 Visible Trees(容斥)

    原文链接 There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is stand ...

  10. 【新手/零基础】Hexo+Gitee个人博客搭建教程--详细版

    前言 点此转到--精简版 可能很多小伙伴都有搭建一个属于自己的博客的想法.但是经常是无奈于自己匮乏的知识.但是,每个老手都是新手过来的,再困难的事情,只要肯花一点时间都可以办成. 本次教程分为详细版和 ...