数据库性能分析和优化是一个难题,笔者所在的Greenplum研发部门近期正好在解决一个实际用户的全局性能问题,本文记录了分析过程和解决思路。本案例是第一次对实际客户的生产库以GPCC历史数据为核心剖析性能问题,所以有必定的开创性和借鉴意义,故撰文供研发同事、现场工程师、支持工程师参考,同时也适合具有必定GP基础并但愿提升的读者阅读。同时为了保护客户的商业秘密,本文不透露任何关于该商业用户的名称、行业等信息,并对数据中的缩写、表名等敏感信息都进行了脱敏处理。数据库
客户在2019-09-22执行了从 GP4.3 到 GP5.20 的升级,随后在10月中旬提出升级后总体性能降低的问题 “overall performance degrade after upgrade” 。现场工程师提出了包括ANALYZE、VACUUM等合理建议,同时售后支持和研发着手分析性能问题。网络
该客户升级先后都使用了GPCC,GP4.3使用了GPPerfmon+GPCC3的组合,GP5.20使用的是GPCC4.8 (截止发稿时4.9版本已经发布,请使用最新版本),并正确开启了历史数据收集(参见博文如何开启)。在支持人员的协助下,咱们得以得到升级先后的相关历史数据。性能
GPCC的历史数据主要包括系统性能信息和查询历史,后文会结合分析过程详细展开。优化
该部分历史数据很是庞大,仅9月22日升级后到十月中旬几周内,GPCC 4.8就记录了1.5亿次查询。面对overall performance这一模糊的课题,咱们要想真正帮到客户,就须要让这些数听说话。网站
第一部分,了解GPDB集群的总体性能特征spa
先介绍GPCC的系统性能历史表3d
这个表的定义从GPPerfmon到GPCC4.8变化不大,在GPPerfmon时表明名为public.system_history,GPCC4之后为gpmetrics.gpcc_system_history。code
GPCC运做时会每分钟四次(分别在00秒、15秒、30秒、45秒)对GPDB集群的每一个主机(包括Master、Segment和Standby Master)采样上面所列信息,做用是掌握用户数据库的总体负载情况,能够帮助咱们回答诸如如下几个问题:orm
咱们使用下面查询来分析一周内的系统资源变化状况blog
SELECT ctime::date || '_' || CASE WHEN extract(hour from ctime) < 10 THEN '0' ELSE '' END || extract(hour from ctime) AS date_hour , avg(cpu_sys) AS cpu_sys , avg(cpu_user) AS cpu_user , avg(cpu_sys+cpu_user) AS cpu , avg(mem_total) AS mem_total , avg(mem_used) AS mem_used , avg(mem_actual_used) AS mem_actual , avg(load0) AS load0 , avg(load1) AS load1 , avg(load2) AS load2 , avg(disk_rb_rate) / 1024 / 1024 AS disk_R_MBs , avg(disk_wb_rate) / 1024 / 1024 AS disk_W_MBs , avg(net_rb_rate) / 1024 / 1024 AS net_I_MBs , avg(net_wb_rate) / 1024 / 1024 AS net_O_MBs FROM gpmetrics.gpcc_system_history WHERE hostname LIKE 'sdw%' AND ctime >= '2019-10-09 00:00:00' AND ctime < '2019-10-16 00:00:00' GROUP BY 1 ORDER BY 1 ;
取得的结果咱们能够导入到 Excel、Grafana、Tableu 等办公软件进行图形化的对比。下图是对客户升级先后各取一周时间的样本,重叠到一块儿观察变化趋势。
初步诊断用户升级GP5以后磁盘IO/网络IO增长的确存在潜在的性能问题,咱们列举出如下一些可能性。
针对这些怀疑,咱们须要进一步查证用户的查询负载。
(未完待续)
得到更多关于Greenpum的技术干货,请访问Greenplum中文社区网站。