######

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 值:

$ 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) 3709
max locked memory (kbytes, -l) 16384
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) 3709
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

注解

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

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

$ ulimit -n
1024

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

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

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

注解

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

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

$ ulimit -Sn 512

注解

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

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

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

注解

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

软硬之分

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

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

$ ulimit -n
1024

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

$ ulimit -Sn
1024

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

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

$ ulimit -Hn
1048576

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

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

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

$ ulimit -n 1024

注解

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

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

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

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

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

配置文件

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

root    soft    nofile  1000000
root hard nofile 1000000 * soft nofile 1000000
* 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from socket import (
socket,
AF_INET,
SOCK_STREAM,
) def main():
sockets = [] while True:
try:
s = socket(AF_INET, SOCK_STREAM)
sockets.append(s)
except OSError as exc:
print('error no: %s' % (exc.errno,))
print('error string: %s' % (exc.strerror,)) print('fd range: [%d, %d]' % (
sockets[0].fileno(),
sockets[-1].fileno(),
)) break if __name__ == '__main__':
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. TreeMap和HashMap的元素比较

    写在前面的话 2021.04,准备面试和CCF CSP认证的我准备做一套CCF模拟题,然后就有了此篇博客(x 题目:201912-2 回收站报数 题目截图: 第一个想法:读取每个垃圾的位置,存入Tre ...

  2. Python的flask接收前台的ajax的post数据和get数据

    ajax向后台发送数据: ①post方式 ajax: @app.route("/find_worldByName",methods=['POST']) type:'post', d ...

  3. [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.1 Bode图回顾

    8.0 序 工程设计过程主要包括以下几个过程: 1.定义规格与其他设计目标 2.提出一个电路.这是一个创造性的过程,需要利用工程师的实际见识和经验. 3.对电路进行建模.变换器的功率级建模方法已经在第 ...

  4. python基础(十二):if分支表达式

    有时候,我们需要依照某种条件,再决定要不要做某个操作.在Python中,if语句能够帮助我们检查程序的当前状态,告诉计算机接下来该做什么. 条件表达式 每个if后面都跟着一个True或False的表达 ...

  5. Spring(一)简介和配置

    知识补充: 那么什么是xmlns呢?xmlns其实是XML Namespace的缩写,可译为"XML命名空间",但个人觉得,翻译后的名字反而不好理解,所以我们就叫它为XML Nam ...

  6. Appium 简介与自动化测试环境搭建

    1. Appium 简介 2. Appium 自动化测试环境搭建 1. Appium 简介 Appium 是一个开源测试自动化框架,可用于原生,混合和移动 Web 应用程序测试. 它使用 WebDri ...

  7. 如何在linux上手动连接到互联网

    作者 @飞洲人飞舟魂转载请注明出处. 一直以来对linux的网络管理不大明白,今天研究了一下网络的手动配置,现在记录一下.我使用Ubuntu20.04.1来进行演示. 介绍 首先我们先明确一些概念性的 ...

  8. OO博客总结——OO落下帷幕

    OO博客总结--OO落下帷幕 凡此过往,皆为序章. 不知不觉OO课程即将落下帷幕,一路坎坎坷坷磕磕绊绊,可算是要结束了,心里终于松了一口气,也有小小的不甘和遗憾.凡此过往,皆为序章.特殊的线上OO课程 ...

  9. 1030 Travel Plan

    A traveler's map gives the distances between cities along the highways, together with the cost of ea ...

  10. Android Linux deploy

    起因 旧安卓手机(小米5) 改造成服务器 开始 准备工作 小米5手机 下载Busybox busybox提供linux下基本的操作命令,也包含了 Android 系统的自带的shell Linux d ...