【问题标题】:Is it possible to know the memory being allocated by the method "CreateSharedMemoryAndSemaphores"?是否可以知道“CreateSharedMemoryAndSemaphores”方法分配的内存?
【发布时间】:2016-09-21 05:04:32
【问题描述】:

我是数据库和 Postgres 的新手,我正在分析 Postgres 在“CreateSharedMemoryAndSemaphores”方法中分配的内存。

like 变量“size”从默认值 100000 开始,然后添加一堆共享内存,如“SpinlockSemaSize”、“LockShmemSize”等。

有没有办法知道哪个方法给变量增加了多少内存?

    size = 100000;
    size = add_size(size, SpinlockSemaSize());
    size = add_size(size, hash_estimate_size(SHMEM_INDEX_SIZE,
                                             sizeof(ShmemIndexEnt)));
    size = add_size(size, BufferShmemSize());
    size = add_size(size, LockShmemSize());
    size = add_size(size, PredicateLockShmemSize());
    size = add_size(size, ProcGlobalShmemSize());
    size = add_size(size, XLOGShmemSize());
    size = add_size(size, CLOGShmemSize());
    size = add_size(size, CommitTsShmemSize());
    size = add_size(size, SUBTRANSShmemSize());
    size = add_size(size, TwoPhaseShmemSize());
    size = add_size(size, BackgroundWorkerShmemSize());
    size = add_size(size, MultiXactShmemSize());
    size = add_size(size, LWLockShmemSize());
    size = add_size(size, ProcArrayShmemSize());
    size = add_size(size, BackendStatusShmemSize());
    size = add_size(size, SInvalShmemSize());
    size = add_size(size, PMSignalShmemSize());
    size = add_size(size, ProcSignalShmemSize());
    size = add_size(size, CheckpointerShmemSize());
    size = add_size(size, AutoVacuumShmemSize());

实际代码:https://github.com/postgres/postgres/blob/848ef42bb8c7909c9d7baa38178d4a209906e7c1/src/backend/storage/ipc/ipci.c

【问题讨论】:

    标签: database postgresql memory-management shared-memory postgresql-9.4


    【解决方案1】:

    要计算出每行对总数的准确量,您必须阅读各个函数定义。

    但通常到目前为止,最大的部分来自

    size = add_size(size, BufferShmemSize());
    

    共享缓冲区(共享 PostgreSQL 页面缓存)的空间在哪里计算。

    BufferShmemSize(),最大的贡献来自这行:

    /* size of data pages */
    size = add_size(size, mul_size(NBuffers, BLCKSZ));
    

    NBuffers 是一个全局变量,包含postgresql.conf 参数shared_buffers(PostgreSQL 用语中的GUC),而BLCKSZ 是8192,除非在pg_config.h 中手动更改,几乎没有人这样做。

    【讨论】:

    • 是否可以在不使用某种实用程序或任何其他进程启动 postgres 引擎的情况下找到共享内存计算的值(在 ipci.c 文件中的 CreateSharedMemoryAndSemaphores() 方法中计算的值) ?
    • 看看机器上的共享内存段有多大。这将取决于操作系统;在 Linux 上,您将使用 ipcs -m
    • 只有在启动postgres db引擎后才能找到。我想要一种在不启动 postgres 数据库引擎的情况下找到它的方法。
    • 如我所说,如果shared_buffers 对您来说不够好估计,您将不得不手动检查所有函数定义。
    猜你喜欢
    • 2018-04-28
    • 2014-05-20
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多