Zurab Kiknavelidze
08/06/2026, 7:58 PMRocky
08/06/2026, 7:59 PMSHOW BACKENDS (or SHOW PROC '/backends') or perceived from the compute node's status is the result of applying the mem_limit configuration to the detected total physical memory.
Based on your numbers (180 GB pod, 95% mem_limit, seeing 153 GB), here are the most likely reasons for the discrepancy:
1. The "Double Limit" Calculation (90% × 95%)
StarRocks has a default internal hard limit of 90% of the server/pod's memory. If you set your mem_limit to 95%, some versions or specific resource group configurations might apply this as 95% of the 90% available to the process.
* Math: $180\text{ GB} \times 0.90 \text{ (default hard limit)} \times 0.95 \text{ (your config)} = \mathbf{153.9\text{ GB}}$.
* This matches your observed 153 GB almost perfectly.
2. Binary (GiB) vs. Decimal (GB) Discrepancy
StarRocks often displays units in GiB (powers of 1024) but labels them as GB in the CLI output.
* If your Kubernetes pod is allocated 180 GB (decimal), that is approximately 167.6 GiB.
* 90% of 167.6 GiB is 150.8 GiB.
* 95% of 167.6 GiB is 159.2 GiB.
* If your pod is allocated 180 GiB (binary), then 85% of that is 153 GiB. Since $153 / 180 = 0.85$, it is possible that the effective limit was capped at 85% by the StarRocks Operator or a default soft-limit setting.
3. StarRocks Operator Defaults
If you are using the StarRocks Kubernetes Operator, it often automatically manages the mem_limit to ensure the pod doesn't get terminated by the Kubernetes OOM Killer.
* The Operator typically reserves a portion of memory (often 10–15%) for the operating system, thread stacks, and the Go-based manager within the container.
* If the Operator calculates the limit as 85% of the pod's limit (to be safe), $180\text{ GB} \times 0.85 = \mathbf{153\text{ GB}}$.
How to verify:
1. Check the actual config: Run the following SQL to see what the BE/CN process actually thinks its limit is:
sql
ADMIN SHOW FRONTEND CONFIG; -- (for FE)
-- For BE/CN, check the metrics page:
-- curl http://<CN_IP>:<HTTP_PORT>/metrics | grep mem_limit
2. Check the column name: Confirm if you are looking at MemLimit in SHOW BACKENDS or if you are calculating it from MemUsedPct.
3. Check Resource Groups: If you are using Resource Groups, the 153 GB might be the limit of the default_wg or a specific group, which is a fraction of the total node memory.
Recommendation:
If you want StarRocks to use more of the 180 GB, ensure mem_limit is set as a literal value (e.g., mem_limit = 170G) in your cn.conf or the config section of your Kubernetes CRD, rather than a percentage. This overrides any internal percentage-percentage-based calculations.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_BACKENDS.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.mdZurab Kiknavelidze
08/06/2026, 8:02 PMRocky
08/06/2026, 8:03 PMmem_limit), StarRocks performs the following calculation:
1. Process Memory Limit (mem_limit):
StarRocks takes your pod's physical memory and applies the 95% config.
* $180\text{ GB} \times 0.95 = \mathbf{171\text{ GB}}$ (Total memory the process is allowed to use).
2. Query Pool Limit (query_max_memory_limit_percent):
By default, StarRocks reserves a portion of the process memory for metadata, caches (like PageCache), and system overhead. The memory available for actual query execution (the Query Pool) defaults to 90% of the process limit.
* $171\text{ GB} \times \mathbf{0.90} = \mathbf{153.9\text{ GB}}$.
This 153.9 GB matches your observed 153–154 GB almost exactly.
Why does SHOW COMPUTE NODES show 153 GB?
In recent versions of StarRocks (v3.x+), the MemLimit column in SHOW COMPUTE NODES and SHOW BACKENDS displays the Query Pool Limit, not the total process memory limit. This is intended to give you a realistic view of how much memory is actually available for running queries before the system starts hitting limits or spilling to disk.
How to increase it
If you want to allow queries to use more of that 180 GB, you have two options:
1. Increase the Query Pool Percentage:
Add or modify this parameter in your cn.conf (or via the Helm chart's config section):
properties
query_max_memory_limit_percent = 95
Note: Setting this too high (e.g., 100%) is risky as it leaves no room for the process's internal overhead and PageCache, which could lead to stability issues.
2. Use an Absolute Value for `mem_limit`:
Instead of percentages (which can be confusing due to nested ratios), set a specific byte value. For a 180 GB pod, you might set:
properties
mem_limit = 170G
This removes the ambiguity of "95% of what?" and gives you a fixed ceiling.
Summary of Values
* Pod Limit: 180 GB
* Process Limit (mem_limit = 95%): ~171 GB
* Effective Query Limit (90% of Process): ~153.9 GB (What you see in CLI)
References
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
References
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
• administration/management/resource_management/resource_group.md
• administration/management/monitoring/metrics.md
• administration/management/resource_management/Memory_management.md
• faq/resource_isolation_faq.mdZurab Kiknavelidze
08/06/2026, 8:08 PMquery_max_memory_limit_percent in 3.5.16 versionRocky
08/06/2026, 8:08 PMquery_max_memory_limit_percent is a BE/CN static configuration parameter.
You likely cannot find it because:
1. It is not a SQL variable: You won't see it in SHOW VARIABLES.
2. It is not in the default config file: It uses a default value of 90% internally if not explicitly defined in your cn.conf.
Why you see 153 GB (The Math)
StarRocks calculates the memory available for queries (the "Query Pool") by applying a nested percentage:
1. Process Limit: Pod Memory (180 GB) × mem_limit (95%) = 171 GB.
2. Query Pool Limit: Process Limit (171 GB) × query_max_memory_limit_percent (Default 90%) = 153.9 GB.
The value shown in the MemLimit column of SHOW COMPUTE NODES is the Query Pool Limit, which explains why you see ~153 GB.
How to verify this on your CN
Since you are on Kubernetes, you can verify what the CN process actually sees by querying its HTTP metrics endpoint from within the pod or via a service:
bash
# From a pod that can reach the CN
curl -s http://<CN_IP>:<HTTP_PORT>/metrics | grep query_pool_mem_limit
You can also check the configuration directly using SQL:
sql
ADMIN SHOW CONFIG; -- Look for query_max_memory_limit_percent in the output
(Note: If it's not in the output, it means it is using the default of 90).
How to change it
If you want to allow queries to use more of the process memory, you must add this to your CN configuration. If you are using the Helm chart or StarRocks Operator, add it to the config section of your Compute Node specification:
yaml
# Example in StarRocksComputeNode CRD or Helm values
config: |
mem_limit = 95%
query_max_memory_limit_percent = 95
Recommendation:
It is safer to leave query_max_memory_limit_percent at 90%. This ensures there is enough memory reserved for the process overhead, PageCache, and metadata. If you set both to 95%+, you increase the risk of the Pod being killed by the Kubernetes OOM Killer because the actual process usage might exceed the 180 GB limit.
References
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• faq/resource_isolation_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• sql-reference/System_variable.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• knowledge/trouble_shooting/fe_memory_problems.md
• knowledge/usage/best-practice.md
• faq/Sql_faq.md
• administration/management/resource_management/resource_group.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_BACKENDS.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• administration/management/FE_configuration.mdRocky
08/06/2026, 8:08 PMZurab Kiknavelidze
08/06/2026, 8:10 PMRocky
08/06/2026, 8:10 PMmem_limit = 95%): StarRocks "claims" 171 GB ($180 \times 0.95$).
* Reserved for Kubernetes/OS (5%): The remaining 9 GB is left unmanaged by the StarRocks process. This provides a safety buffer for the OS, pod-sidecar containers, and to prevent the Kubernetes OOM Killer from immediately terminating the pod if the process spikes slightly above its limit.
2. The Process Level (171 GB)
Within the 171 GB that StarRocks is allowed to use, it further divides the memory:
* The Query Pool (query_max_memory_limit_percent = 90%): This is the memory available for actual SQL execution (joins, aggregations, etc.).
* Calculation: $171 \text{ GB} \times 0.90 = \mathbf{153.9 \text{ GB}}$.
* This is the "MemLimit" value you see in SHOW COMPUTE NODES.
* System & Metadata Reserved (10%): The remaining 17.1 GB ($171 - 153.9$) is reserved for everything else that isn't a "query," including:
* Metadata Cache: Information about table schemas and rowsets.
* PageCache: Cached data blocks from disk/object storage to speed up repeats.
* Process Overhead: Thread stacks, RPC buffers, and internal Go/C++ management.
Why you couldn't find the variable
The reason you likely can't find query_max_memory_limit_percent is that:
1. It is a BE/CN Configuration, not a SQL System Variable. You won't see it in SHOW VARIABLES. To see it, you must run:
sql
ADMIN SHOW FRONTEND CONFIG; -- (if checking FE)
-- For CN, you must check the configuration via:
ADMIN SHOW CONFIG;
2. It uses a default: If it is not explicitly written in your cn.conf file, it won't appear there, but the process still uses the internal default of 90.
Summary of your 180 GB Pod
Layer | Size | Purpose
Pod Buffer | ~9 GB | OS, K8s, and stability safety
Internal Reserved | ~17 GB | Caches (Metadata/PageCache) and internal overhead
Query Pool | ~154 GB | Actual memory available to run your SQL queries
If you need to give queries more room, you can increase query_max_memory_limit_percent to 95 in your cn.conf, but be careful: this reduces the memory available for the PageCache, which can slow down query performance.
References
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• faq/resource_isolation_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
References
• administration/management/BE_configuration.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/resource_group.md
• sql-reference/System_variable.md
• administration/management/resource_management/Memory_management.mdZurab Kiknavelidze
08/06/2026, 8:13 PMRocky
08/06/2026, 8:13 PMMemLimit value you see in SHOW COMPUTE NODES (or SHOW BACKENDS) is specifically the Query Pool Limit, not the total process limit.
* Total Pod: 180 GB
* Process Limit (mem_limit = 95%): ~171 GB
* Query Pool Limit (Default 90% of Process): $171 \times 0.9 = \mathbf{153.9 \text{ GB}}$
This confirms that the 154 GB you see is the maximum memory allocated specifically for query execution (e.g., joins, aggregations, sort buffers).
2. Are Caches "Under" Query Memory?
No. In the StarRocks memory hierarchy, the Query Pool, Page Cache, and Metadata Cache are peer trackers under the main process. You can verify this by checking the CN's internal memory tracker:
bash
curl -s http://<CN_IP>:<HTTP_PORT>/mem_tracker
In the output, you will see separate rows for:
* `query_pool`: Tracks memory used by the execution engine during active queries.
* `page_cache`: Tracks the data blocks cached from disk/object storage.
* `metadata`: Tracks tablet, schema, and rowset metadata.
3. The "Hidden" 10% (17 GB)
The 10% of process memory ($171 - 154 = \mathbf{17 \text{ GB}}$) that is not part of the Query Pool is where the Page Cache and Metadata Cache primarily live.
The Catch:
While they are separate, they all share the same 171 GB process ceiling.
* If your Query Pool is currently using 100 GB, the caches have 71 GB of "breathing room."
* If your Query Pool hits its 154 GB limit, the Page Cache and Metadata Cache are "squeezed" into the remaining 17 GB. If they exceed that, the process will reach 171 GB and StarRocks will start aggressively evicting caches or failing queries to prevent a Pod OOM.
Summary
* 154 GB (MemLimit): The hard cap for query execution memory only.
* Metadata/Page Cache: Live outside that 154 GB, using the remaining 17 GB (and any unused portion of the 154 GB).
* Why you can't find the variable: query_max_memory_limit_percent is a hidden/internal default of 90% in most 3.x versions unless you explicitly add it to your cn.conf.
If you want to give more memory to queries and you don't mind smaller caches, you can add query_max_memory_limit_percent = 95 to your config, which would raise your MemLimit to ~162 GB.
References
• administration/management/resource_management/Memory_management.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• data_source/data_cache.md
References
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• data_source/data_cache.md
• using_starrocks/caching/query_cache.mdZurab Kiknavelidze
08/06/2026, 8:20 PMRocky
08/06/2026, 8:21 PMquery_pool tracker is indeed 90% of the 154 GB process limit.
StarRocks v3.x uses a "nested" memory limit strategy to ensure stability. Here is the exact calculation happening in your v3.5.16 environment:
1. The Multi-Layer Memory Map
Step | Calculation | Value | Description
Total Pod | — | 180 GB | Your Kubernetes Pod Limit.
Process Hard Limit | $180 \times 0.95$ | 171 GB | Configured via mem_limit = 95%. This is the absolute ceiling.
Process Tracker Limit | $171 \times 0.90$ | ~154 GB | This is the MemLimit you see in SHOW COMPUTE NODES. StarRocks automatically reserves 10% of the hard limit for internal system overhead (thread stacks, RPC buffers, etc.).
Query Pool Limit | $154 \times 0.90$ | ~138.6 GB | This is the limit for query_pool in mem_tracker. This uses the default value of query_max_memory_limit_percent (90).
2. Why the extra 10% reduction?
You are essentially seeing two different "safeguards":
1. System Safeguard (171 GB $\to$ 154 GB): StarRocks subtracts 10% from the configured mem_limit to create a "Soft Limit." If the process exceeds 154 GB, it will start trying to free memory (GC, cache eviction) before it hits the hard 171 GB limit where it might crash or be killed by K8s.
2. Resource Division (154 GB $\to$ 138 GB): The query_max_memory_limit_percent (default 90%) ensures that Metadata Cache and Page Cache have at least 15.4 GB (the remaining 10%) of space to live in without being crowded out by a single massive query.
How to increase the Query Pool to 154 GB
If you want your queries to be able to use the full 154 GB (meaning you are okay with them potentially pushing out Page Caches), you can set:
bash
# In cn.conf
query_max_memory_limit_percent = 100
After a restart, the query_pool limit in mem_tracker will match the MemLimit in SHOW COMPUTE NODES (~154 GB).
Verification Tip:
You can see these different trackers and their specific limits by running:
bash
curl -s http://<CN_IP>:8040/mem_tracker
Look for the process row limit (should be ~154 GB) and the query_pool row limit (should be ~138 GB).
References
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• faq/resource_isolation_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
References
• faq/resource_isolation_faq.md
• administration/management/resource_management/query_queues.md
• administration/management/resource_management/Memory_management.md
• administration/management/BE_configuration.md
• administration/management/resource_management/Query_management.md