《Greenplum5.0 最佳实践》 系统参数 (二)

《Greenplum 数据库最佳实践 》 系统参数配置

系统配置

本章主要描述在Greenplum部署之前,系统参数的配置

文件系统 (File System)

推荐使用XFS作为Greenplum默认文件系统, 目前redhat,Centos 7.0 都开始使用XFS作为默认文件系统
如果系统不支持 需要使用下面的挂载命令
rw,noatime,nobarrier,nodev,inode64,allocsize=16m
XFS相比较ext4具有如下优点:
1. XFS的扩展性明显优于ext4,ext4的单个文件目录超过200W个性能下降明显
2. ext4作为传统文件系统确实非常稳定,但是随着存储需求的越来越大,ext4渐渐不在适应
3. 由于历史磁盘原因,ext4的inode个数限制(32位),最多只能支持40多亿个文件,单个文件最大支持到16T
4. XFS使用的是64位管理空间,文件系统规模可以达到EB级别,XFS是基于B+Tree管理元数据

端口配置 (Port Configuration)

设置端口ip_local_port_range 它不应该和Greenplum 数据库的端口范围冲突 例如

net.ipv4.ip_local_port_range = 3000 65535
PORT_BASE = 2000
MIRROR_PORT_BASE = 2100
REPLICATION_PORT_BASE = 2200
MIRROR_REPLICATION_PORT_BASE = 2300

I/O 配置

包含数据目录的设备的预读大小应设为 16384

# /sbin/blockdev --getra /dev/sdb
8192
如果显示的是8192需要使用如下命令设置
# /sbin/blockdev --setra 16384 /dev/sdb
#/sbin/blockdev --getra /dev/sdb
16384
包含数据目录的设备的I/O调度算法设置为deadline
# cat /sys/block/sdb/queue/scheduler
noop anticipatory [deadline] cfq

通过/etc/security/limits.conf 增大操作系统文件数和进程数

* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072

启动core dump 文件转储 [ 参考注1],并保存到已知位置,确保limits.conf中允许core转储文件

kernel.core_pattern = /var/core/core.%h.%t
# grep core /etc/security/limits.conf
* soft core unlimited
如果显示的是 # soft core 0 , 需要修改为 soft core unlimited
Core Dump (核转储文件)路径的设置
#vi /etc/sysctl.conf
kernel.core_pattern = /var/core/core.%h.%t
这里面的%h (表示主机名), %t (表示 触发 Core Dump 的时间(单位为秒,从 1970-01-01 00:00:00 开始计算))

操作系统内存配置

Linux sysctl 的 vm.overcommit_memory 和 vm.overcommit_ratio 变量会影响操作系统对内存分配的管理 这些变量设置如下:

vm.overcommit_memory 决定系统分配多少内存给全部的进程,通常我们设置该值为2, 这是一个非常安全的设置对于数据库
vm.overcommit_ratio 是当前的内存被全部进程所使用的,对于Red hat Enterprise linux默认值是50

共享内存配置

共享内存主要用于postgres实例间通信,建议使用sysctl配置如下内存共享参数,不建议修改:

kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000

验证操作系统

使用gpcheck 验证操作系统配置 参考《Greenplum数据库工具指南》

设置节点上段数据库的个数

确定每个节点上段数据库的个数对整体性能的影响巨大,一个节点上这些段数据库之间共享主机的CPU核、内存、网卡等,且和主机上的所有进程共享这些资源
段数据库的个数需要参考如下的主机信息:

  • 主机的CPU核数
  • 主机所含有的物理内存的数量
  • 网卡个数和速度
  • 主机所挂载的存储大小
  • 主节点和镜像节点的数量
  • ETL进程是否运行在主机上
  • 非Greenplum进程运行在主机上

段数据库的配置

