diff --git a/README.md b/README.md index f3c7ae4..53cd491 100644 --- a/README.md +++ b/README.md @@ -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 对话记忆、向量召回与反馈能力。 diff --git a/docker-compose.yml b/docker-compose.yml index c44de56..fc071e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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 diff --git a/redis.conf b/redis.conf index b97dbc4..c863994 100755 --- a/redis.conf +++ b/redis.conf @@ -15,16 +15,15 @@ daemonize no #pidfile /data/dockerData/redis/run/redis6379.pid #默认为no,redis持久化,可以改为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 -