PostgreSQL参数解析autovacuum_max_workers

PostgreSQL autovacuum_max_workers 参数指定了任一时刻,autovacuum 能够创建的最大工作进程的数量(不包含 autovacuum launcher 进程)。默认值为 3,调整该参数需要重启数据库。

  • 默认值:3
  • 最小值:1
  • 最大值:MAX_BACKENDS,即 0x3FFFF
  • 修改该参数需要重启数据库

在内核实现上,数据库启动时会根据 autovacuum_max_workers 参数值分配共享内存,每个 autovacuum 工作进程对应一个 WorkerInfoData 结构,AutoVacuumShmemSize() 函数是计算 autovacuum 需要的共享内存大小,如下:

Size
AutoVacuumShmemSize(void)
{
    Size		size;

    /*
     * Need the fixed struct and the array of WorkerInfoData.
     */
    size = sizeof(AutoVacuumShmemStruct);
    size = MAXALIGN(size);
    size = add_size(size, mul_size(autovacuum_max_workers,
                                   sizeof(WorkerInfoData)));
    return size;
}

在 auvacuum 共享内存初始化过程中,共享内存用于存储 WorkerInfoData 数组,该数组会通过 AutoVacuumShmem->av_freeWorkers 空闲链表进行数组元素的链接,后续需要创建工作进程时从该空闲链表中取出一个空闲的元素存储工作进程相关的信息。工作进程执行完成后,将该元素放回空闲链表中。如果 AutoVacuumShmem->av_freeWorkers 空闲链表为空,则不能再创建新的工作进程。

AutoVacuumShmemInit() 函数是 autovacuum 共享内存初始化的过程,如下:

void
AutoVacuumShmemInit(void)
{
    if (!IsUnderPostmaster)
    {
        worker = (WorkerInfo) ((char *) AutoVacuumShmem +
                               MAXALIGN(sizeof(AutoVacuumShmemStruct)));

        /* initialize the WorkerInfo free list */
        for (i = 0; i < autovacuum_max_workers; i++)
            dlist_push_head(&AutoVacuumShmem->av_freeWorkers,
                            &worker[i].wi_links);
    }
}

文章评论

0条评论