feat(deploy): add opt-in low-memory allocator configuration

Keep the glibc tuning value in config.yaml's app-runtime bridge and let
Compose inject it before the application starts. Leave tuning disabled
by default and document the 128 KiB preset, recreation, and upgrade steps.

Refs #338, #345

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Zyy
2026-10-05 09:44:32 +08:00
co-authored by Codex
parent 1c8a74e572
commit 28a57cbde5
3 changed files with 53 additions and 4 deletions
+42 -3
View File
@@ -8,7 +8,7 @@
| --- | --- |
| 安装与启动 | [手动安装](#手动安装) · [启动](#启动) · [公网访问](#公网访问) |
| 接入客户端 | [客户端配置](#客户端配置) · [登录与生图排查](#登录与生图排查) |
| 日常运维 | [运行设置](#启动后的运行设置) · [持久化与日志](#持久化与备份) · [请求排查](#请求错误排查) · [密码轮换](#密码语义) |
| 日常运维 | [运行设置](#启动后的运行设置) · [小内存优化](#小内存优化) · [持久化与日志](#持久化与备份) · [请求排查](#请求错误排查) · [密码轮换](#密码语义) |
| 更新与恢复 | [镜像升级](#镜像升级与源码构建) · [在线更新](#管理端在线更新) · [备份与恢复](#备份与恢复) · [优雅关停](#优雅关停) |
| 运行源码 | [开发与源码联调](../docs/development.md) |
@@ -18,12 +18,13 @@
| 位置 | 内容 | 修改方式 |
| --- | --- | --- |
| `deploy/config.yaml` | 监听、数据库/Redis 连接、部署凭据、时区与日志等启动配置 | 从模板创建,已有部署合并修改,不覆盖原文件 |
| `deploy/config.yaml` | 监听、数据库/Redis 连接、部署凭据、时区、日志与可选内存分配策略等启动配置 | 从模板创建,已有部署合并修改,不覆盖原文件 |
| `deploy/compose.yaml` | 镜像、容器网络、端口、挂载与资源限制 | 调整 Compose 并重建受影响容器 |
| PostgreSQL | 账号、Key、运行设置、上游身份、插件配置等业务数据 | 管理端或管理 API |
| 浏览器本地 | 主题和界面偏好 | 当前浏览器的主题设置 |
项目不使用 `.env` 配置文件。Compose 环境变量用于容器地址、镜像选择和构建发布。
项目不使用 `.env` 配置文件。Compose 环境变量用于容器地址、镜像选择和构建发布;
可选的内存分配策略由 `config.yaml` 的 `services.app-runtime` 桥接到应用容器。
配置加载会忽略未知字段,并在启动控制台提示字段名;不输出对应值。缺少必填字段时会指出缺项并停止启动,
已知字段的类型和取值仍需合法;可选字段省略时使用默认值
@@ -51,6 +52,44 @@ host:
备份调度从切换后的当前时刻计算未来执行点,不补跑旧时区漏过的任务,已入队任务保持原状态。
夏令时中不存在的预热或 Cron 时刻跳过,重复时刻只选较早一次。日志日期与保留规则见[日志与保留窗口](#日志与保留窗口)
### 小内存优化
Linux/glibc 部署可选择更积极地归还请求结束后的空闲内存,适合内存紧张且请求后 RSS 长时间偏高的机器。
该选项默认关闭,官方 Linux 镜像支持;更频繁的映射与回收可能增加 CPU 开销,应结合实际负载观察
在 `deploy/config.yaml` 的 `services.app-runtime.environment` 中设置 `GLIBC_TUNABLES`,空字符串表示不启用额外调优:
```yaml
services:
app-runtime:
environment:
GLIBC_TUNABLES: 'glibc.malloc.mmap_threshold=131072:glibc.malloc.trim_threshold=131072'
```
已有部署使用当前 Compose 模板时,需将 `config.example.yaml` 的 `app-runtime` 段合并到现有 `services` 下,保留 PostgreSQL 和 Redis 的桥接配置。
即使不开启优化,也保留该段并将值设为 `''`;Compose 从这里取得参数,无需在 `compose.yaml` 重复填写
校验并重建应用容器使配置生效;`docker compose restart` 不会更新容器环境变量:
```bash
docker compose -f deploy/compose.yaml config --quiet
docker compose -f deploy/compose.yaml up -d --no-build --no-deps --force-recreate codex-proxy-rs
```
此配置将 glibc 的 mmap 与 trim 阈值固定为 128 KiB,关闭对应的动态阈值调整。
如已有 `GLIBC_TUNABLES`,用冒号合并这两个参数,避免重复同名项;同时检查是否另设了 `MALLOC_MMAP_THRESHOLD_` 或 `MALLOC_TRIM_THRESHOLD_`,统一在一处维护。
参数含义见 [glibc 文档](https://sourceware.org/glibc/manual/latest/html_node/Memory-Allocation-Tunables.html)
关闭时删除这两个参数;没有其他 tunable 时将值恢复为 `''`,然后再次重建应用容器。
`services` 是 Compose 桥接区,直接运行二进制不会读取这一段。Linux/glibc 二进制部署需由启动器在进程启动前设置同一环境变量,例如:
```bash
GLIBC_TUNABLES=glibc.malloc.mmap_threshold=131072:glibc.malloc.trim_threshold=131072 ./codex-proxy-rs
```
该变量由 glibc 在进程启动时读取,不支持管理端热更新。
它不设置内存上限,不释放仍被请求或连接持有的缓冲,也不处理容器文件缓存;观察时分别比较进程 RSS、cgroup 的 `anon` 与 `file`
## 部署结构
```mermaid
+3
View File
@@ -64,6 +64,9 @@ services:
logging: *json-logging
codex-proxy-rs:
extends:
file: config.yaml
service: app-runtime
image: ${CPR_IMAGE:-ghcr.io/zyycn/codex-proxy-rs:latest}
build:
context: ..
+8 -1
View File
@@ -76,8 +76,15 @@ openai:
# 数据驻留约束;省略或 null 不指定地域约束,与管理端客户端身份无关。
residency: us
# Compose 凭据桥接区;密码仍只维护在 store 中。
# Compose 启动桥接区;密码仍只维护在 store 中。
services:
app-runtime:
environment:
# 默认空值;小内存机器可改为下列值,更积极回收空闲内存,但可能增加 CPU 开销。
# 'glibc.malloc.mmap_threshold=131072:glibc.malloc.trim_threshold=131072'
# 由 Compose 在进程启动前传入,修改后需重建应用容器,详见 deploy/README.md#小内存优化。
GLIBC_TUNABLES: ''
postgres-credentials:
environment:
POSTGRES_PASSWORD: *postgres_password