Linux 系统资源限制(ulimit)是控制进程资源使用的重要机制,可以防止进程占用过多系统资源。
ulimit 基本概念:
- ulimit 是 shell 内置命令,用于控制 shell 进程及其子进程的资源限制
- 限制分为软限制(soft limit)和硬限制(hard limit)
- 软限制可以由用户调整,但不能超过硬限制
- 硬限制只能由 root 用户提高
- 配置文件:/etc/security/limits.conf、/etc/security/limits.d/
常用 ulimit 命令:
- ulimit -a:显示所有当前资源限制
- ulimit -n:查看/设置最大打开文件数
- ulimit -u:查看/设置最大用户进程数
- ulimit -s:查看/设置栈大小
- ulimit -v:查看/设置最大虚拟内存
- ulimit -m:查看/设置最大常驻内存
- ulimit -c:查看/设置 core 文件大小
- ulimit -t:查看/设置最大 CPU 时间
- ulimit -f:查看/设置最大文件大小
- ulimit -l:查看/设置最大锁定内存
- ulimit -p:查看/设置管道缓冲区大小
- ulimit -e:查看/设置最大调度优先级
- ulimit -r:查看/设置最大实时优先级
资源限制类型:
- 文件描述符限制:
- open files:最大打开文件数(-n)
- max locked memory:最大锁定内存(-l)
- 进程限制:
- max user processes:最大用户进程数(-u)
- max pending signals:最大挂起信号
- 内存限制:
- max memory size:最大常驻内存(-m)
- virtual memory:最大虚拟内存(-v)
- stack size:栈大小(-s)
- CPU 限制:
- cpu time:最大 CPU 时间(-t)
- max nice priority:最大 nice 优先级(-e)
- max realtime priority:最大实时优先级(-r)
- 其他限制:
- file size:最大文件大小(-f)
- pipe size:管道缓冲区大小(-p)
- core file size:core 文件大小(-c)
limits.conf 配置格式:
- 格式:
- domain:可以是用户、组、*(所有用户)、%组名
- type:soft(软限制)、hard(硬限制)、-(同时设置软硬限制)
- item:资源类型,如 nofile、nproc、memlock 等
- value:限制值,unlimited 表示无限制
配置示例:
shell# 限制所有用户的最大打开文件数 * soft nofile 65535 * hard nofile 65535 # 限制特定用户的最大进程数 username soft nproc 4096 username hard nproc 8192 # 限制特定组的最大内存 @groupname soft memlock 1048576 @groupname hard memlock 2097152 # 启用 core 文件 * soft core unlimited * hard core unlimited
临时修改限制:
- 在当前 shell 中修改:ulimit -n 65535
- 仅对当前 shell 及其子进程有效
- 退出 shell 后失效
永久修改限制:
- 编辑 /etc/security/limits.conf 文件
- 编辑 /etc/security/limits.d/ 目录下的配置文件
- 修改后需要重新登录才能生效
- 对于服务进程,需要重启服务
systemd 服务限制:
- 在服务配置文件中设置限制
- 配置项:
- LimitNOFILE=65535:最大打开文件数
- LimitNPROC=4096:最大进程数
- LimitMEMLOCK=infinity:最大锁定内存
- LimitCORE=infinity:core 文件大小
- 示例:
shell
[Service] LimitNOFILE=65535 LimitNPROC=4096
常见应用场景:
- Web 服务器(Nginx、Apache):
- 增加最大打开文件数:ulimit -n 65535
- 增加最大进程数:ulimit -u 4096
- 数据库服务器(MySQL、PostgreSQL):
- 增加最大打开文件数:ulimit -n 65535
- 增加 core 文件大小:ulimit -c unlimited
- 高并发应用:
- 增加最大打开文件数:ulimit -n 65535
- 增加最大进程数:ulimit -u 8192
- 开发环境:
- 启用 core 文件:ulimit -c unlimited
- 增加 core 文件大小:ulimit -c unlimited
查看进程限制:
- 查看 PID 的限制:cat /proc/PID/limits
- 查看进程打开的文件数:ls /proc/PID/fd | wc -l
- 查看进程线程数:ps -eLf | grep PID | wc -l
故障排查:
- "Too many open files" 错误:增加 ulimit -n
- "Cannot allocate memory" 错误:检查内存限制
- 进程无法启动:检查进程数限制
- core 文件未生成:检查 core 文件限制
最佳实践:
- 根据应用需求设置合理的限制值
- 不要设置过高的限制值,避免资源耗尽
- 监控资源使用情况,及时调整限制
- 在生产环境应用前先在测试环境验证
- 定期检查和更新限制配置