io_workers
io_workers:设置 io_method=worker 时使用的 I/O 工作进程数。实测在档范围为 PG18;最后在档的 PG18 启动默认值为 3,context 为 sighup。它在 PG19 Beta 3 被移除。
说明
Fact — 官方简述译文:设置 io_method=worker 时使用的 I/O 工作进程数。
身份
生命周期
| Fact | 值 |
|---|---|
| 首次观测 | PG18 |
| 在档版本 | PG18 |
| 移除版本 | PG19 Beta 3 |
| 引入提交 | 55b454d0e140 — aio: Infrastructure for io_method=worker |
| 提交日期 | 2025-03-18 |
| Discussion | 讨论 1 · 讨论 2 · 讨论 3 |
默认值变迁
| 版本 | 原始 boot_val |
单位 | 人类可读值 |
|---|---|---|---|
| PG18 | 3 |
— | 3 |
机制详解
io_workers 设置 PostgreSQL 18 在 io_method=worker 时使用的专用 I/O 工作进程数;对 io_uring 或 sync 无效。
I/O worker 代表数据库进程执行异步请求;这是执行池,与并行查询 worker 及通用后台 worker 名额不同。
数量可重载修改,但有效能力仍受 io_max_concurrency、负载队列深度、存储延迟与 CPU 限制。更多 worker 不保证设备吞吐更高。其 SIGHUP 上下文允许通过重载配置生效,无需重启服务器。
调优建议
提示
Advice。 以下建议是工作负载起点,必须用真实测量验证。
| 场景 | 建议 |
|---|---|
| OLTP | 只有 io_method=worker 时才调 io_workers。从 PG18 默认 3 开始,测量 worker 饱和、CPU 与尾延迟;只有符合条件的 I/O 在等待 worker 执行而不是等待设备时才扩大池。 |
| OLAP | 持续的符合条件扫描需要足够 I/O worker 才能喂满存储,但额外进程会增加调度开销,也不能突破单进程或设备并发瓶颈。应比较吞吐与 worker 利用率;请求尺寸由其他参数控制。 |
| 小规格 | 进程与 CPU 预算紧张时保留 3,或使用实测更小值。io_uring、sync 下 io_workers 无效,因此确认 io_method=worker 前不要调它。 |
Pigsty 取值
以下值来自固定 8 核、32 GiB、100 GiB SSD 夹具,并按 PG18 渲染当前 Pigsty 模板;这不表示 Pigsty 当前支持该历史或测试版本。
| 模板 | 有效值 | 与上游 boot 比较 | 源表达式 |
|---|---|---|---|
| OLTP | 4 |
不同于 boot 值 | {{ pg_io_workers }} |
| OLAP | 4 |
不同于 boot 值 | {{ pg_io_workers }} |
| CRIT | 4 |
不同于 boot 值 | {{ pg_io_workers }} |
| TINY | 3 |
等于 boot 值 | {{ pg_io_workers }} |
注意
Advice — 待人工复核。 当前 Pigsty 模板投影事实:OLTP: PG18 = 4 (dcs);OLAP: PG18 = 4 (dcs);CRIT: PG18 = 4 (dcs);TINY: PG18 = 3 (dcs)。 建议(待人工复核)——编辑推断(待维护者复核):该 worker 池解析值让 PG18 worker AIO 方法在非 tiny 模板拥有更多执行进程,同时 tiny 保持上游启动数量。
常见坑
- io_method 为 io_uring 或 sync 时修改 io_workers,此时它没有效果。
- 把 worker 进程数误当成每次请求字节数或单进程 I/O 上限。
- 存储设备已经饱和时仍增加 worker。
- 忘记可重载的 worker 池仍会消耗进程、CPU 与调度容量。
关联参数
io_method · io_max_concurrency · effective_io_concurrency · maintenance_io_concurrency · max_worker_processes