获取GP集群耗时Rank

最后都变了- 提交于 2020-10-02 00:39:54

目录

 

一、需求背景

二、需求设计与关键表介绍

2.1 system_*介绍

 2.2 queries_*介绍

三、实践

3.1 自动化排程


一、需求背景

监控GP集群每个资源管理队列的耗时情况,来观察业务上的改变对数据库影响几何?

二、需求设计与关键表介绍

GreenPlum 中有一个gpperfmon数据库,该数据库中记录了GP运行时的状态,并提供履历查询。在分析GP效能时比较好用。官方也提供了GPCC web监控页面,但总不能满足你的需求。对其系统表熟悉之后,变可以自己来做自己想要的监控。

需要注意的是GP6安装不需要单独安装gppermon数据库。但gpperfmon库仍然是存在的。在表设计上也有了很大的优化,较GP4变化很大,毕竟GPCC 现在是商业组件。

2.1 system_*介绍

system_ *表存储系统使用率指标。 有三个系统表,它们都具有相同的列:

  • •system_now是一个外部表,其数据文件存储在$ MASTER_DATA_DIRECTORY / gpperfmon /data中。 在数据收集之间的时间段内,当前系统使用率数据存储在system_now中从Command Center代理中自动提交到system_history表。
  • •system_tail是一个外部表,其数据文件存储在$ MASTER_DATA_DIRECTORY /gpperfmon /data中。 这是已从中清除的系统利用率数据的过渡表。system_now,但尚未提交给system_history。 它通常只包含一些分钟的数据量。
  • •system_history是存储历史系统利用率指标的常规表。 它是预先分区的,分成每月的分区。 分区会根据需要以两个月为增量自动添加。

Column

type

Description

ctime

timestamp

 

创建此行的时间

hostname

 

varchar(64)

 

与这些系统指标关联的段或主主机名。

 

mem_total

bigint

该主机的总系统内存(以字节为单位)。

mem_used

bigint

该主机使用的系统内存(以字节为单位)。

mem_actual_used

bigint

该主机已使用的实际内存(以字节为单位)(不包括为memory和cache保留的内存).

mem_actual_free

bigint

 

该主机的可用实际内存(以字节为单位)(不包括为memory和cache保留的内存)

swap_total

 

bigint

该主机的总交换空间(以字节为单位)。

swap_used

 

bigint

此主机的可用实际内存(以字节为单位)(不包括为memory和cache保留的内存)

swap_page_in

bigint

 

交换页面的数量。

swap_page_out

bigint

换出页数

cpu_user

float

 

Greenplum系统用户的CPU使用率。

cpu_sys

float

该主机的CPU使用率。

cpu_idle

float

 

指标收集时空闲的CPU容量。

load0

float

前一分钟的CPU平均负载。

load1

float

前五分钟的CPU平均负载

load2

float

前十五分钟的CPU平均负载

quantum

int

此度量标准的度量标准收集之间的间隔

disk_ro_rate

bigint

每秒磁盘读取操作。

disk_wo_rate

bigint

每秒磁盘写操作。

disk_rb_rate

bigint

 

磁盘写入操作的每秒字节数。

net_rp_rate

bigint

系统网络上每秒的数据包,用于读取操作。

net_wp_rate

bigint

系统网络上每秒用于写操作的数据包。

net_rb_rate

bigint

系统网络上每秒的字节数,用于读取操作。

net_wb_rate

bigint

系统网络上每秒用于写入操作的字节数。

 2.2 queries_*介绍

tmid,ssid和ccnt列是唯一标识特定查询的组合键。这些列可用于与iterators_ *表联接。

有三个查询表,所有查询表都具有相同的列:

  • query_now是一个外部表,其数据文件存储在$ MASTER_DATA_DIRECTORY /中。当前查询状态存储在querys_now中
  • 从命令中心代理收集并自动提交到querys_history表。
  • query_tail是一个外部表,其数据文件存储在$ MASTER_DATA_DIRECTORY /中这是已从中清除查询状态数据的过渡表。
  • query_history是存储历史查询状态数据的常规表。它是预先分区的分成每月的分区。分区会根据需要以两个月为增量自动添加。

Column

Type

Description

ctime

timestamp

创建此行的时间

tmid

int

特定查询的时间标识符。 与查询关联的所有记录将具有相同的tmid。

ssid

int

会话ID,如gp_session_id所示。 与查询关联的所有记录将具有相同的ssid。

ccnt

int

该会话中的命令编号,如gp_command_count所示。 与查询关联的所有记录将具有相同的ccnt。

