资源管理是通过cgroup实现的。cpu子系统是控制cpu时间分配的一个控制器,这个子系统使用调度程序提供对CPU的cgroup任务访问。
资源管理在如下使用情景下,高优先级用户读DC的过程会受到低优先级用户的影响,导致高、低优先级用户执行性能相近:
(1)使用相同并行度;
(2)同时采用相同(类似)的SQL访问同一张表的相同列的数据,且IO是该SQL的主要耗时(如果算子计算是SQL主要耗时则影响程度会降低);
(3)访问的数据是冷数据(如果部分数据是热数据,则随着热数据占比重的增加,读DC数据的影响程度降低);
在完全满足条件(2)、(3)的情况下,调整并行度,可以减少高低优先级相互之间的影响。
以一个静态池为例,期望最大化利用内存(同时避免溢出风险),max_memory值不应超过gnode进程的最大可用内存。
max_memory值指Large堆内存的分配上限。默认情况下:gnode的最大可用内存为(系统内存+swap)*0.8。其中比率0.8可由gbase_memory_pct_target参数调整。无论是否开启资源管理,只要比率设置合理,不会引发系统OOM。
两种机制同时存在,max_memory值应小于gnode的最大可用内存限制时才会生效,反之则体现为不生效或不限制。
由于内核BUG,必须使用RH7.3+/SUSE12+(Docker的最低安装要求同样是RH7.3+/SUSE12+)。如果要实现比较严格的资源隔离,一定要升级到redhat7.3及以上版本,通过多个静态池来实现。
由于内核BUG,RH7.3/SUSE12以下版本,只能使用一个静态池。为实现类似静态池效果,可以使用多个动态池配合并行度和优先级参数。动态池的优先级和百分比参数的配置可影响CPU时间片争抢的权重,从而影响SQL的最终执行时间。在实践中,并行度参数比优先级参数会更显著的影响SQL的最终执行时间。