服务器配置参数 gp_vmem_protect_limit 控制了每个段数据库为所有运行的查询分配的内存总量,如果查询所需要的内存超过此值,则会失败,使用下面公式确定合适的值.

  1. 计算 gp_vmem ,主机有多少内存可供Greenplum Database使用,使用如下公式:
    gp_vmem = ((SWAP+RAM) - (7.5GB + 0,05*RAM)) / 1.7
    SWAP 是主机的交换空间 单位GB
    RAM 是主机所安装的内存 单位GB
  2. 计算 max_acting_primary_segments
    当段数据库故障或者主机故障使得镜像段(mirror segments)被激活时,该值用来表示在一个主机上可以运行的最大主段数量
    配有四个主机块的镜像,每个主机上有8个主段。例如:一个单一的段数据库失效将会激活2或者3个镜像数据节点在每个剩余主机上的失败的 hosts's 块上
    max_acting_primart_segments = 8 + 3 = 11 (8个主段 + 3个被激活的镜像节点)
  3. 计算 gp_vmem_protect_limit , 使用Greenplum 数据库可用的内存数GB 除以 所含有的段数据的数量(主段的数量)
    gp_vmem_protected_limit = gp_vmem / max_acting_primary_segments
    注: 这里的单位使用的MB,所以 需要对计算结果进行单位转换

    对于生成大量工作文件(workfiles)的情况,需要调整gp_vmem已完成计算
    gp_vmem=((SWAP+RAM) - (7.5GB + 0.05RAM-(300KBtotal_#_workfiles))) / 1.7
    关于Greenplum中监控和管理workfile 的使用情况,需要参考 《Greenplum Database Administrator Guide》

    计算 vm.overcommit_ratio
    vm.overcommit_ratio = (RAM-0.026*gp_vmem) / RAM

    例如:
    8GB 交换空间 SWAP
    128GB 内存 RAM
    vm.overcommit_ratio = 50 === 0.5
    8个段数据库
    (8 + (1280.5) )0.9/8 = 8GB
    则设置 gp_vmem_protect_limit = 8GB, 需要转换为 8192MB

SQL 语句内存配置

服务器配置参数 gp_statement_mem 控制段数据库上单个查询可以使用的内存总量,如果语句需要更多的内存,则会溢出数据到磁盘,用下面公式确定合适的值
(gp_vmem_protected_limit *0.9)/max_expected_concurrent_queries

例如,如果并发度为40, gp_vmeme_protected_limit 为8GB,则gp_statement_mem
(8192MB*0.9)/40 = 184MB
每一个查询只能分配184MB的内存,查询的内存资源超过该值时,会溢出到磁盘文件中。

若想安全的增大 gp_statement_mem ,要么增大gp_vmem_protect_limit,要么降低并发。增加gp_vmem_protect_limit,必须增大物理内存和交换空间,或者减少主机上运行的段数据的数量

注意:集群中加入更多的段数据库实例并不能解决内存溢出(out-of-memory errors)的问题,除非向集群中添加更多的新主机,将每个主机上运行的段数据库数量降低下来(即将段数据库分配到新的主机上)
当没有足够的内存用来存放mapper的输出,80%的Buffer被占用时,系统就会创建溢出文件(workfile)

溢出文件参数配置

在Greenplum数据库集群中,溢出文件 (spill files)也别称为 工作文件(workfiles),它是指当查询分配的内存不足以应对查询运行所需的内存资源时,(内存分配不足)。默认情况下,单一的查询不能创建多余100000个溢出文件,这对于大多数查询任务来说,这个溢出文件的数量足够用了。

我们可以通过设置 gp_workfile_limit_files_per_query 这个参数来修改最大数量的溢出文件, 这个值可以从0设置到无穷大。限制溢出文件的数量可以保证在查询运行中,防止系统的崩溃。
当内存不足以分配给一个查询或者数据倾斜引起一个查询任务产生很多溢出文件。如果查询任务产生的溢出文件数量超过阈值时,Greenplum会抛出异常
ERROR: number of workfiles per query limit exceeded

当我们准备调整溢出文件参数 gp_workfile_limit_files_per_query 限制时,可以先考虑修改我们的查询语句以达到减少溢出文件的数量(减小中间结果集的大小,避免中间计算引起计算倾斜问题),改变分布键(分布键引起数据分布不均匀,造成计算倾斜),调整内存参数

gp_toolkit

gp_toolkit 模式包含视图,允许我们查看当前的查询所使用的溢出文件的数量。这个参数可以用来排除故障和调优查询, 注意如下视图

gp_workfile_usage_per_query 视图
使用一行存储,当前时间段中,一个段数据库的一个操作的workfile所占用的磁盘空间

gp_workfile_usage_per_query 视图
使用一行记录,当前时间段中,有个段数据库的一个查询的workfile所占的磁盘空间大小

gp_workfile_usage_per_segment 视图
每一个段一行记录。
每一行记录都显示当前的workfile所使用的磁盘空间的总量

上述视图查看的语句为

SELECT FROM gp_toolkit.gp_workfile_usage_

查看 《Greenplum Database Reference Guide》 去看每一个视图的字段信息

参数 gp_workfile_compress_algorithm 参数是用来控制溢出文件的。它可以被设置为 none(默认)或者 zlib。设置为zlib,可以提升溢出文件的性能。

参考网址:
https://gpdb.docs.pivotal.io/500/best_practices/sysconfig.html

注:
1. Linux 中生成Core Dump 文件方法。
1.1. 什么是 Core Dump
Core Dump 又叫核心转储。在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dump.
1.2. Core Dump 的作用
在开发过程中,难免会遇到程序运行过程中异常退出的情况,这时候想要定位到问题出在哪里,仅仅依靠程序自身的打印信息(日志记录)往往不够,这个时候就需要Core Dump 文件来帮忙了。
一个完整的Core Dump 文件实际上相当于恢复了异常现场,利用 Core Dump 文件,可以查看程序异常时的所有信息,变量值,站信息,内存数据,程序宜昌市的运行位置(甚至是diamante行号)等等,定位所需要的一切信息都可以从Core Dump文件获取,能够非常有效的提高定位效率。
http://blog.chinaunix.net/uid-20554957-id-4233534.html

时间: 2024-10-26 13:06:47

《Greenplum5.0 最佳实践》 系统参数 (二)的相关文章

《Greenplum5.0 最佳实践》 模式设计 (三)

模式设计 最佳实践 Greenplum 是基于大规模并行处理(MPP)和shared-nothing架构的分析型数据库.其不同于高度规范化的事务型SMP数据库. 使用非规范化数据库模式,例如具有大事实表和小维度的星型或者雪花模式,处理MPP分析型任务时,Greenplum数据库表现优异. 数据类型 (Data Types) 使用类型一致 在做关联操作的两个表,其两个关联字段的数据类型尽量保持一致.如果数据类型不一致,Greenplum 数据库必然后动态的转化一个字段的数据类型,这样就可以实现不同

《Greenplum5.0 最佳实践》 迁移数据使用Gptransfer

使用 Gptransfer 命令迁移一个 Greenplum 数据库集群中的数据到另一台集群(metradata, data) gptransfer 可以迁移数据库中的全部数据或者部分选择的表到另外一台 Greenplum 中. 源数据库和目的数据库可以在同一个集群中,也可以在不同的集群中. gptransfer 所有的段数据库是并行的移动数据的,使用 gpfdist 可以获得更高的数据移动效率. gptransfer 处理这数据的启动和执行. 参与的集群必须存在.同时确保集群间的访问时可以用过

《Greenplum5.0 最佳实践》 系统监控与维护 (五)

常规的系统维护是为了我们的Greenplum数据库具有更高的稳定性和更优化的性能体现 使用 ANALYZE 更新系统的统计信息 数据库的数据膨胀管理 (需要仔细点延伸下去) 监控Greenplum的日志文件 Monitoring (监控) Greenplum 数据库系统提供了非常使用的监控工具.gp_toolkit 模式包含多种视图,可以通过SQL命令去查询Greenplum数据库系统的 system catalogs , log files 和 对当前操作环境下系统的状态信息. 对于更多的 g

《Greenplum5.0 最佳实践》数据导入 (六)

Loading Data INSERT 命令 使用 INSERT 命令将数据加载到表中.一行数据会根据分布键,从主节点分配到 segment 上.这是一种非常慢的方法,并不适合加载大量数据. COPY 命令 Postgresql 数据库提供的 COPY 命令实质就是将 外部文件拷贝到数据库表中, 该命令一次可以插入多行数据, 效率明显高于 INSERT 命令.但是这并不是一位置数据不需要从master 节点开始执行数据导入,依旧需要master 节点完成数据分布的计算.使用数据拷贝命令,并不意味

《Greenplum5.0 最佳实践》 高可用性<1>

高可用性 Greenplum 数据库集群支持高可用,容错性数据服务.为了保证所需要的服务级别,每个组件都必须有一个备用的服务器,避免发生故障没有有效的准备. 磁盘存储 Greenplum 数据库是 "Shared-nothing" MPP 架构,主节点和段节点都有其各自专有的内存和磁盘存储空间,每一个主接节点或者段实例都有其自己独立的数据文件.为了更高的可靠性和性能表象. Pivotal 建议使用8到24个硬盘的RAID存储解决方案.使用RAID5(或6)时,大量磁盘可提高吞吐性能,因

《Greenplum5.0 最佳实践 》SQL 转换

改变 SQL 查询 Greenplum 数据库是基于代价的查询优化,查询优化器会选择代价最小的作为执行计划.像其他的 RDBMS 优化器一样, Greenplum的查询优化器也会考虑如下因素,例如做连接操作涉及的记录数量,索引是否可用,访问数据的字段基数.查询优化器还要考虑数据的具体位置,尽可能的在当前段内执行更多的操作,然后在进行段之间的通信操作,因为在实际生产中,频繁的段间数据交换会产生集群的网络瓶颈.那么会降低集群的性能. 当查询执行要比我们想象的要慢时,我们需要去检查查询计划,这也就意味

《Greenplum5.0 最佳实践》 内存与资源队列 (四)

避免内存错误和GPDB资源问题 内存管理对GPDB集群具有重要的性能影响.大多数环境推荐使用默认设置.不要去改变默认设置,除非你真的理解了自己系统的需求. 解决内存溢出错误 内存不足错误绘制出遇到内存不足错误的GPDB的段数据库,节点,进程信息 例如: Out of memeory ( seg27 host. example.com pid = 47093 ) VM Protecte failed to allocate 4096 bytes , 0MB available 通常情况下GPDB内

《Greenplum5.0 最佳实践》 访问HDFS存储 (七)

访问Hadoop集群中数据用到的工具有 外部表 external tables 和 gphdfs 协议, Greenplum 可以从 HDFS 上读取文件也可以向 HDFS 写文件.为了达到更快的性能,所有的段数据库是并行地读取 HDFS 中的数据. 当Hadoop集群采用的是 Kerbes 实现集群中各个节点的认证的,以确保集群数据不被恶意攻击.那么 Greenplum 必须使用的用户为 gpadmin, 该用户拥有对外部表的读写权限在HDFS中,需要通过 Kerbes 的授权.为了实现对 g

Dockerfile最佳实践(二)

本文讲的是Dockerfile最佳实践(二),[编者的话]本文是 Docker 入门教程第三章-DockerFile 进阶篇的第二部分.作者主要介绍了 Docker 的变化.常用指令以及基础镜像的最佳用法. 自从我上一篇 Dockerfile 最佳实践后,Docker 发生了很大变化.上一篇会继续留着,这篇文章将介绍 Docker 有什么变化以及你现在应当做些什么. 1.不要开机初始化 容器模型是进程而不是机器.如果你认为你需要开机初始化,那么你就错了. 2.可信任构建 即使你不喜欢这个题目但它