perf: improve worker and storage throughput
Some checks failed
CI / verify (push) Has been cancelled
Some checks failed
CI / verify (push) Has been cancelled
This commit is contained in:
@@ -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 按端点和内外网地址复用连接池
|
||||
- 可选:相同图片哈希缓存结果(去重)
|
||||
|
||||
## 安全考虑
|
||||
|
||||
@@ -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 任务进度(可选)
|
||||
```
|
||||
|
||||
@@ -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 数和数据库连接池等待情况。
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user