由 John Doe 三月 20, 2025
在 PostgreSQL 运行过程中,您有没有遇到过 VACUUM 清理不过来的情况?或者清理太过激进影响到业务运行的情况?
特性提交日志
允许在不重启的情况下更改 autovacuum_max_workers。
此补丁引入了一个新参数autovacuum_worker_slots
,用于控制服务器启动时预留多少个 autovacuum 工作槽。虽然修改这个新参数的值依然需要重启服务器,但它通常应设置为你在实际应用中可能需要的 autovacuum_max_workers 的上限。有了这个新参数之后,就可以通过发送 SIGHUP 信号(例如使用pg_ctl reload
)动态修改 autovacuum_max_workers。
如果 autovacuum_max_workers 的值超过autovacuum_worker_slots
,服务器会发出警告,并且在任一时刻最多只会启动autovacuum_worker_slots
个工作进程。如果 autovacuum_max_workers 被设置为一个小于当前正在运行的 autovacuum 工作进程数量的值,那么那些已经在运行的进程会继续执行,但在运行的自动清理工作进程数量降至 autovacuum_max_workers 以下之前,不会再启动新的进程。
讨论:https://postgr.es/m/20240410212344.GA1824549%40nathanxps13
评价
这个改动还是非常有趣的,很多 PostgreSQL 用户都很关心 autovacuum,通常很多人并没有正确配置好 autovacuum 相关参数。其中一部分问题在于,如何以一种使其能在一天中的特定时段工作更高效的方式来配置自动清理功能。得益于这一改动,用户可以这样:
- 将
autovacuum_worker_slots
设置为一个较高的值(如 50); - 将 autovacuum_max_workers 设置为一个较保守的值(例如 3 到 10);
然后,在低峰时段(如夜间或周末)通过动态调整 autovacuum_max_workers 到更高的数值,从而在需要时让 autovacuum 处理更多工作。
示例
那么,我们来看看实际是如何操作的。
-- 查看autovacuum_worker_slots的值
show autovacuum_worker_slots;
autovacuum_worker_slots
-------------------------
50
(1 row)
-- 查看autovacuum_max_workers的值
show autovacuum_max_workers;
autovacuum_max_workers
------------------------
3
(1 row)
这是初始设置。现在,假设我们进入了希望自动清理功能完成更多工作的时段,那么我可以:
-- 修改autovacuum_max_workers的值
alter system set autovacuum_max_workers = 10;
-- 重新加载配置
select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
从这一刻起,自动清理功能将最多使用 10 个并发工作进程:
-- 再次查看autovacuum_max_workers的值
show autovacuum_max_workers;
autovacuum_max_workers
------------------------
10
(1 row)
当低负载时段结束,我们需要缩减维护工作时:
-- 重置autovacuum_max_workers的值
alter system reset autovacuum_max_workers;
-- 重新加载配置
select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
-- 查看autovacuum_max_workers的值
show autovacuum_max_workers;
autovacuum_max_workers
------------------------
3
(1 row)
确实很棒,这样的功能值得期待。非常感谢所有社区的相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/c758119e5bfb47b38cf957f9a5a37ceae96fa9b3