文章目录
- 一. limits.conf常见配置项详解
- 二. 文件描述符(file descriptor)简述
- 三. 为什么限制
- 四. 相关操作
- 1. 展示当前资源限制
- 2. 查看系统当前打开的文件描述符数量
- 3. 查看某个进程打开的文件描述符数量
- 4. 各进程占用的文件描述符
/etc/security/limits.conf 是一个用于配置用户或用户组资源限制的配置文件。这个文件通常用于设置系统资源的软限制和硬限制,以及一些特殊权限。
一. limits.conf常见配置项详解
下面是一些 /etc/security/limits.conf 文件中可能包含的常见配置项:
描述
- 第一列表示用户和组(@开头),这里的 * 代表所有用户。第二列表示软限制还是硬限制,第三列表示限制的资源类型,第四列表示限制的最大值 hard和soft的区别。
- soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值。
- core是内核文件,nofile是文件描述符,noproc是进程,一般情况下只限制文件描述符数和进程数就够了
注意
修改了 /etc/security/limits.conf 文件后,需要注销并重新登录用户,或者重新启动相关的服务才能使配置生效。
二. 文件描述符(file descriptor)简述
文件描述符是一个索引
Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作文件的时候,如果每操作一次就找一次名字,这就会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,与文件交互时直接找索引即可,这里的索引就是文件描述符。
文件描述符(file descriptor)是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。
文件描述符表格
Linux内核对所有打开的文件有一个文件描述符表格,里面存储了每个文件描述符作为索引与一个打开文件相对应的关系,简单理解如上图这样一个数组,文件描述符(索引)就是文件描述符表这个数组的下标,数组的内容就是指向一个个打开的文件的指针。
三. 为什么限制
为什么要限制打开的文件描述符?
- 资源问题:每个打开的文件都需要消耗内存来管理,而内存是有限的。
- 安全问题:如果不限制的话,有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。
为什么限制进程数?
资源管理: 进程数限制有助于控制系统资源的分配和使用。每个进程都需要分配一些系统资源,如内存、CPU 时间、文件描述符等。如果允许无限制地创建大量进程,可能会消耗掉系统的资源,导致系统变得不稳定或崩溃。
性能和稳定性:过多的进程可能会导致系统性能下降。当系统负载增加时,会增加调度和管理进程的开销,可能导致响应时间变长,甚至影响到系统的稳定性。
安全性: 进程数限制也有助于防止恶意软件或恶意用户通过大量的进程耗尽系统资源,从而对系统进行拒绝服务攻击(Denial of Service,DoS)或拖垮系统的运行。
避免资源竞争: 限制进程数也有助于避免资源竞争。在某些情况下,过多的进程可能争夺相同的资源,导致竞争、阻塞或性能下降。
四. 相关操作
1. 展示当前资源限制
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) 63456
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 327680
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 locked memory (kbytes, -l): 最大锁定内存大小限制,表示进程可以锁定在内存中的最大数据量。这里设置为 64 KB。
open files (-n): 打开文件的数量限制,表示进程可以同时打开的文件数量。这里设置为 327680。
pipe size (512 bytes, -p): 管道大小限制,表示管道缓冲区的最大大小。这里设置为 8,表示管道缓冲区的大小为 8 * 512 字节。
stack size (kbytes, -s): 栈大小限制,表示进程栈的最大大小。这里设置为 8192 KB。
max user processes (-u): 最大用户进程数限制,表示一个用户可以创建的最大进程数量。这里设置为 4096。
2. 查看系统当前打开的文件描述符数量
sudo cat /proc/sys/fs/file-nr
1184 0 1610170
- 第一个数:表示当前系统分配后已使用的文件描述符数,
- 第二个数:表示分配后未使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用),
- 第三个数:等于最大值file-max。
3. 查看某个进程打开的文件描述符数量
$ lsof -p 20262 |wc -l
5
4. 各进程占用的文件描述符
lsof -n |awk '{print $10}'|sort |uniq -c |sort -nr|head -10
9838
488 IDEA
279 Chrome.app/Contents/Frameworks/Google
150 Book
96 id
58 Layouts/AppleKeyboardLayouts.bundle/Contents/Resources/AppleKeyboardLayouts-L.dat
50 Support/Google/Chrome/Subresource
41 (ESTABLISHED)
36 Support/XMind/Electron
33 Support/Google/Chrome/optimization_guide_model_store/25/63922A0C010C80A5/6B406658B3AA7A20/visual_model_desktop.tflite