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

华为GaussDB A 数据库内存优化

墨天轮 2019-10-12
2798

数据库内存优化

操作场景

由于数据库的复杂查询语句性能非常依赖数据库系统内存的配置参数,因此在集群安装完成后,需通过GUC参数配置,设定系统的内存参数,提高集群数据库的总体性能。

说明:

本章节所涉及的各参数的计算公式仅为参考,建议在华为工程师指导下进行计算。通用场景下,建议直接参见示例进行优化配置。

背景信息

影响数据库内存的参数主要包括:max_process_memory、shared_buffers、cstore_buffers、work_mem和maintenance_work_mem。

  • 逻辑内存管理参数为max_process_memory,主要功能是控制单个CN/DN上可用内存的最大峰值,该参数的数值设置公式参考max_process_memory。

    执行作业最终可用的内存为:

    max_proces_memory – shared memory ( 包括shared_buffers ) – cstore_buffers

    所以影响执行作业可用内存参数的主要两个参数为shared_buffers及cstore_buffers。

    对于HDFS表,两个数值均需要设置较小(1GB)。

  • work_mem是用来设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。
  • 参数work_mem依据查询特点和并发来确定,一旦work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。
    • 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work_mem=50%内存/10。
    • 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work_mem=50%内存/5。
    • 对于并发场景,建议work_mem=串行下的work_mem/物理并发数。
  • maintenance_work_mem用来设置维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。

max_process_memory

参数说明:设置一个数据库节点可用的最大物理内存。

该参数属于POSTMASTER类型参数。

取值范围:整型,2*1024*1024~INT_MAX/2,单位为KB。

默认值:12GB

设置建议:

DN上该数值需要根据系统物理内存及单节点部署主DN个数决定的。计算公式如下:(物理内存大小 – vm.min_free_kbytes)* 0.7 / (1+主DN个数)。该参数目的是尽可能保证系统的可靠性,不会因数据库内存膨胀导致节点OOM。这个公式中提到vm.min_free_kbytes,其含义是预留操作系统内存供内核使用,通常用作操作系统内核中通信收发内存分配,至少为5%内存。即,max_process_memory=物理内存*0.665/(1+主DN个数)。

CN上该数值内存可设置与DN数值一样。

RAM:集群规划时分配给集群的最大使用内存,实际为服务器的物理内存。

shared_buffers

参数说明:设置LibrA使用的共享内存大小。增加此参数的值会使LibrA比系统默认设置需要更多的System V共享内存。

该参数属于POSTMASTER类型参数。

取值范围:整型,128KB~操作系统支持的最大值,单位为KB。

改变BLCKSZ的值会改变最小值。

默认值:512MB,如果操作系统支持的共享内存小于32MB,则在初始化数据存储区时会自动调整为操作系统支持的最大值。

设置建议:

由于LibrA大部分查询下推,建议DN中此参数设置比CN大。

建议设置shared_buffers值为内存的40%以内。行存列存分开对待。行存设大,列存设小。列存:(单服务器内存/单服务器DN个数)*0.4*0.25。

如果设置较大的shared_buffers需要同时增加checkpoint_segments的值,因为写入大量新增、修改数据需要消耗更多的时间周期。

cstore_buffers

参数说明:设置列存和HDFS所使用的共享缓冲区的大小。

该参数属于POSTMASTER类型参数。

取值范围:整型,16MB~操作系统支持的最大值,单位为MB。

默认值:32MB

设置建议

列存表使用cstore_buffers设置的共享缓冲区,几乎不用shared_buffers。因此在列存表为主的场景中,应减少shared_buffers,增加cstore_buffers。

work_mem

参数说明:设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。

对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work_mem的好几倍。

该参数属于USERSET类型参数。

取值范围:整型,单位为KB。

默认值:64MB

设置建议:

依据查询特点和并发来确定,一旦work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。

建议设置为:work_mem = 0.5 * max_process_memory / 业务平均并发数 / 查询平均物化算子数

业务平均并发数:业务平均并发查询的数量和max_active_statements参数中的较小值。当业务并发数超过max_active_statements时,实际在数据库中执行的并发数会被限制为max_active_statements。

