在任意时刻,OushuDB 中可能有很多个并发的查询在运行。这些查询属于不同的用户。用户的优先级可能有高有低。我们需要一种方式 来合理的给各个用户分配其可以使用的系统资源,包括 CPU 和内存等。
OushuDB 使用资源队列(Resource Queues)来管理整个系统的资源。每一个 OushuDB 用户都和一个资源队列关联,该用户发出的所有查询 都会使用该关联的资源队列中的资源。我们可以创建多个资源队列,资源队列之间形成一种树状结构。例如下图:
图 OushuDB 资源队列
其中 pg_root 和 pg_default 系统默认已经创建的资源管理队列。pg_root 是资源队列树的根。pg_default 是其子队列。
当一个用户被创建的时候,默认会被分配到 pg_default 队列。
下面的语句创建了一个资源队列 ceo_report。指定了其最大的并发查询数为 20。另外,该队列使用了其父亲队列 pg_root 的 30% 内存和 CPU 资源。
CREATE RESOURCE QUEUE ceo_report WITH (PARENT='pg_root', ACTIVE_STATEMENTS=20,MEMORY_LIMIT_CLUSTER=30%, CORE_LIMIT_CLUSTER=30%);
其中的三个配置参数的意义如下:
-
ACTIVE_STATEMENTS:资源队列允许的最大并发查询数,超过这个并发的连接则会排队等待。资源管理器会均匀分配资源到队列中并发的查询。
-
MEMORY_LIMIT_CLUSTER:资源队列可以使用的父队列内存的比例
-
CORE_LIMIT_CLUSTER:资源队列可以使用的父队列 CPU 的比例
现在我们可以创建一个用户,使用该资源管理队列:
CREATE ROLE kurt WITH LOGIN RESOURCE QUEUE ceo_report;
这样的话,kurt 用户发出的所有查询将使用 ceo_report 中的资源。
通过下面的命令可以创建上图中的其他的资源队列: