摘要
本文基于真实生产环境实践,详细记录了在 45GB 内存的裸金属服务器上,使用 Docker Compose 部署开源 LLMOps 平台 Dify 1.7.1 的全过程。重点分析了因 Gunicorn Worker 被 SIGKILL 导致的服务崩溃问题,通过深入排查最终定位并解决。文章包含完整的架构图、排障流程图、Python 监控脚本、甘特图、思维导图及常见问题 FAQ,可作为国内 AI 应用开发者的参考手册。
目录
1 背景与目标 {#背景与目标}
随着大模型技术的发展,越来越多的企业开始构建自己的 AI 应用平台。Dify 作为一个开源的 LLMOps 平台,为开发者提供了快速搭建 AI 应用的能力。
项目信息
| 项目 | 说明 |
|---|---|
| 业务场景 | 企业内部知识库问答 + 低代码 Agent |
| 版本 | Dify 1.7.1 |
| 部署方式 | Docker Compose |
| 宿主机 | Ubuntu 22.04 / 45 GB RAM |
| 目标 | 单节点高可用,支持 100 并发 |
知识脉络思维导图

mindmap
root((Dify部署))
架构
容器图
网络图
故障
现象
定位
解决
监控
脚本
告警
扩展
高可用
多租户
2 部署架构 {#部署架构}
Dify 的核心组件包括 API 服务、Worker 服务、数据库、缓存、向量数据库等。通过 Docker Compose 进行编排,形成一个完整的 AI 应用平台。
系统组件关系图
3 环境准备 {#环境准备}
在开始部署之前,需要准备好基础环境。以下是在 Ubuntu 22.04 上的安装示例:
软件版本要求
| 软件 | 版本 | 安装命令示例 |
|---|---|---|
| Docker | 26 | apt install docker.io |
| Compose | v2 | curl -SL .../docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose |
| Git | 2.34 | apt install git |
部署计划甘特图
4 首次部署 {#首次部署}
按照官方文档进行首次部署,通常可以快速启动服务。
克隆官方仓库
git clone https://github.com/langgenius/dify.git
cd dify/docker
一键启动
cp .env.example .env
docker compose -p dify up -d
访问验证
http://<宿主机IP>
首次访问会引导初始化管理员账号。
5 故障现象 {#故障现象}
在高并发场景下,服务出现异常崩溃。查看日志发现以下关键信息:
| 时间 | 日志内容 |
|---|---|
| 08-02 08:27 | Worker (pid:34) was sent SIGKILL! Perhaps out of memory? |
故障触发链路流程图
6 根因分析 {#根因分析}
虽然系统有 45GB 内存,但通过排查发现以下问题:
| 排查项 | 结果 |
|---|---|
free -h | 45 GB 充足 |
| `dmesg | grep killed` |
docker stats | -- / -- 无限制 |
.env 默认配置 | SERVER_WORKER_AMOUNT=1 但 未显式设置 GUNICORN_WORKERS |
默认计算公式
# entrypoint.sh 片段
workers = multiprocessing.cpu_count() * 2 + 1
# 8核 -> 17 workers,占用内存 ≈ 17 * 200MB ≈ 3.4GB
问题在于 Dify 默认根据 CPU 核心数计算 Worker 数量,但在高并发场景下,过多的 Worker 会消耗大量内存,导致系统 Kill 进程。
7 解决方案 {#解决方案}
通过显式限制 Worker 数量来解决内存过载问题。
1. 显式限制 Worker
在 .env 末尾追加:
GUNICORN_WORKERS=2
2. 平滑重启
docker compose -p dify restart api
3. 验证
docker compose -p dify logs --since 10m api | grep -i error
# 无输出即成功
8 验证与监控 {#验证与监控}
为了确保服务稳定运行,需要建立监控机制。
Python 监控脚本(含中文注释)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
dify_monitor.py
每 30 秒采样一次容器内存,超过 80% 即告警
"""
import docker
import time
import psutil
client = docker.from_env()
THRESHOLD = 0.8 # 80%
while True:
for c in client.containers.list():
stats = c.stats(stream=False)
mem_usage = stats["memory_stats"]["usage"]
mem_limit = stats["memory_stats"]["limit"]
if mem_limit == 0:
continue
ratio = mem_usage / mem_limit
if ratio > THRESHOLD:
print(f"[告警] {c.name} 内存使用率 {ratio:.2%}")
time.sleep(30)
运行监控脚本:
pip install docker psutil
python3 dify_monitor.py
9 最佳实践 {#最佳实践}
根据实际运行经验,总结以下最佳实践配置:
| 实践 | 推荐值 | 备注 |
|---|---|---|
GUNICORN_WORKERS | 2~4 | 根据并发调整 |
GUNICORN_TIMEOUT | 360s | 支持长 SSE |
CELERY_WORKER_AMOUNT | 1~2 | 任务队列 |
| 日志级别 | INFO | 排查够用 |
| 备份 | 每日 pg_dump | cron 定时 |
内存占用分布饼图
10 常见问题 FAQ {#常见问题}
| 问题 | 回答 |
|---|---|
| 如何升级 Dify? | git pull && docker compose pull && docker compose up -d |
| 如何接入 Ollama? | .env 中设置 OLLAMA_API_BASE=http://ollama:11434 |
| 如何开启 HTTPS? | ./nginx/ssl 放证书,.env 中 NGINX_HTTPS_ENABLED=true |
| 如何限制文件大小? | UPLOAD_FILE_SIZE_LIMIT=50(单位 MB) |
11 总结与展望 {#总结与展望}
通过本次实践,我们成功解决了 Dify 在高并发场景下的内存崩溃问题,并建立了完整的监控体系。
关键成果
- ✅ 通过显式限制 Gunicorn Worker解决 SIGKILL
- ✅ 提供完整监控脚本与甘特图便于落地
- ⏳ 下一步:
- 多节点 Swarm 部署
- 接入 K8s HPA
- 引入 Prometheus + Grafana
12 参考资料 {#参考资料}
457

被折叠的 条评论
为什么被折叠?



