1. 首页 > 技术教程 > 正文

Docker 部署 AI 工具如何限制资源:CPU、内存和磁盘配额

AI 工具跑在 Docker 里,不限制资源很容易把 VPS 搞崩。Ollama 拉模型、Claude Code 跑推理、n8n 编排工作流时,CPU 占满、内存溢出、磁盘写爆,这些坑在主机选的读者群里几乎每周都有人问。别急着重装系统,先学会用 Docker 的资源限制参数,比事后排查日志省心得多。

zhujixuan TASK 163

为什么 AI 工具需要资源限制

AI 类容器和普通 Web 容器不一样。比如 Ollama 部署后如果没限制内存,一次加载 7B 模型可能吃掉 8GB 内存;Hermes Agent 跑多轮对话时 CPU 飙到 100% 持续几分钟;n8n 如果日志不清理,磁盘很快被占满。不设限制,一个容器就能拖垮同一台 VPS 上的所有服务。

Docker 原生支持 CPU、内存、磁盘配额,不需要装额外工具。核心参数就几个:`–cpus`、`–memory`、`–memory-swap`、`–storage-opt`。下面按场景拆开说。

CPU 配额:防止单容器占满所有核心

Docker 限制 CPU 的两种方式

1. 按 CPU 核心数限制

docker run –cpus="1.5" your-ai-image

`–cpus` 参数限制容器最多使用 1.5 个 CPU 核心。比如 VPS 是 4 核,设成 1.5 就能保证其他容器和系统进程有资源。

2. 按 CPU 份额分配权重(非硬限制)

docker run –cpu-shares=512 your-ai-image

默认份额是 1024,设成 512 表示这个容器只拿一半的 CPU 时间。注意:`–cpu-shares` 只在 CPU 争抢时生效,空闲时容器仍可用满全部核心。对 AI 推理这种突发负载,建议用 `–cpus` 做硬限制。

实战:给 Ollama 容器限制 2 核

docker run -d –name ollama \
–cpus="2" \
-v ollama:/root/.ollama \
-p 11434:11434 \
ollama/ollama

这样即使 Ollama 同时处理多个请求,也不会超过 2 个 CPU 核心。如果你跑 Codex 或 Claude Code 的 API 网关,同样适用。

内存限制:避免 OOM 杀死整个节点

Docker 内存配额参数详解

1. 硬限制内存上限

docker run –memory="4g" your-ai-image

容器最多使用 4GB 内存,超过直接 OOM Kill。AI 工具加载模型时内存飙升很快,这个参数必须设。

2. 限制 swap 使用

docker run –memory="4g" –memory-swap="6g" your-ai-image

`–memory-swap` 表示内存 + swap 总上限。如果设成 `–memory-swap="4g"`,等于禁用 swap,容器内存超过 4GB 立刻被杀。建议 swap 比内存大 1-2GB,防止模型加载中途被强杀。

3. 预留内存(软限制)

docker run –memory="4g" –memory-reservation="2g" your-ai-image

`–memory-reservation` 是 Docker 尽量保证容器至少有 2GB 可用,但其他容器争抢时可能被压缩。适合 n8n 这种对内存不太敏感的服务。

实战:给 Hermes Agent 容器限制 6GB 内存

docker run -d –name hermes-agent \
–memory="6g" \
–memory-swap="8g" \
-e OPENAI_API_KEY=sk-xxx \
your-hermes-image

注意:如果 VPS 总内存只有 8GB,设 6GB 硬限制后系统只剩 2GB,容易触发系统 OOM。建议留出总内存的 20% 给系统和其他服务。

磁盘配额:控制日志和模型缓存

Docker 限制容器磁盘写入

Docker 原生支持磁盘配额,但需要存储驱动支持(overlay2 默认支持)。常用参数:

1. 限制容器可写层大小

docker run –storage-opt size=10G your-ai-image

容器内所有写入(包括日志、临时文件)不能超过 10GB。超过后容器无法写入新文件,但已运行的服务可能报错。

2. 限制挂载卷的大小
如果 AI 工具把模型数据存在宿主机目录,比如 Ollama 的模型目录 `/root/.ollama`,需要靠宿主机文件系统限制(如 XFS 的 project quota 或 LVM)。Docker 本身无法限制 bind mount 卷的大小。一个变通方案是单独给模型目录挂一个虚拟磁盘:

