perf: improve worker and storage throughput
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
237899745
2026-07-26 00:57:29 +08:00
parent da9b273253
commit de5f451cd1
14 changed files with 611 additions and 101 deletions

View File

@@ -276,7 +276,8 @@ dotenvy = "0.15"
### 1. 并发处理
- 使用 Tokio 异步运行时
- 图片压缩使用 `spawn_blocking` 避免阻塞异步线程
- 可配置 Worker 线程数
- `WORKER_TASK_CONCURRENCY` 控制任务级并发,避免大批量任务独占 Worker
- `WORKER_CONCURRENCY` 控制单任务内文件并发,`IMAGE_PROCESSING_CONCURRENCY` 作为进程级 CPU 闸门
```rust
// 在独立线程池中执行 CPU 密集型压缩
@@ -292,6 +293,7 @@ let result = tokio::task::spawn_blocking(move || {
### 3. 缓存策略
- Redis 缓存用户会话
- S3 活动端点与历史端点缓存 5 秒AWS SDK Client 按端点和内外网地址复用连接池
- 可选:相同图片哈希缓存结果(去重)
## 安全考虑

View File

@@ -540,7 +540,7 @@ Dead-letter stream: stream:compress_jobs:dead
Dead-letter max length: 10000
```
Worker 每次优先处理本消费者 pending并认领空闲超过 5 分钟的其他消费者消息。消息第 3 次投递仍失败时写入死信流、将任务标记为失败并 ACK 原消息;已删除或已进入终态的任务直接 ACK。
Worker 最多并发处理 `WORKER_TASK_CONCURRENCY` 个消息。调度器只领取新消息或空闲超过 5 分钟的其他消费者消息,处理中的长任务每 60 秒通过 `XCLAIM JUSTID` 刷新 pending 空闲时间,避免被其他 Worker 重复认领且不增加投递次数;单条消息失败后在原任务槽内按 2 秒、4 秒指数退避并通过 `XCLAIM` 重新投递。第 3 次投递仍失败时写入死信流、将任务标记为失败并 ACK 原消息;已删除或已进入终态的任务直接 ACK。
### 5.4 任务进度(可选)
```

View File

@@ -11,7 +11,7 @@
- 最低 2 核 CPU、4GB 内存;启用 AVIF 和独立 Worker 时建议 4 核、8GB 内存
- 首次构建可访问 Docker Hub 与 crates.io
Debian 13、4 核 CPU、8GB 内存的实测起始值`WORKER_CONCURRENCY=2``IMAGE_PROCESSING_CONCURRENCY=2`。AVIF 是 CPU 密集型编码,不要直接把并发设置为 CPU 核数的数倍
Debian 13、4 核 CPU、8GB 内存的起始值建议为 `WORKER_TASK_CONCURRENCY=2``WORKER_CONCURRENCY=2``IMAGE_PROCESSING_CONCURRENCY=2`8 核应用服务器可从 `4/2/4` 开始。三者分别表示同时处理的任务数、单任务内文件数和单进程 CPU 图片处理上限。最后一项是全局 CPU 闸门,因此不要把它设置为 CPU 核数的数倍。任务并发提高后,数据库连接池建议至少为 `WORKER_TASK_CONCURRENCY * WORKER_CONCURRENCY + 4`,生产示例使用 16
生产 Compose 默认按 8 核 16GB 主机设置可覆盖的资源上限API 3GB、Worker 8GB、PostgreSQL 2GB、Redis 1GB对应变量为 `API_MEMORY_LIMIT``WORKER_MEMORY_LIMIT``POSTGRES_MEMORY_LIMIT``REDIS_MEMORY_LIMIT`。Redis 的 `REDIS_MAXMEMORY` 默认 768MB达到上限后返回写入错误而不是继续挤占宿主机内存。
@@ -170,4 +170,4 @@ docker stats
df -h
```
若图片压缩长时间排队,先检查 CPU`IMAGE_PROCESSING_CONCURRENCY`;若 API 健康但批量任务不推进,检查 Worker 日志Redis 状态
若图片压缩长时间排队,先检查 CPU再调 `IMAGE_PROCESSING_CONCURRENCY`大任务阻塞小任务时提高 `WORKER_TASK_CONCURRENCY`,单个批量任务推进过慢时再评估 `WORKER_CONCURRENCY`若 API 健康但批量任务不推进,检查 Worker 日志Redis pending 数和数据库连接池等待情况

View File

@@ -59,6 +59,8 @@ curl --fail http://127.0.0.1:18180/metrics
- `imageforge_storage_fallbacks_total`
- `imageforge_dead_letters_total`
`imageforge_storage_fallbacks_total` 是存储容量风险信号,而不仅是普通降级统计。建议对 `increase(imageforge_storage_fallbacks_total[5m]) > 0` 持续 5 分钟设置高优先级告警,并同步监控应用服务器 `uploads` 卷使用率,避免 S3 长时间不可用时本地回退写满磁盘。
Prometheus 抓取示例:
```yaml