资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。
######
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
因此,软硬限制之别可总结为以下几点:
- 软限制 直接起作用;
- 软限制 不能超出 硬限制 ;
- 硬限制 只能调低;
配置文件
通过配置文件设置 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资源项
| 项目 | 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 |
from socket import ( |
第 8 行,用一个列表来存放已创建的套接字( Python 套接字对象); 第 12-13 行,循环创建套接字并追加到列表中,直到 OSError 异常(系统调用出错); 第 15-16 行,打印错误码; 第 18-21 行,打印首尾套接字的文件描述符。
资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。的更多相关文章
- Linux 下监控用户最大进程数参数(nproc)是否到达上限
Linux 下监控用户最大进程数参数(nproc)是否到达上限的步骤: 1.查看各系统用户的进程(LWP)数: 注意:默认情况下采用 ps 命令并不能显示出所有的进程.因为 Linux 环境下执行多线 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- 十天学Linux内核之第二天---进程
原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...
- Linux内核分析-创建新进程的过程
分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long ...
- Linux内核分析— —创建新进程的过程
分析Linux内核创建一个新进程的过程 实验过程 要求:使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环 ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- 实验 六:分析linux内核创建一个新进程的过程
实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
- 作业六:分析Linux内核创建一个新进程的过程
分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
随机推荐
- 2048小游戏(c++)(转)
下为源码 #include <iostream> #include <windows.h> #include <ctime> using namespace std ...
- day-01-初识Python与条件判断
cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类大脑.飞机 内存:暂时存储数据,临时加载数据应用程序,4G,8G,16G,32G 速度快,高铁,断电即消失.造价很高 ...
- Dynamics CRM绑定表单查看当前表单的数据参数传递
我们做报表的时候,报表运行的位置可以在列表.也可以在报表区同时也可以在表单界面 其他两个都还好,不需要进行过滤,但是在表单界面运行报表需要将表单的GUID传给报表获取数据,否则就得手动去输入ID 具体 ...
- Web协议详解与抓包实战,高效解决网络难题
无论你是前后端工程师,还是运维测试,如果想面试更高的职位,或者要站在更高的角度去理解技术业务架构,并能在问题出现时快速.高效地解决问题,Web 协议一定是你绕不过去的一道坎. 旨在帮助你对各种常用 W ...
- Windows系统搭建ELK日志收集服务器
一.ELK是什么?ELK是由Elasticsearch.Logstash.Kibana这3个软件的首字母缩写. Elasticsearch是一个分布式搜索分析引擎,稳定.可水平扩展.易于管理是它的主要 ...
- Leedcode算法专题训练(动态规划)
递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算. 斐波那契数列 1. 爬楼梯 70. Climbing Stairs (Easy) L ...
- 告别DNS劫持,一文读懂DoH
如果评选一个差评服务器榜单,除去育碧高居榜首外,一定也少不了 Nintendo Switch 让人头秃的联网服务.尽管任天堂已经架设了香港 CDN 服务器用于加速,但是更新安装的速度也没有什么大幅改变 ...
- 解决CentOS虚拟机无法显示本地IP问题
1 问题描述 CentOS虚拟机无法显示本地ip,如图: 2 尝试过的方法 参考过此处的解决方法,把网卡配置中的ONBOOT修改为YES: 但是原来的网卡配置也是YES,所以修改的方法没有用,尝试了一 ...
- Go-23-接口
接口定义 type 接口名 interface{ 方法1(参数列表) [返回值] 方法2(参数列表)[返回值] } 接口实现 func (变量 结构体类型)方法1 ([参数列表])(返回值){ } f ...
- python进阶(17)协程
协程 协程(Coroutine),又称微线程,纤程.(协程是一种用户态的轻量级线程) 作用:在执行 A 函数的时候,可以随时中断,去执行 B 函数,然后中断B函数,继续执行 A 函数 (可以自动切 ...