CREATE RESOURCE GROUP reference
Resource groups isolate competing query workloads inside a single QuestDB instance.
CREATE RESOURCE GROUP creates a query workload policy that bounds the
admission, CPU and memory of the principals mapped to it.
For what the limits actually guarantee, see resource groups.
Syntax
CREATE RESOURCE GROUP [IF NOT EXISTS] groupName
[WITH ( parameter = value [, parameter = value ...] )];
Parameters
Every parameter is optional. An unset parameter falls back to the instance default, which is not always "unlimited":
| Parameter | Accepted values | Unset behaviour |
|---|---|---|
cpu_limit | a quoted whole-number percentage of the node's CPUs, '1%' to '100%', or '0%' for none | no limit |
cpu_weight | integer, 1 to 10000 | 100 |
max_active_queries | integer, 1 or more | unlimited |
max_queued_queries | integer, 0 or more | unlimited |
memory_limit | a byte size such as '8G', or 0 or UNLIMITED for no group ceiling | no group ceiling |
queue_timeout | whole milliseconds, or a duration such as '15s' or '2m' | 30 seconds |
scheduling_policy | 'fifo' or 'fair', in any case | fifo |
Description
CREATE RESOURCE GROUP adds a policy with no principals mapped to it. Creating
the group alone changes nothing: map a user, ACL group or service account to it
with ALTER USER,
ALTER GROUP or
ALTER SERVICE ACCOUNT
before it governs anything.
The name must be unique across resource groups, and names are case-sensitive,
except DEFAULT. If the name is already taken the statement fails, unless
IF NOT EXISTS is included.
The statement requires the
RESOURCE GROUP ADMIN permission.
Creating a second resource group engages CPU scheduling for the whole instance,
and so does a CPU limit or the fair policy on any group. Until then there is
no CPU slicing at all, so weights have no effect while DEFAULT is the only
group. See
when scheduling engages.
cpu_limit is a ceiling: the group gets at most that percentage of the node's
CPUs on average, even while the rest of the node is idle. The percentage is of
the CPUs available to the QuestDB process, and
resource_groups() shows what it
comes to on this node in cpu_limit_cores. A value without the % sign fails
with CPU limit must be a percentage of the node's CPUs, for example '50%', and
a percentage above 100 or not a whole number, such as '2.5%', fails with
invalid Resource Group policy value. How the limit is enforced, and when a
group can briefly exceed it, is described in
A CPU limit is a ceiling.
scheduling_policy decides how the group divides its CPU between its own users
and queries: fifo serves them in arrival order, and fair divides the group
by user first, then by query, both for CPU and for admission. An unknown name
fails with
unknown scheduling policy, expected 'fifo' or 'fair'. See
the scheduling policy.
cpu_limit and scheduling_policy are available from QuestDB Enterprise 4.2.0.
A group ceiling only ever lowers what a query may use. memory_limit is capped
by resource.groups.process.memory.limit.bytes, and it never raises a limit set
on the principal or by cairo.query.memory.limit.bytes.
Examples
CREATE RESOURCE GROUP analytics;
CREATE RESOURCE GROUP reporting WITH (
cpu_weight = 50,
max_active_queries = 4,
memory_limit = '2G'
);
CREATE RESOURCE GROUP IF NOT EXISTS exports WITH (
cpu_weight = 10,
max_active_queries = 1
);
CREATE RESOURCE GROUP tenant_a WITH (
cpu_limit = '25%',
scheduling_policy = 'fair'
);
Map a principal so that the group governs its queries:
ALTER SERVICE ACCOUNT tenant_a_app SET RESOURCE GROUP tenant_a;
Verify with resource_groups(),
which also reports the admission settings and live counters:
SELECT name, cpu_weight, cpu_limit_pct, cpu_limit_cores, scheduling_policy,
max_active_queries, memory_limit_bytes
FROM resource_groups()
ORDER BY name;
On a node with 16 CPUs:
| name | cpu_weight | cpu_limit_pct | cpu_limit_cores | scheduling_policy | max_active_queries | memory_limit_bytes |
|---|---|---|---|---|---|---|
| DEFAULT | 100 | 0 | 0.0 | fifo | null | 0 |
| analytics | 100 | 0 | 0.0 | fifo | null | 0 |
| exports | 10 | 0 | 0.0 | fifo | 1 | 0 |
| reporting | 50 | 0 | 0.0 | fifo | 4 | 2147483648 |
| tenant_a | 100 | 25 | 4.0 | fair | null | 0 |
max_active_queries is null when the group sets no admission limit,
memory_limit_bytes is 0 when it sets no memory ceiling, and cpu_limit_pct
and cpu_limit_cores are 0 when it sets no CPU limit. cpu_weight and
scheduling_policy always report an effective value, so a group that sets
neither shows 100 and fifo.