摘要:本文用来总结一些GaussDB(DWS)在实际应用过程当中,可能出现的各类做业排队的状况,以及出现排队时,咱们应该怎么去判断是否正常,调整一些参数,让资源分配与负载管理更符合当前的业务;或者在做业阻塞的时候,怎么去处理这些状况,让业务马上恢复正常。
数据库系统的负载管理和资源管理,在整个系统中起着很重要的做用,好比不少用户的业务压力过大时,有时会致使链接数量被占满,有时会致使某种计算资源被占满,有时会致使存储空间被占满,这些状况都会致使整个集群进入异常甚至不可用的状态:正在执行的做业互相争抢CPU,会致使你们都不能好好执行;大量做业执行时,占用大量内存,很容易触发到内存瓶颈,形成做业内存不可用问题,致使业务报错等等。在不进行并发控制的状况下,这些状况都极可能会出现,影响到正常业务。数据库
本文用来总结一些GaussDB(DWS)在实际应用过程当中,可能出现的各类做业排队的状况,以及出现排队时,咱们应该怎么去判断是否正常,调整一些参数,让资源分配与负载管理更符合当前的业务;或者在做业阻塞的时候,怎么去处理这些状况,让业务马上恢复正常。session
本文分为如下几个小节去介绍并解答以上问题:并发
DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制。在经过第一层控制的时候,会继续向前走到第二层资源池控制,根据资源池当前的负载资源状况决定做业继续执行或者排队。ssh
DWS并发控制逻辑示意图以下:高并发
从本图的逻辑咱们能够看到,实际做业执行中,可能会在两种队列中排队:post
一种是全局队列(global queue),这种队列不区分简单和复杂做业,也不区分是DDL或者是普通语句,优化
一种是资源池队列(resource pool queue),用户下发的通常语句会根据资源消耗估算以及复杂程度在这里进行判断是否排队。spa
在两层队列的过滤下,DWS会筛选出当前能执行的语句,使其正常运行,运行时也会受到其所属资源池资源的限制(只能使用资源池配置的CPU、内存、IO配额)。线程
这里介绍几个经常使用视图以及SQL语句,能够迅速判断目前的业务出现问题的缘由,受限根据如下视图能够看到目前的做业是否是在排队,以后要迅速分析为何在排队,是由于负载管理各个参数配置问题,仍是由于正在执行的语句占据了过多的资源致使的排队。设计
经常使用语句:
#查询当前执行时间最长的语句的排队状态,query_id(数据库中做业的惟一标识),以及详细的语句信息。 select coorname,usename, current_timestamp-query_start as duration, enqueue,query_id,query from pgxc_stat_activity where state='active' and usename <> 'Ruby' order by duration desc;
根据该语句能够迅速判断出哪些语句执行时间很长,是什么样的语句执行很慢以及该语句的query_id,便于迅速进入下一步排查。
执行结果以下:
上图解说:图中为在没有做业的状况下查询,能够看到有几个WLM的语句已经执行了不少,不过这两个是内部常驻线程,因此不影响业务,也不会占用链接数等数据库资源。
其他的行能够看到有bi用户,在执行一些做业,时间大概1-6分钟左右。
经常使用语句:
#查询每一个用户下的做业执行状况,排队状况以及做业的复杂状况和内存消耗状况。 select usename,enqueue,datname,status,attribute,count(*),sum(statement_mem) from pg_session_wlmstat group by 3,1,2,4,5 order by 1,3,4,5 ;
执行结果以下:
上图解说:
上图中说明当前链接的cn中有用户名为usr1的用户执行做业,而且在资源池上排队(第一节介绍的resourcepool队列),数据库为postgres,做业在排队因此当前status为pending状态。
其余字段包括做业的属性和当前使用内存资源的总和状况(根据该数值能够看出是否由于内存资源不足而进入排队状态)。做业在排队时候不涉及到资源消耗,所以可能没有具体数值。
经常使用语句:
#在根据pgxc_stat_activity查询到具体执行时间长的语句以后,能够根据本视图查询: select * from pgxc_thread_wait_status where query_id = xxxxxxxx;
该语句能够查看执行慢语句的阻塞点,语句卡住时,能够经过该语句查看语句卡在了哪一个步骤。
举例以下:
上图能够看到做业在wait io,此时能够检查下磁盘的读写速度是否,raid卡读写策略是否正常等等。
当出现排队的时候,wait_status通常的状态是waiting in ccn queue/waiting resourcepool queue等状态。
通常当业务上发现任务阻塞时,能够从后台查询部分语句排查目前的状况,此时要先看下现象上是什么状况,通常并发控制有如下几种现象,暂时先列出这么多,后续继续补充:
若是当前cn的活跃做业超过这个参数,会出现语句排队的状况,主要排队状况为waiting in global queue,以下图所示,下图状况中,max_active_statements=6。
如图:图中最下方的两个做业,执行时间已经达到了11小时,可是仍然没有执行完,后面还有未执行的语句在排队。总体对于客户来讲就是数据库已经hang死了,什么做业都执行不出来。
排查步骤
show enable_dynamic_workload; //查看该参数目前是否为打开状态(2020年的版本都是默认打开)
经过链接cn 5001查询视图:
select * from pg_session_wlmstat where threadid = $query_id;
该视图能够看到某个语句使用了多大的内存,statement_mem字段能够看到我这个语句是使用了1G,可是实际状况中,1个语句使用几十个语句的状况不少。当一个或者几个语句的内存达到整个集群的整体可用内存上限,或者达到资源池上限的时候,就会使这些语句后面的语句开始排队。资源不放,排队不止。
应急处理:及时将卡住的语句terminate,释放其占用的资源,后续进行优化以后再执行,优化手段不少,包括计划调优,analyze等操做,均可以免一个语句占用太大内存,也能够提高执行效率。
举例:查询pgxc_stat_activity时,语句的执行状态以下:能够看到,全部语句都在waiting in ccn queue,只有两个语句在运行。此时集群设置的max_active_statements是40,可是该用户实际活跃数量只有2个。
举例:查询pgxc_stat_activity时,语句的执行状态以下:能够看到,全部语句都在waiting in ccn queue,只有两个语句在运行。此时集群设置的max_active_statements是40,可是该用户实际活跃数量只有2个。
这个视图能够清晰看到做业是在哪里排队:
首先,上图中有totalsize,这个就是整体可用的最大内存,freesize_limit:执行语句可用的最大内存,freesize:当前可用的最大内存。
因此能够得出结论,此时不是在全局排队,全局内存freesize足够,那么做业就是在资源池排队,资源池排队也会显示waiting in ccn queue。
能够经过界面或者后台查看一下,这个用户对应的租户上,是否是作了内存资源限制:
查看租户界面内存配置以下:
能够看到图中给这个租户或者说给这个用户所在的资源池配置了10%的内存配额,一共是2277MB,即2G左右。
所以这种场景下,内存资源只能知足当前两个语句的执行,其他属于该用户的语句都会进行排队。
举例:以前某局点出现高并发DDL的状况,该类高并发DDL在全局并发计数中会受到统计,占用max_active_statements中的并发数量。
好比:max_active_statements=20,其中某用户一直持续不停地下发DDL,此时在DWS设计ap场景并未涉及此类场景。会出现该20个并发设置广泛被该用户占用的状况,其余用户可能出现连不上的状况。
这种场景下,即时再调大并发,也会再被该用户的DDL语句占用。
处理方案:
针对高并发DDL的不合理业务场景进行优化,好比把连续建立删除临时表的动做,改成对永久表的操做,此时就能够极大幅度减小DDL并发数量,保证自身业务以及其他用户业务的正常链接和运行。
用户的做业分为如下几种,DDL/DML/以及常规查询,在DWS的视角中,常规查询有分为简单查询和复杂查询。
对于DWS的两层管控,受到第一层管控的有DDL、start transaction、DML、常规查询等,基本是全部语句,只有内部线程的语句(好比WLM线程)以及超级用户权限的用户执行的做业。
受到第二层管控的语句,主要是能够从优化器获取到具体执行计划以及执行代价的语句。
除了DDL/start transaction 之类的语句,以及部分白名单语句,此类语句都是视为基本不消耗资源,而且不会形成阻塞的语句。
针对目前的管控机制来讲,能够将单个用户关联到一个单独的资源池,这个资源池不设置内存配置,只设置并发配置,达到进行做业管控的效果。
具体步骤及解释以下:
1.在全部节点建立好控制组
gs_ssh -c "gs_cgroup -c -S class_a" gs_ssh -c "gs_cgroup -c -S class_a -G workload_a"
2.建立业务资源池(此时能够同步设置max_dop参数,active_statements会限制复杂做业的并发数量,max_dop参数会限制简单做业的并发数量)
create resource pool p1 with (control_group="class_a:workload_a"); alter resource pool p1 with (active_statements=10,mem_percent=0,max_dop=1);
3.关联用户与该资源池
ALTER USER testuser RESOURCE POOL 'p1';
并发管理的用处,主要是为了防止用户跑太多的做业,致使集群负载过大,资源发生争抢,系统不能稳定运行,会由于资源出现各类问题,CPU/内存/IO,哪个都是让人头疼的问题,并发控制也能够同步控制某一个用户的并发做业,避免由于一个用户的做业数量太大,致使其余用户在使用数据库的时候出现问题。
负载管理最主要的现象就是会出现做业排队的状况,排队是否合理,是否由于不合理的参数配置致使大量的业务阻塞;或者配置正常,可是没有达到上限就出现排队,本文的主要目的就是解决此类问题,或者及时定界到是什么缘由致使了阻塞。
实际使用过程当中,许多时候出现排队的状况,均可能和正在执行的语句有关,正在执行的语句占用着这个位置,又执行不完,其他语句天然会排队。所以咱们碰到语句大量阻塞的状况,要迅速定界到是由于什么而形成阻塞,怎么样能恢复正常使用。找到问题的语句后,要及时去将它作一些适当的调优,避免再次执行到这个语句,还会出现同样的状况。