查询平均物化算子数:对于业务中的典型查询,利用“explain + 查询”来查看实际的执行计划,统计执行计划中物化算子的数量。物化算子包括:Material、Vector Material、Sort、Vector Sort、HashAgg、Vector HashAgg、Hash、Vector Hash、Vector HashJoin、Vector HashSetOp 。

maintenance_work_mem

参数说明:设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。

该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。

取值范围:整型,单位为KB。

默认值:128MB

设置建议:

  • 建议设置此参数的值大于work_mem,可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。
  • 当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。
  • 如果进行大数据量的cluster等,可以在session中调大该值。

操作步骤

  • 以root用户使用PuTTY登录任意CN所在节点,执行以下命令切换到omm用户并启动环境变量。

    su - omm

    source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

  • 执行以下命令分别设置CN的max_process_memory和work_mem的取值。

    说明:

    关于更多GUC参数设置,请参见gs_guc。

    gs_guc set -N all -I all -Z coordinator -c "max_process_memory=最大可用内存大小"

    gs_guc set -N all -I all -Z coordinator -c "work_mem=排序内存大小"

  • 执行以下命令分别设置DN的max_process_memory、shared_buffers、cstore_buffers、work_mem和maintenance_work_mem的取值。

    gs_guc set -N all -I all -Z datanode -c "max_process_memory=最大可用内存大小"

    gs_guc set -N all -I all -Z datanode -c "shared_buffers=共享内存大小"

    gs_guc set -N all -I all -Z datanode -c "cstore_buffers=共享缓存区大小"

    gs_guc set -N all -I all -Z datanode -c "work_mem=排序内存大小"

    gs_guc set -N all -I all -Z datanode -c "maintenance_work_mem=维护内存大小"

  • 执行以下命令重启数据库,重启后配置生效。

    gs_om -t stop && gs_om -t start

示例

在常见场景中,以节点物理内存256GB和512GB为例,建议各参数按表1进行配置。

表1 调优取值示例

集群规模

参数

行存取值

列存取值

以节点物理内存256GB,单节点4个DN为例

max_process_memory(CN和DN都要设置)

32GB

32GB

shared_buffers

8GB

512MB

cstore_buffers

512MB

8GB

work_mem(CN和DN都要设置)

256MB

256MB

maintenance_work_mem

256MB

256MB

以节点物理内存512GB,单节点4个DN为例

max_process_memory(CN和DN都要设置)

64GB

64GB

shared_buffers

16GB

1GB

cstore_buffers

1GB

16GB

work_mem(CN和DN都要设置)

512MB

512MB

maintenance_work_mem

512MB

512MB

#节点物理内存256GB,单节点4个DN,行存 gs_guc set -N all -I all -Z coordinator -c "max_process_memory=32GB" gs_guc set -N all -I all -Z coordinator -c "work_mem=256MB" gs_guc set -N all -I all -Z datanode -c "max_process_memory=32GB" gs_guc set -N all -I all -Z datanode -c "shared_buffers=8GB" gs_guc set -N all -I all -Z datanode -c "cstore_buffers=512MB" gs_guc set -N all -I all -Z datanode -c "work_mem=256MB" gs_guc set -N all -I all -Z datanode -c "maintenance_work_mem=256MB" gs_om -t stop && gs_om -t start #节点物理内存512GB,单节点4个DN,行存 gs_guc set -N all -I all -Z coordinator -c "max_process_memory=64GB" gs_guc set -N all -I all -Z coordinator -c "work_mem=512MB" gs_guc set -N all -I all -Z datanode -c "max_process_memory=64GB" gs_guc set -N all -I all -Z datanode -c "shared_buffers=16GB" gs_guc set -N all -I all -Z datanode -c "cstore_buffers=1GB" gs_guc set -N all -I all -Z datanode -c "work_mem=512MB" gs_guc set -N all -I all -Z datanode -c "maintenance_work_mem=512MB" gs_om -t stop && gs_om -t start

查看更多:华为GaussDB 200 初始配置
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论