在部署了的GreenPlum集群中进行数据查询时,发现数据量一旦大了,查询一跑就中断,提示某个segment中断了连接。

ERROR 58M01 "Error on receive from seg0 slice1 192.168.110.84:6000 pid=xxx: server closed the connection unexpectedly"

This probably means the server terminated abnormally before or while processing the request

查看master的pg_log中的日志:

seg-1 could not connect to segment: initalization of segwork group failed (cdbgang.c:237)

经过简单的分析可以猜测是内存相关参数没有优化好,因为同样的SQL查询小一点时间间隔能很快出结果。那么就从两个方面着手:

1.服务器的内存不够,导致segment中断了交互。

2.数据库参数设置不合理,导致用不了那么多内存。

针对第一个问题:

1)首先排查虚拟机的内存,发现只有8G,感觉有点少,于是加到了32G,仍然出现之前的问题。

2)那么猜想是不是系统设置的限制了内存的使用?于是使用:

  prctl -n project.max-shm-memory -i project default

  prctl -n project.max-sem-ids -i project default

查看了相应的设置,都很大,不需要修改。因此可以排除是系统的瓶颈,接下来查看数据库的:

1)直接打开master节点的postgresql.conf文件查看配置,发现shared_buffers及所有的参数都是默认值,优化后。重启数据库仍然有上述问题。

2)查看max_statement_mem、statement_mem、gp_vmem_protect_limit三个参数,发现在master上没有设置,估计这里有问题。

3)使用gpconfig -s statement_mem报错,提示节点中断连接。感觉这个错误报的非常蛋疼,混淆了思路,以为数据节点有误。

4)确定gp_vmem_protect_limit参数,发现是8GB,完全够了。一度陷入停滞,经过查资料和对白配置文件,发现statement_mem参数在conf文件中没有,那么很可能就是默认值了,于是进了一步操作。

5)打开数据库,执行select * from gp_settings; 查看数据库的所有配置,发现statement_mem参数为默认的128MB,因此可以肯定问题了。

6)由于gpconfig查询参数失败,就没有尝试使用gpconfig来设置参数,采用手动修改每个节点的值。重启数据库后,成功解决问题。

后记,后来通过pgconfig -c statement_mem -v 2GB发现是可以设置参数的,就是-s来查询的时候报错。rlg,手动改了那么多文件完全可以很简单搞定的······

Greenplum参数配置优化:

查询参数

gpconfig --show max_connections

修改参数配置命令

gpconfig-c <parameter name> -v <parameter value>

比如:gpconfig-c log_statement -v DDL

删除配置
gpconfig -r <parameter name>

work_mem

work_mem(,global,物理内存的2%-4%),segment用作sort,hash操作的内存大小
当PostgreSQL对大表进行排序时,数据库会按照此参数指定大小进行分片排序,将中间结果存放在临时文件中,这些中间结果的临时文件最终会再次合并排序,所以增加此参数可以减少临时文件个数进而提升排序效率。当然如果设置过大,会导致swap的发生,所以设置此参数时仍需谨慎。

查看现有配置值
gpconfig -s work_mem Values on all segments are consistent
GUC : work_mem
Master value: 32MB
Segment value: 32MB 修改配置
gpconfig -c work_mem -v 128MB 另一种写法:SET work_mem TO '64MB' 配置成功返回:
gpadmin-[INFO]:-completed successfully with parameters

