perf(redis): 优化 Redis 配置并添加资源限制

- 为 Redis 添加 ./data/redis:/data 持久化挂载
- 在 redis.conf 中设置 maxmemory 2gb 限制内存使用
- 禁用 RDB 快照,启用 appendfsync everysec 避免 OOM
- 在 docker-compose.yml 中为 Redis 添加 mem_limit: 2g 和 memswap_limit: 2g
- 为 MongoDB 添加 --wiredTigerCacheSizeGB 1.5 和 mem_limit: 2500m
- 为 easyai-server 添加 mem_limit: 2200m 内存限制
- 更新 README.md 文档说明 Redis 资源护栏和迁移步骤
This commit is contained in:
wangbo 2026-06-22 23:20:40 +08:00
parent 42ef68857d
commit 0aebe62f70
3 changed files with 42 additions and 10 deletions

View File

@ -99,6 +99,35 @@ Windows 下使用 `update.ps1`,功能与 Linux 版一致:
## 重要更新记录:
### 2026.06.22
1. **Redis 资源护栏**Redis 增加 `./data/redis:/data` 持久化挂载、`maxmemory 2gb`、`appendfsync everysec`,并禁用 RDB 快照,避免队列历史膨胀后占满内存和容器写层。
2. **Mongo/主服务内存限制**Mongo 增加 `--wiredTigerCacheSizeGB 1.5` 和容器内存限制,`easyai-server` 增加内存限制,避免 8G 机器上 Redis/Mongo/Node 相互挤压触发 OOM。
3. **升级前置要求**:如果线上 Redis 之前没有 `/data` volume先完成 Redis request-limit 队列历史清理,再迁移 Redis 数据目录,最后重建 Redis 容器。
#### Redis 数据迁移与重启步骤
执行前建议先做云盘快照或外部备份。磁盘空间紧张时,不要直接在当前机器上 `BGSAVE` 或复制大体积 Redis 文件。
```bash
cd ~/easyai
# 1. 先通过后台 ModelRuntime 运维接口或后端启动清理逻辑清理 request-limit 历史:
# - trim bull:request_limit_*:events 到小长度
# - 只清 completed/failed不删除 waiting/active/delayed
# 2. 确认 Redis 内存已经下降后,再准备新的持久化目录
mkdir -p ./data/redis
# 3. 如果旧 Redis 数据在容器写层,先按实际容器内 /data 内容迁移到宿主机目录
docker cp redis:/data/. ./data/redis/
# 4. 更新配置后重建关键容器
docker compose up -d redis mongo easyai-server
```
迁移后验收建议Redis `used_memory_human < 2G``bull:request_limit_*:events` 长度维持在小窗口24 小时内无 OOM。
### 2026.3.20
1. **新增 Agent 记忆服务AMS模块**:新增 `agent-memory`Agent 长期记忆)容器,复用 `easyai-pgvector` 数据库(需 pgvector 扩展),用于支持 Agent 对话记忆、向量召回与反馈能力。

View File

@ -67,6 +67,7 @@ services:
- ./data/tmp:/tmp
# - ./data/backend/pm2.config.js:/app/pm2.config.js
restart: unless-stopped
mem_limit: 2200m
environment:
# MongoDB配置用户管理不会配置的话保持默认即可
- CONFIG_DB_MONGO_URI=mongodb://172.21.0.3:27017
@ -189,6 +190,8 @@ services:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
command: [ "mongod", "--wiredTigerCacheSizeGB", "1.5" ]
mem_limit: 2500m
volumes:
# - /usr/local/mongo/data:/data/db
- mongo_data:/data/db # 使用docker volume存储数据提高性能避免兼容性问题
@ -210,7 +213,10 @@ services:
restart: always
volumes:
- ./redis.conf:/etc/redis/redis.conf # 挂载本地 redis.conf
- ./data/redis:/data # 持久化 Redis AOF/RDB避免落到容器写层
command: [ "redis-server", "/etc/redis/redis.conf" ] # 让 Redis 读取配置文件
mem_limit: 2g
memswap_limit: 2g
# ports:
# - ${REDIS_PORT+${REDIS_PORT}:6379}
# read_only: true

View File

@ -15,16 +15,15 @@ daemonize no
#pidfile /data/dockerData/redis/run/redis6379.pid
#默认为noredis持久化可以改为yes
appendonly yes
dir /data
#当客户端闲置多长时间后关闭连接如果指定为0表示关闭该功能 # 增加到300秒或设为0禁用
timeout 300
# 服务器系统默认配置参数影响 Redis 的应用
maxclients 10000
# 减少到60秒更快检测连接问题
tcp-keepalive 60
#指定在多长时间内有多少次更新操作就将数据同步到数据文件可以多个条件配合分别表示900秒15分钟内有1个更改300秒5分钟内有10个更改以及60秒内有10000个更改
save 900 1
save 300 10
save 60 10000
# 禁用 RDB 快照,避免小内存机器上 fork bgsave 触发 OOM生产保留 AOF。
save ""
# 按需求调整 Redis 线程数
tcp-backlog 511
# 设置Redis副本实例是否为只读模式
@ -34,14 +33,13 @@ replica-read-only no
# 设置Redis最大内存达到时的数据淘汰策略
# noeviction当内存达到最大限制时Redis不会自动删除任何键这可能导致进一步的操作失败直到手动干预 # 当内存不足时,删除最近最少使用的键
# maxmemory-policy allkeys-lru
maxmemory 2gb
maxmemory-policy noeviction
# 设置数据库数量这里设置为16个数据库
databases 16
# 启用 AOF, AOF常规配置
appendonly yes
# 改为由操作系统决定何时同步减少I/O压力
appendfsync no
no-appendfsync-on-rewrite no
# AOF 常规配置
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 慢查询阈值
@ -71,4 +69,3 @@ zset-max-ziplist-entries 128
zset-max-ziplist-value 64