dd if=/dev/zero of=/var/lib/docker/ollama-models.img bs=1M count=0 seek=20000
mkfs.ext4 /var/lib/docker/ollama-models.img
docker run -v /var/lib/docker/ollama-models.img:/root/.ollama …

这种方法略复杂,但能精确控制模型存储上限,适合生产环境。

实战:限制 n8n 日志目录大小

n8n 默认日志路径在 `/home/node/.n8n`,可以通过 `–storage-opt` 限制容器整体写入:

docker run -d –name n8n \
–storage-opt size=5G \
-e N8N_LOG_OUTPUT=file \
-v n8n_data:/home/node/.n8n \
n8nio/n8n

同时配合日志轮转(N8N 环境变量 `N8N_LOG_FILE_SIZE_MAX` 和 `N8N_LOG_FILE_COUNT_MAX`),双重保险。

老鸟叮嘱:资源限制的常见坑

1.`–memory-swap` 不设等于没限制内存
只设 `–memory` 不设 `–memory-swap`,Docker 默认允许容器使用双倍内存(即 memory + memory-swap 无上限)。必须显式指定 swap 上限。

2.CPU 限制对 GPU 容器无效
如果 AI 工具要用 GPU(比如通过 `–gpus all`),`–cpus` 只限制 CPU 核数,不影响 GPU 占用。GPU 资源需要用 nvidia-docker 的 `–gpus` 参数或设置 `NVIDIA_VISIBLE_DEVICES`。

3.磁盘限制可能被 overlay2 忽略
部分旧版 Docker 内核不支持 `–storage-opt size`,建议先用 `docker info` 确认存储驱动为 `overlay2` 且 `Backing Filesystem` 为 `xfs`。

4.别把所有服务塞进一个容器
限制资源的前提是每个容器跑单一服务。如果在一个容器里同时跑 Ollama 和 n8n,资源限制会互相干扰,日志排查也麻烦。

5.监控比限制更重要
设完参数不代表万事大吉。建议用 `docker stats` 定期检查,或接入 Prometheus + cAdvisor 做告警。主机选之前有文章介绍过 `docker stats` 的用法,可以翻翻。

FAQ

Q1:限制 CPU 后 AI 推理速度变慢怎么办?
A:先确认瓶颈在 CPU 还是内存。用 `docker stats` 观察,如果 CPU 使用率经常达到限制上限,说明核心数不够,需要增加 `–cpus` 值或升级 VPS。如果内存接近上限,模型可能被换到 swap,速度会暴跌。

Q2:为什么设了 `–memory="4g"` 容器还是被 OOM 杀了?
A:检查 `–memory-swap` 是否也设了。如果只设 memory 不设 swap,Docker 默认允许使用 8GB(4GB 内存 + 4GB swap)。如果总内存+swap 不够,系统 OOM Killer 仍会杀容器。建议把 memory-swap 设成和 memory 一样,强制容器不超过 4GB。

Q3:磁盘配额设了 10GB,但容器内 `df -h` 显示的还是宿主机大小?
A:正常。`–storage-opt` 限制的是容器可写层,不是挂载卷。容器内的 `df` 看到的是 overlay 文件系统,但实际写入超过 10GB 时会报 `No space left on device`。要限制挂载卷,请用上面提到的虚拟磁盘方案。

Q4:限制资源后,n8n 工作流跑一半报内存不足?
A:n8n 每个工作流节点都会占用内存,特别是调用 AI 模型时。建议先用 `–memory="2g"` 测试,然后根据 `docker stats` 的实际峰值上调。如果峰值接近限制,说明需要增大内存或拆分工作流。

Q5:多个 AI 容器共享一个 VPS,如何合理分配资源?
A:先统计每个容器的平均和峰值资源需求。比如 Ollama 分配 2 核 4GB,n8n 分配 1 核 1GB,再留 2GB 给系统。用 `docker-compose` 的 `deploy.resources` 字段可以统一管理,方便调整。

Q6:限制资源会影响 Docker 的自动重启策略吗?
A:不会。`–restart=always` 和资源限制独立。容器因 OOM 被杀后,Docker 会自动重启。但如果每次重启都立即 OOM,会陷入死循环,需要手动调整资源限制。

资源限制不是玄学,是每个 AI 工具上 VPS 的必修课。先设死参数,再根据监控调整,比出事后再查日志省几个小时。下次部署 Claude Code、Codex 或 Hermes Agent 时,记得先写一行 `–cpus` 和 `–memory`。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9940.html 商家投稿邮箱:zhujixuanblog@qq.com