mainteance_work_mem(

global,CREATE INDEX, VACUUM等时用到,segment用于VACUUM,CREATE INDEX等操作的内存大小,缺省是16兆字节(16MB)。因为在一个数据库会话里, 任意时刻只有一个这样的操作可以执行,并且一个数据库安装通常不会有太多这样的工作并发执行, 把这个数值设置得比work_mem更大是安全的。 更大的设置可以改进清理和恢复数据库转储的速度。

查看现有配置值
gpconfig -s maintenance_work_mem
GUC : maintenance_work_mem
Master value: 64MB
Segment value: 64MB 修改配置
gpconfig -c maintenance_work_mem -v 256MB

max_statement_mem

设置每个查询最大使用的内存量,该参数是防止statement_mem参数设置的内存过大导致的内存溢出.

查看现有配置值
gpconfig -s max_statement_mem Values on all segments are consistent
GUC : max_statement_mem
Master value: 2000MB
Segment value: 2000MB 修改配置
gpconfig -c max_statement_mem -v 2000MB

statement_mem

设置每个查询在segment主机中可用的内存,该参数设置的值不能超过max_statement_mem设置的值,如果配置了资源队列,则不能超过资源队列设置的值。

查看现有配置值
gpconfig -s statement_mem
Values on all segments are consistent
GUC : statement_mem
Master value: 125MB
Segment value: 125MB 修改配置
gpconfig -c statement_mem -v 256MB

gp_vmem_protect_limit

控制了每个segment数据库为所有运行的查询分配的内存总量。如果查询需要的内存超过此值,则会失败。

查看现有配置值
gpconfig -s gp_vmem_protect_limit
Values on all segments are consistent
GUC : gp_vmem_protect_limit
Master value: 8192
Segment value: 8192

gp_workfile_limit_files_per_query

SQL查询分配的内存不足,Greenplum数据库会创建溢出文件(也叫工作文件)。在默认情况下,一个SQL查询最多可以创建 100000 个溢出文件,这足以满足大多数查询。 
该参数决定了一个查询最多可以创建多少个溢出文件。0 意味着没有限制。限制溢出文件数据可以防止失控查询破坏整个系统。

查看现有配置值
gpconfig -s gp_workfile_limit_files_per_query
Values on all segments are consistent
GUC : gp_workfile_limit_files_per_query
Master value: 100000
Segment value: 100000

gp_statement_mem

服务器配置参数 gp_statement_mem 控制段数据库上单个查询可以使用的内存总量。如果语句需要更多内存,则会溢出数据到磁盘。

effective_cache_size

(master节点,可以设为物理内存的85%)
这个参数告诉PostgreSQL的优化器有多少内存可以被用来缓存数据,以及帮助决定是否应该使用索引。这个数值越大,优化器使用索引的可能性也越大。因此这个数值应该设置成shared_buffers加上可用操作系统缓存两者的总量。通常这个数值会超过系统内存总量的50%以上。

查看现有配置值:
gpconfig -s effective_cache_size
Values on all segments are consistent
GUC : effective_cache_size
Master value: 512MB
Segment value: 512MB 修改配置
gpconfig -c effective_cache_size -v 40960MB

gp_resqueue_priority_cpucores_per_segment

master和每个segment的可以使用的cpu个数,每个segment的分配线程数;

查看现有配置值
gpconfig -s gp_resqueue_priority_cpucores_per_segment
Values on all segments are consistent
GUC : gp_resqueue_priority_cpucores_per_segment
Master value: 4
Segment value: 4 gpconfig -s checkpoint_segments 修改配置
gpconfig -c gp_resqueue_priority_cpucores_per_segment -v 8

max_connections

最大连接数,Segment建议设置成Master的5-10倍。
max_connections = 200 #(master、standby)
max_connections = 1200 #(segment)

查看现有配置值:
gpconfig -s max_connections GUC : max_connections
Master value: 250
Segment value: 750 修改配置
gpconfig -c max_connections -v 1200 -m 300

max_prepared_transactions

这个参数只有在启动数据库时,才能被设置。它决定能够同时处于prepared状态的事务的最大数目(参考PREPARE TRANSACTION命令)。如果它的值被设为0。则将数据库将关闭prepared事务的特性。它的值通常应该和max_connections的值一样大。每个事务消耗600字节(b)共享内存。

查看现有配置值:
gpconfig -s max_prepared_transactions
Values on all segments are consistent
GUC : max_prepared_transactions
Master value: 250
Segment value: 250
修改配置
gpconfig -c max_prepared_transactions -v 300

max_files_per_process

设置每个服务器进程允许同时打开的最大文件数目。缺省是1000。 如果内核强制一个合理的每进程限制,那么你不用操心这个设置。 但是在一些平台上(特别是大多数BSD系统), 内核允许独立进程打开比个系统真正可以支持的数目大得多得文件数。 如果你发现有"Too many open files"这样的失败现像,那么就尝试缩小这个设置。 这个值只能在服务器启动的时候设置。

查看现有配置值:
gpconfig -s max_files_per_process
Values on all segments are consistent
GUC : max_files_per_process
Master value: 1000
Segment value: 1000
修改配置
gpconfig -c max_files_per_process -v 1000

shared_buffers

只能配置segment节点,用作磁盘读写的内存缓冲区,开始可以设置一个较小的值,比如总内存的15%,然后逐渐增加,过程中监控性能提升和swap的情况。

gpconfig -s shared_buffers
Values on all segments are consistent
GUC : shared_buffers
Master value: 64MB
Segment value: 125MB 修改配置
gpconfig -c shared_buffers -v 1024MB gpconfig -r shared_buffers -v 1024MB

temp_buffers: 即临时缓冲区,拥有数据库访问临时数据,GP中默认值为1M,在访问比较到大的临时表时,对性能提升有很大帮助。

查看现有配置值:
gpconfig -s temp_buffers
Values on all segments are consistent
GUC : temp_buffers
Master value: 1024
Segment value: 1024 修改配置
gpconfig -c temp_buffers -v 4096

gp_fts_probe_threadcount:

设置ftsprobe线程数,此参数建议大于等于每台服务器segments的数目。

查看现有配置值:
gpconfig -s gp_fts_probe_threadcount
Values on all segments are consistent
GUC : gp_fts_probe_threadcount
Master value: 16
Segment value: 16

重启数据库,使参数生效

gpstop -u 重新加载配置文件 postgresql.conf 和 pg_hba.conf

记一次GreenPlum性能调优的更多相关文章

  1. [MYSQL] 记一次MySQL性能调优

    最近在做数据迁移工作,已有一堆数据文件,要把这些数据文件写到MySQL 数据库里面去. MySQL数据库上架了一层服务接口,可以直接调用.博主写了一个迁移程序,放在服务器A上. *********** ...

  2. 记一次idea性能调优

    因自研的自动化测试工具包含压测功能,在自己本地代码开发完毕后进行测试,对目标接口进行1000次访问,发现idea在执行结束后变的异常卡顿,怀疑是idea工具或者程序代码存在问题,遂进行排查. ---- ...

  3. 记一次Web服务的性能调优

    前言 一个项目在经历开发.测试.上线后,当时的用户规模还比较小,所以刚刚上线的项目一般会表现稳定.但是随着时间的推移,用户数量的增加,qps的增加等因素会造成项目慢慢表现出网页半天无响应的状况.在之前 ...

  4. 记一次sql server 性能调优,查询从20秒至2秒

    一.需求 需求很简单,就是需要查询一个报表,只有1个表,数据量大约60万左右,但是中间有些逻辑. 先说明一下服务器配置情况:1核CPU.2GB内存.机械硬盘.Sqlserver 2008 R2.Win ...

  5. JVM性能调优2:JVM性能调优参数整理

    序号 参数名 说明 JDK 默认值 使用过 1 JVM执行模式 2 -client-server 设置该JVM运行与Client 或者Server Hotspot模式,这两种模式从本质上来说是在JVM ...

  6. Informatica_(6)性能调优

    六.实战汇总31.powercenter 字符集 了解源或者目标数据库的字符集,并在Powercenter服务器上设置相关的环境变量或者完成相关的设置,不同的数据库有不同的设置方法: 多数字符集的问题 ...

  7. 如何合理的规划一次jvm性能调优

    https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...

  8. MySQL性能调优与架构设计——第 15 章 可扩展性设计之Cache与Search的利用

    第 15 章 可扩展性设计之Cache与Search的利用 前言: 前面章节部分所分析的可扩展架构方案,基本上都是围绕在数据库自身来进行的,这样是否会使我们在寻求扩展性之路的思维受到“禁锢”,无法更为 ...

  9. MySQL性能调优与架构设计——第12章 可扩展设计的基本原则

    第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...

随机推荐

  1. [Linux 002]——Linux的常用命令

    经过前面的学习,大概了解了计算机组成原理和操作系统的一些知识.尽管这些知识都是琐碎的,拼凑的,在以后的工作和学习中仍需进行深入的了解.但是这些预备知识对于准备跨入 Linux 大门的童鞋来说,应该是足 ...

  2. 20145327高晨 实验一 "Java开发环境的熟悉"

    实验一 Java开发环境的熟悉(Linux + Eclipse) (Windows + IDEA) 实验内容:实现Fibonacci数列功能,并进行测试. 实验步骤: Fibonacci数列(斐波拉契 ...

  3. 20145331《Java程序设计》课程总结

    20145331<Java程序设计>课程总结 每周读书笔记链接汇总 •20145331<Java程序设计>第一周学习总结 •20145331<Java程序设计>第二 ...

  4. MongoDB-与Python交互

    与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo import ...

  5. vSphere SDK for Java 示例

    示例代码: package com.vmware.event.connect; import java.net.MalformedURLException; import java.net.URL; ...

  6. this 的理解

    function foo(num){ console.log("foo:",+num); this.count++}foo.count =0for (var i=0; i<1 ...

  7. GCC嵌入式汇编(内嵌汇编)入门

    GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...

  8. Redis之Redis

    Redis 环境安装 安装 如果已经安装了老版本3.0.6 1. 卸载软件 sudo apt-get remove redis-server 2. 清除配置 sudo apt-get remove - ...

  9. codeforce diversity

    2017-08-25 14:59:34 writer:pprp 题意如下:给你一个串字符,再给你一个数字,表示在字符串中的各不相同的字符个数, 问你最少需要改变几个字符达到要求,不能达到要求就输出im ...

  10. input输入框延时发送请求问题

    同样是面试遇到的问题,input输入框,怎么减少发送请求次数. 键盘抬起触发事件,首先清除定时器,再开启定时器.只要小于1s的连续输入,都会先把上一次定时器清除.停顿一秒后,开始执行请求事件(此处为c ...