ulimits 字段的作用
ulimits 字段设置容器内进程的资源上限,最常用的是 nofile(可打开的文件描述符数)与 nproc(进程与线程数)。高并发网关、连接数密集的服务、需要同时打开大量文件的批处理任务,都可能被默认值卡住,需要在这里显式放宽。
基本信息
| 字段 | ulimits: nofile / nproc / core 等 |
|---|---|
| 写法 | 标量值,或 {soft:.., hard:..} 结构 |
| 生效时机 | 容器创建时设置,改动需重建容器 |
| 上限约束 | 受宿主内核与守护进程默认值约束 |
| 核对方法 | docker compose exec <服务> sh -c 'ulimit -n' |
典型使用场景
- 高并发服务:连接数上不去但 CPU 与内存都空闲时先查这里
- 文件密集型批处理:一次需要打开大量文件的任务
- 排障需要 core dump:core 限制为 0 时拿不到崩溃转储
- 把宿主上验证过的基线同步到容器编排,避免环境差异
- 限制容器内进程数,防止 fork 风暴拖垮宿主
Compose 写法示例
Compose 写法示例
services:
api:
image: app/api:1.4.2
ulimits:
nofile:
soft: 65535 # 软限制:进程默认可用上限
hard: 65535 # 硬限制:非特权进程不可再放宽
nproc: 65535 # 进程与线程数上限核对生效值
核对生效值
docker compose exec api sh -c 'ulimit -n; ulimit -u' # 容器内实际限制
cat /proc/sys/fs/file-max # 宿主系统级上限
sysctl fs.nr_open # 单项进程可打开的上限常见限制项
| 限制项 | 含义 | 影响面 |
|---|---|---|
| nofile | 可打开的文件描述符数 | 并发连接与文件句柄的实际上限 |
| nproc | 进程与线程数上限 | 限制或放开 fork 数量 |
| core | core dump 文件大小 | 为 0 时无法得到崩溃转储 |
| memlock | 可锁定内存大小 | 影响需要锁页的应用 |
容器内可设置的上限受宿主内核约束,先确认宿主 sysctl 允许再调整,否则容器直接创建失败。
soft 与 hard 写反(hard 小于 soft)会导致容器创建失败,改写时两个值一起核对。
ulimits 在容器创建时写入,docker update 只覆盖部分资源项;限制类改动要以重建容器为前提做发布计划。
nproc 限制的是可创建的进程与线程总数,Java 之类多线程应用常常先撞上 nproc 而不是 nofile,排查高并发故障时两个值都要看。