开发者社区> 问答> 正文

关于postgre 内存的使用

已解决

27071230_4Tf4

望达人分析说明下postgre 对内存等其他资源的利用27071230_TJc7

比如:temp_buffer,wal_buffers

temp_buffers 使用的是 shared_buffers 还是 新开的内存?

展开
收起
大鹏888 2015-12-22 10:23:28 3835 0
3 条回答
写回答
取消 提交回答
  • 公益是一辈子的事, I am digoal, just do it. 阿里云数据库团队, 擅长PolarDB, PostgreSQL, DuckDB, ADB等, 长期致力于推动开源数据库技术、生态在中国的发展与开源产业人才培养. 曾荣获阿里巴巴麒麟布道师称号、2018届OSCAR开源尖峰人物.
    采纳回答

    temp_buffer和shared_buffers是分开的.
    GUC

            {
                    {"temp_buffers", PGC_USERSET, RESOURCES_MEM,
                            gettext_noop("Sets the maximum number of temporary buffers used by each session."),
                            NULL,
                            GUC_UNIT_BLOCKS
                    },
                    &num_temp_buffers,
                    1024, 100, INT_MAX / 2,
                    check_temp_buffers, NULL, NULL
            },

    申请代码

    /*
     * InitLocalBuffers -
     *        init the local buffer cache. Since most queries (esp. multi-user ones)
     *        don't involve local buffers, we delay allocating actual memory for the
     *        buffers until we need them; just make the buffer headers here.
     */
    static void
    InitLocalBuffers(void)
    {
            int                     nbufs = num_temp_buffers;
            HASHCTL         info;
            int                     i;
    
            /* Allocate and zero buffer headers and auxiliary arrays */
            LocalBufferDescriptors = (BufferDesc *) calloc(nbufs, sizeof(BufferDesc));
            LocalBufferBlockPointers = (Block *) calloc(nbufs, sizeof(Block));
            LocalRefCount = (int32 *) calloc(nbufs, sizeof(int32));
            if (!LocalBufferDescriptors || !LocalBufferBlockPointers || !LocalRefCount)
                    ereport(FATAL,
                                    (errcode(ERRCODE_OUT_OF_MEMORY),
                                     errmsg("out of memory")));
    
            nextFreeLocalBuf = 0;
    
            /* initialize fields that need to start off nonzero */
            for (i = 0; i < nbufs; i++)
            {
                    BufferDesc *buf = &LocalBufferDescriptors[i];
    
                    /*
                     * negative to indicate local buffer. This is tricky: shared buffers
                     * start with 0. We have to start with -2. (Note that the routine
                     * BufferDescriptorGetBuffer adds 1 to buf_id so our first buffer id
                     * is -1.)
                     */
                    buf->buf_id = -i - 2;
            }
    
            /* Create the lookup hash table */
            MemSet(&info, 0, sizeof(info));
            info.keysize = sizeof(BufferTag);
            info.entrysize = sizeof(LocalBufferLookupEnt);
            info.hash = tag_hash;
    
            LocalBufHash = hash_create("Local Buffer Lookup Table",
                                                               nbufs,
                                                               &info,
                                                               HASH_ELEM | HASH_FUNCTION);
    
            if (!LocalBufHash)
                    elog(ERROR, "could not initialize local buffer hash table");
    
            /* Initialization done, mark buffers allocated */
            NLocBuffer = nbufs;
    }
    2019-07-17 18:20:32
    赞同 1 展开评论 打赏
  • 菜鸟

    十分感谢指教。我们公司也是阿里云用户,哈哈,


    @明虚 感谢回复。
    shared_buffers 是哪些会用到? 我看了很多网站是建议 物理内存的 1/4 - 1/5,
    我不明白具体是什么会用到,设置什么才是会符合我们的业务。

    2019-07-17 18:20:33
    赞同 展开评论 打赏
  • PostgreSQL、Greenplum内核开发

    tmp_buffers,也就是pg代码里面的local buffers,各个backend是不需要共享这部分内存的,所以这部分内存是在需要的时候malloc的私有内存,非shared_buffers内存。

    2019-07-17 18:20:32
    赞同 1 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
RDS SQL Server CPU高使用率性能优化 立即下载
RDS SQL Server CPU 高使用率性能优化 立即下载
SQL Sever迁移PG经验 立即下载