暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL学习随笔5 pg_dynshmem 以及动态共享内存

1614

PostgreSQL 动态共享内存类型

1.posix

2.sysv

3.windows

4.mmap

进程间通信

系统内的进程可以是独立的,也可以是协作的。如果进程是独立的,则不受其他进程执行的影响,如果是协作进程,则可以受其他进程的影响。

进程间通信是一种允许进程相互通信并同步其动作的机制。

Linux Kernel 提供了不同类型的IPC机制,其中PostgreSQL使用

1.posix

2.sysv

3.windows

4.mmap

PostgreSQL 的共享缓冲区使用上述机制之一来缓存Page数据。

如何工作?

一个进程的数据需要与另一个进程共享时,第一个进程只需将数据写入共享内存段。创建了共享内存对象,有权访问该对象的进程就可以使用指针直接读取和写入该对象。

为何使用动态共享内存?

PostgreSQL 支持四种动态共享内存类型,我们只讨论Linux系统下的POSIX和MMAP。

创建和管理动态共享内存是操作系统的任务。一旦创建,动态共享内存段需要进行引用计数,以便在删除最后一个映射时,该段自动消失如果后端被不干净地终止,postmaster 需要在崩溃和重启过程中删除所有剩余的段,就像它需要重新初始化主共享内存段一样。如果所有进程都被不干净地终止,下一次 postmaster 启动需要清理任何仍然存在的共享内存段。

dynamic_shared_memory_type 参数设置实战

mmap设置

    dynamic_shared_memory_type = mmap       # the default is the first option
    # supported by the operating system:
    # posix
    # sysv
    # windows
    # mmap
    # (change requires restart)
    修改完后重启
    postgres@pg01-> pg_ctl restart
    postgres@pg01-> psql
    postgres=# show dynamic_shared_memory_type;
    dynamic_shared_memory_type
    ----------------------------
    mmap
    (1 row)

    重启实例之后 这是动态共享内存文件mmap.1178044756
    postgres@pg01-> cd pg_dynshmem
    postgres@pg01-> ll
    total 192K
    -rw------- 1 postgres postgres 122K Sep 16 23:10 mmap.1178044756
    postgres@pg01-> pwd
    /opt/pg_root/pg_dynshmem

    该文件在实例被重启后,会被重新创建。
    postgres@pg01-> pg_ctl restart
    waiting for server to shut down.... done
    server stopped
    waiting for server to start....2021-09-16 23:15:28.184 EDT [41367] LOG: starting PostgreSQL 12.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
    2021-09-16 23:15:28.184 EDT [41367] LOG: listening on IPv4 address "0.0.0.0", port 5432
    2021-09-16 23:15:28.186 EDT [41367] LOG: listening on Unix socket "./.s.PGSQL.5432"
    2021-09-16 23:15:28.406 EDT [41367] LOG: redirecting log output to logging collector process
    2021-09-16 23:15:28.406 EDT [41367] HINT: Future log output will appear in directory "pg_log".
    done
    server started
    postgres@pg01-> ll
    total 192K
    -rw------- 1 postgres postgres 122K Sep 16 23:15 mmap.945047994

    dynamic_shared_memory_type设置为POSIX时,动态共享内存控制文件存储在哪里?

      存储在 dev/shm下
      dynamic_shared_memory_type = posix # the default is the first option
      # supported by the operating system:
      # posix
      # sysv
      # windows
      # mmap
                                              # (change requires restart)
                                              
      postgres@pg01-> cd dev/shm
      postgres@pg01-> ll
      total 124K
      -rw------- 1 postgres postgres 122K Sep 16 23:23 PostgreSQL.2012049887
      postgres@pg01-> pwd
      /dev/shm                                  

      pgbench测试POSIX与MMAP性能

      POSIX

        postgres@pg01-> pgbench -i test
        dropping old tables...
        NOTICE: table "pgbench_accounts" does not exist, skipping
        NOTICE: table "pgbench_branches" does not exist, skipping
        NOTICE: table "pgbench_history" does not exist, skipping
        NOTICE: table "pgbench_tellers" does not exist, skipping
        creating tables...
        generating data...
        100000 of 100000 tuples (100%) done (elapsed 0.57 s, remaining 0.00 s)
        vacuuming...
        creating primary keys...
        done.

        postgres@pg01-> pgbench -c 10 -t 100 test
        starting vacuum...end.
        transaction type: <builtin: TPC-B (sort of)>
        scaling factor: 1
        query mode: simple
        number of clients: 10
        number of threads: 1
        number of transactions per client: 100
        number of transactions actually processed: 1000/1000
        latency average = 11.661 ms
        tps = 857.573774 (including connections establishing)
        tps = 865.997775 (excluding connections establishing)

        MMAP

          postgres@pg01-> pgbench -c 10 -t 100 test
          starting vacuum...end.
          transaction type: <builtin: TPC-B (sort of)>
          scaling factor: 1
          query mode: simple
          number of clients: 10
          number of threads: 1
          number of transactions per client: 100
          number of transactions actually processed: 1000/1000
          latency average = 11.683 ms
          tps = 855.930144 (including connections establishing)
          tps = 862.079833 (excluding connections establishing)

          总结

          由于手头没有合适的测试服务器,所以只用了一个虚拟机做了一个简单的测试。测试结果虽然近似,但是实际上posix要比mmap性能略好一些。


          文章转载自CP的PostgreSQL厨房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论