username

varchar(64)

发出此查询的Greenplum角色名称。

db

varchar(64)

查询的数据库名称。

cost

int

在此版本中未实现。

tsubmit

timestamp

提交查询的时间。

tstart

timestamp

查询开始的时间。

tfinish

timestamp

查询结束的时间。

status

varchar(64)

查询状态 -- start,

done, or abort.

rows_out

bigint

Rows out for the query.

cpu_elapsed

bigint

执行此查询的所有段中所有进程的CPU使用率(以秒为单位)。 它是从数据库系统中所有主要主段获取的CPU使用率值的总和。 请注意,如果查询运行时间短于Quantum的值,Greenplum Command Center会将值记录为0。 即使查询运行时大于min_query_time和min_detailed_query的值,并且这些值小于Quantum的值,也会发生这种情况。

cpu_currpct

float

当前执行此查询的所有进程的CPU平均百分比。 对每个段上运行的所有进程的百分比求平均值,然后计算所有这些值的平均值以表示该指标。历史数据和尾部数据中当前的CPU百分比平均值始终为零。

skew_cpu

float

显示该查询在系统中的处理偏斜量。 当一个段对查询执行的处理量不成比例时,就会发生处理/ CPU偏斜。此值是此查询所有段中所有迭代器的所有迭代器的CPU%指标的变异系数乘以100。

例如,值为.95为

显示为95。

skew_rows

float

显示系统中的行偏斜量。 发生行偏斜

当一个细分产生不成比例的数量时

查询的行。 此值是此查询所有段上所有迭代器的rows_in度量标准的变异系数,乘以100。

例如,.95的值显示为95。

 

query_hash

bigint

在此版本中未实现。

query_text

text

此查询的SQL文本。

query_plan

text

此查询的SQL的查询计划。

application_name

varchar(64)

应用程序的名称。

rsqname

varchar(64)

资源队列的名称。

rqppriority

varchar(64)

查询的优先级 -- max,

high, med, low, or min.

三、实践

本次使用的是query_history。gp中好像没有oracle中的rownum。为了排序使用窗口函数

"row_number" () OVER ( ORDER BY sum1 DESC )

SELECT
	"row_number" () OVER ( ORDER BY sum1 DESC ) RANK,
	rsqname,
	sum1 
FROM
	(
	SELECT-- "row_number"() over (partition by rsqname,SUBSTRING(ctime,1,10) order by diff asc) as id,
	rsqname,
-- SUBSTRING(ctime,1,10) as time1,
	SUM ( diff ) AS sum1 
FROM
	(
SELECT EXTRACT
	(
	epoch 
FROM
	( tfinish - tstart )) AS diff,
	rsqname,
	ctime -- ,tsubmit,-- tstart,tfinish,query_text,*
	
FROM
	queries_history 
WHERE
	ctime >= '2020-09-03 00:00:00' 
	AND ctime < '2020-09-04 00:00:00' --  and username = 'edaapu1_array'-- and rsqname = 'edaapu'
	
	AND rsqname <> '' 
	) T 
GROUP BY
	rsqname -- ,SUBSTRING(ctime,1,10)
	
	) t2

查询的结果就是 资源队列耗时的Rank 。

3.1 自动化排程

我们最终的目的是每天按时提供资源队列耗时的Rank并发送邮件。

我的解决方案是: psql + crontab + mail

#!/bin/bash
# @ author ninuesun
# @ date 2020年9月7日16:19:35
# @ desc get top time-consuming's user form gpcc
database=$1

if [ $# -ne 1 ];then
        echo -e "Usage: ./vacuumgp.sh  < dbname > \n "
        echo -e "Example : ./vacuumgp.sh postgres"
        exit 8
fi

#加载gp环境变量
source /home/gpadmin/.bash_profile

date=`date +"%Y-%m-%d %H:%M:%S"` 

dateFrom=$(date +"%Y-%m-%d %H:%M:%S" --date '24 hours ago')
dateTo=$(date +"%Y-%m-%d %H:%M:%S")
message=$(psql -h hostname -d $database -v v1="'$dateFrom'" -v v2="'$dateTo'" -f /home/scripts/GPCC/getGpccInfo.sql)  
#echo "message\n :$message"
echo -e "GPCC top resname:\n $message"|mail  -s "resname 耗时rank" 邮箱地址

需要注意的就是

1、psql 传参。使用参数-v

2、多个参数需要传多个-v(单个生效原则)

3、传参的单引号可以在sql中也可以在psql脚本中

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!