首页/云/Docker 容器速查/compose ulimits 调整进程资源限制
Compose 编排55 条

compose ulimits 调整进程资源限制

设置容器内进程的资源上限:no file 描述符、进程数等。高并发服务与运行大量文件的场景需要显式放宽默认值。

Docker 容器速查云更新于 2026-10-13

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 数量
corecore dump 文件大小为 0 时无法得到崩溃转储
memlock可锁定内存大小影响需要锁页的应用
容器内可设置的上限受宿主内核约束,先确认宿主 sysctl 允许再调整,否则容器直接创建失败。
soft 与 hard 写反(hard 小于 soft)会导致容器创建失败,改写时两个值一起核对。
ulimits 在容器创建时写入,docker update 只覆盖部分资源项;限制类改动要以重建容器为前提做发布计划。
nproc 限制的是可创建的进程与线程总数,Java 之类多线程应用常常先撞上 nproc 而不是 nofile,排查高并发故障时两个值都要看。

易错点

  • 连接数上不去但 CPU、内存都空闲时,先看容器内 ulimit -n,而不是只盯应用配置
  • soft 与 hard 写反会让容器创建直接失败,改写时两个值一起核对
  • 把限制设到宿主内核上限之上不会在文件里报错,而是容器起不来,先在测试环境确认宿主 sysctl
  • 以为 docker update 能改所有限制,实际许多项要重建容器才生效,容量规划要提前考虑
  • 只调一个限制项就上线,另一个相关项仍卡在原值,压测时表现为时好时坏,改动要成对核对

数据来源与参考

  • Docker 官方文档:Compose ulimits(docs.docker.com/reference/compose-file/services)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