更新时间:2022-07-29 GMT+08:00

CPU优先级调度

优先级调度包括CPU优先级调度和IO优先级调度。CPU优先级调度根据关联控制组的优先级,将新的任务加入资源池等待队列实现调度,而IO优先级调度通过挂起数据库的IO请求实现。本节主要介绍CPU优先级调度。

前提条件

资源负载管理功能开启。

背景信息

当资源池执行的并发任务达到资源池上限后,新进入的任务会进入资源池等待队列中。

资源负载管理开启模式下等待队列的机制如图1所示:

图1 负载管理等待队列的机制

其中,用户任务会经由CN队列和资源池队列进入到资源池中进行执行,过程如下:

  1. 各用户执行的作业任务通过LVS分发至各CN队列。用户也可以直接连接至CN实例执行任务,即用户任务可以直接进入连接的CN队列。其中,在任意CN上,任务按照先进先出的原则,进入该CN的等待队列,先进入的该队列的任务会优先进入下一步。
  2. 在任意CN队列中,任务会被调度至其对应的资源池队列中。规则是:
    • CN队列中的任务按照先进先出的方式被调度执行。
    • 任务进入的资源池队列是由执行任务的用户所绑定的资源池决定的,如果该用户没有绑定资源池,则任务进入默认资源池default_pool的等待队列。
  3. 资源池队列中的任务按照先进先出的原则被执行。当资源池中的空闲资源满足资源池队列中最下端任务的需求时,则该任务进入资源池中开始执行。

操作步骤

  • 调整资源池的优先级。

    如果一个资源池拥有的资源比例发生了变化,则其对应的优先级也会发生变化。可以通过调整资源池中属性来修改优先级。

    1
    ALTER RESOURCE POOL respool2 WITH(CONTROL_GROUP = "Rush");
    

    修改资源池的控制组属性为Rush。

  • 调整当前用户的优先级。调整用户的优先级可以通过调整其绑定的资源池来修改。例如,
    1
    ALTER USER user1 WITH RESOURCE POOL 'respool2';
    

    其中user1为需要调整优先级的用户,respool2为调整后的资源池。调整用户优先级需要有sysadmin权限。

  • 调整当前会话的优先级。

    我们可以通过临时切换当前会话绑定的控制组来实现会话中任务优先级的调整。例如,

    1
    SET CGROUP_NAME="Rush";
    

    查看当前会话绑定的控制组:

    1
    SHOW CGROUP_NAME;
    
  • 手动调整任务在队列中的位置。

    如果语句优先级较低或者长时间被阻塞需要尽快执行,可以使用插队操作,该操作仅管理员可以执行。

    1. 查询CN队列中的阻塞任务,获取需要调整的阻塞任务的pid。
      1
      SELECT * FROM pg_session_wlmstat where status = 'pending';
      
    2. 调整任务在CN队列中的位置,将该任务调整到CN队列的最前端。
      1
      SELECT pg_wlm_jump_queue(threadid);
      
    3. 作业执行中,把作业的优先级调整到High。通过视图pg_session_wlmstat查询到作业的threadid。
      1
      SELECT gs_wlm_switch_cgroup(threadid, 'High');
      

    只有管理员才有权限对正在执行的任务调整优先级。