进程级资源上限
--ulimit 设置容器内进程的 rlimit,控制文件句柄数、进程与线程数、核心转储大小、栈大小、可锁定内存等。不显式指定时,容器继承守护进程的取值,而守护进程又受 systemd 限制,所以「容器里能开多少文件」往往由两层配置共同决定。取值范围写「软:硬」,-1 表示不限制。
基本信息
| 语法 | --ulimit nofile=65536:65536,可重复多次 |
|---|---|
| 常用项 | nofile / nproc / core / stack / memlock |
| 默认来源 | 继承 dockerd 的 rlimit(受 systemd 单元限制) |
| 守护层默认 | daemon.json 的 default-ulimits 统一下发 |
典型使用场景
- 高并发服务报 too many open files:提高文件句柄上限
- 多线程应用创建线程失败:放开进程与线程数限制
- 生产禁用核心转储:把 core 设为 0,避免大文件突然写满磁盘
- 需要 mlock 的组件:数据库与加密库要求锁定内存,需放开 memlock
- 构建容器需要更多并发:编译任务同时打开大量文件,按需上调
设置与核对
设置与核对
# 提高文件句柄与进程数上限
docker run -d --name web --ulimit nofile=65536:65536 --ulimit nproc=4096:4096 nginx:1.27-alpine
# 容器内核对生效值
docker exec web sh -c 'ulimit -n; ulimit -u'
# 禁用核心转储
docker run --rm --ulimit core=0:0 alpine sh -c 'ulimit -c'
# 查看运行时配置里记录的取值
docker inspect -f '{{json .HostConfig.Ulimits}}' web常用项对照
| 项 | 含义 | 调整场景 |
|---|---|---|
| nofile | 同时可打开的文件句柄数 | 网关、消息队列报 too many open files |
| nproc | 进程与线程数上限 | 多线程应用创建线程失败 |
| core | 核心转储文件大小上限 | 设为 0 可避免异常退出时写出巨型文件 |
| memlock | 可锁定内存上限 | 数据库与加密组件需要 mlock |
| stack | 进程栈大小 | 栈偏大或递归较深的应用 |
软限是进程当前生效值,硬限是能提升到的上限;脚本里把软硬写成同一个值,后续调整不容易被硬限卡住。
报 too many open files 时,除了容器内的 ulimit,还要看 systemd 给 dockerd 的 LimitNOFILE,两层里更小的那个才是实际瓶颈。
容器内 ulimit -n 看软限、ulimit -Hn 看硬限:只调高软限而硬限偏低时,运行中的应用想自行提升上限仍然会被拒绝,排查时两个值都要打印出来对照。