Francisco Silva
06/19/2026, 12:33 PMRocky
06/19/2026, 12:34 PMmeta folder is typically between 100 MB and 1 GB.
The exact size is dynamic and depends on your data ingestion frequency (number of rowsets) and version retention, rather than just the number of tablets.
1. What is in the meta folder?
The meta folder on a BE node (located under your storage_root_path) contains a RocksDB database that stores:
* Tablet Metadata: Information about tablet IDs, schema hashes, and states.
* Rowset Metadata: Details for every data version (rowset) within each tablet, including segment file paths and version numbers.
2. Factors affecting the size
* Number of Rowsets: Each data load creates a new rowset. Even if you only have 1,000 tablets, if those tablets have many un-compacted rowsets, the RocksDB metadata will grow.
* Tablet Versions: By default, StarRocks allows up to 1,000 versions per tablet (tablet_max_versions). If your tablets are near this limit, the meta folder will be larger.
* Checkpointing: StarRocks periodically checkpoints metadata to manage RocksDB size. This is controlled by tablet_meta_checkpoint_min_new_rowsets_num (default: 10).
3. Definitive Documentation & Monitoring
* RocksDB Meta Buffer: StarRocks allocates a specific memory buffer for metadata in RocksDB. The parameter rocksdb_max_write_buffer_memory_bytes defaults to 1 GB, indicating the scale at which the system expects to manage metadata writes.
* Monitoring Metrics: You can verify the actual memory impact of this metadata using the metric tablet_metadata_mem_bytes.
* Tablet Count Guidance: While there is no strict limit, StarRocks recommends keeping tablets around 1 GB in data size for optimal performance. 1,000 tablets is considered a very small-to-moderate load for a modern BE node, so a meta folder exceeding a few gigabytes would usually indicate an issue like "too many versions" or failed compactions.
Summary Table for 1,000 Tablets:
Metric | Expected Value | Source
Normal Folder Size | 100 MB ~ 1 GB | Internal RocksDB structure
Default Max Versions | 1,000 | tablet_max_versions (BE Config)
Meta Write Buffer | 1 GB (Default) | rocksdb_max_write_buffer_memory_bytes
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/be_tablets.md
• administration/management/BE_configuration.md
• faq/Deploy_faq.mdFrancisco Silva
06/19/2026, 12:45 PMRocky
06/19/2026, 12:46 PMmeta folder because StarRocks stores metadata in a RocksDB instance, meaning the size is a function of your ingestion frequency and compaction state, not just the tablet count.
For 1,000 tablets, a healthy meta folder is typically 100 MB to 1 GB. If it exceeds several gigabytes, it usually indicates an accumulation of metadata versions.
1. Definitive Documentation: Content of the meta Folder
The meta folder (located in your storage_root_path) contains a RocksDB database that persists:
* TabletMeta: Schema information and state for each tablet.
* RowsetMeta: Metadata for every data version (rowset). This is the primary driver of growth. Each load or compaction task creates new rowsets.
2. Documentation-Backed Growth Factors
The following BE configuration parameters (found in BE Configuration) directly manage the size and persistence of this metadata:
Parameter | Default | Impact on meta Folder
tablet_meta_checkpoint_min_new_rowsets_num | 10 | Triggers a metadata checkpoint after 10 new rowsets are created. Frequent checkpoints keep the RocksDB log small but increase .sst file activity.
tablet_meta_checkpoint_min_interval_secs | 600 | Minimum time (10 mins) between metadata checkpoints.
rocksdb_max_write_buffer_memory_bytes | 1GB | The maximum size of the RocksDB write buffer for metadata before flushing to disk.
tablet_max_versions | 1000 | The maximum number of rowset versions kept per tablet. 1,000 tablets at the max version limit can result in 1,000,000 rowset metadata entries.
3. How to Justify Your Specific Size
You can verify the exact metadata overhead for your 1,000 tablets using StarRocks' built-in monitoring and system tables:
* View Metadata Metrics: Check the tablet_metadata_mem_bytes metric. This represents the memory-resident portion of the metadata stored in that folder.
* Inspect Rowset Counts: Use the be_tablets system table to see if your 1,000 tablets have an excessive number of rowsets:
sql
SELECT SUM(NUM_ROWSET) FROM information_schema.be_tablets;
* Normal: ~10-50 rowsets per tablet (~10k - 50k total records in RocksDB).
* Abnormal: >500 rowsets per tablet (indicates compaction is lagging, which will bloat the meta folder).
Summary of "Definitive" Guidance
Documentation for Planning a Cluster and Monitoring Metrics confirms that while data storage is measured in TBs, metadata (including the meta folder) is designed to fit within the scale of memory buffers (1GB) and RocksDB background compaction.
If your 1,000 tablets result in a meta folder significantly larger than 1GB, check your NUM_ROWSET counts, as this implies a backlog of metadata that hasn't been cleaned up by compaction.
References
• administration/management/monitoring/metrics.md
• table_design/table_types/primary_key_table.md
• administration/management/BE_configuration.md
• faq/shared_data_faq.mdFrancisco Silva
06/19/2026, 3:45 PMRocky
06/19/2026, 3:45 PMmeta folder on a StarRocks BE node, you should trigger a manual compaction of the internal RocksDB metadata database. Do not manually delete files in the meta folder, as this will corrupt the node and result in data loss.
Here is the definitive way to perform this operation:
1. Manual Metadata Compaction (The "Force Clean")
StarRocks provides a specific HTTP API to trigger a manual compaction of the RocksDB instance stored in the meta folder. This merges fragmented metadata and reclaims disk space.
Run this command for each BE node:
bash
curl -X POST http://<be_ip>:<be_http_port>/api/compact_rocksdb_meta
* Effect: Instructs RocksDB to perform a full CompactRange() on the metadata database.
* Result: SST files in the meta directory are merged, and entries for deleted tablets or old rowset versions are physically removed.
2. Speed Up Stale Metadata Reclamation
If the folder remains large, it may be because StarRocks is holding onto "stale" metadata (versions replaced by compaction but not yet swept). You can force the cleanup cycle to run more frequently by updating the BE configuration:
sql
-- Decrease the stale sweep interval (Default: 1800s / 30m)
UPDATE information_schema.be_configs
SET VALUE = "300"
WHERE name = "tablet_rowset_stale_sweep_time_sec";
3. Force Data Compaction (Indirect Metadata Cleanup)
Bloated metadata is often caused by having too many rowset versions per tablet. Forcing a base compaction on problematic tablets will consolidate these versions, which in turn allows the compact_rocksdb_meta command to prune more metadata.
To check for tablets with high version counts:
sql
SELECT TABLET_ID, NUM_ROWSET
FROM information_schema.be_tablets
ORDER BY NUM_ROWSET DESC
LIMIT 10;
To force compaction on a specific tablet:
bash
curl -X POST "http://<be_ip>:<be_http_port>/api/compact?tablet_id=<tablet_id>&compaction_type=base"
4. The "Last Resort" Clean
If the meta folder is abnormally large (e.g., >10GB for 1000 tablets) and manual compaction fails to shrink it, the metadata may be bloated beyond repair. The only safe "clean" is to re-synchronize the node:
1. Decommission the BE: ALTER SYSTEM DROP BACKEND "<be_ip>:<be_heartbeat_port>";
2. Wipe Data: Stop the BE process and delete the entire storage_root_path (including data and meta).
3. Re-add the BE: ALTER SYSTEM ADD BACKEND "...";
The node will then perform a clean clone of the data and metadata from other replicas.
Documentation References
* BE HTTP Interface - compact_rocksdb_meta
* BE Configuration - tablet_rowset_stale_sweep_time_sec
* Compaction Management
References
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/tablet_replica/ADMIN_CHECK_TABLET.md
• knowledge/admin_and_operation/shared_data_compaction.mdFrancisco Silva
06/19/2026, 4:06 PMRocky
06/19/2026, 4:06 PMmeta directory. Because the meta folder is managed by an internal RocksDB instance, StarRocks primarily exposes metrics for the memory it consumes and the status of the metadata operations.
To track metadata-related growth over time, you should use the following metrics and strategies:
1. Closest Native Metric (Memory)
The most relevant metric for tracking the scale of your metadata is:
* Metric Name: tablet_metadata_mem_bytes
* Description: Tracks the memory used by tablet metadata in the BE.
* Why it helps: As the number of rowset versions increases (bloating the meta folder on disk), the memory used to cache or process that metadata typically rises in tandem.
2. General Disk Tracking
StarRocks tracks the overall usage of your storage roots:
* Metric Name: starrocks_be_disks_data_used_capacity
* Labels: path
* Note: This metric tracks the total data used in your storage_root_path. If your meta folder and data folder are on the same disk (default), this metric will show the combined usage.
3. Indirect Proxies for Meta Growth
Since the meta folder grows primarily due to "version bloat," you should monitor these metrics to predict when the folder size will spike:
* starrocks_fe_tablet_max_compaction_score: A high score means many uncompacted versions exist, which directly correlates to more entries in the meta folder.
* starrocks_be_tablet_max_version: Tracks the maximum number of versions in a single tablet. If this approaches your tablet_max_versions config (default 1000), your meta folder is likely at its peak.
4. Recommended Workaround for Folder Size
If you require the exact disk size of the meta folder in Prometheus, the standard industry practice for StarRocks (and similar databases) is to use the Prometheus Node Exporter with a Textfile Collector:
1. Create a cron job on the BE node:
bash
echo "starrocks_be_meta_folder_size_bytes $(du -sb /path/to/storage/meta | cut -f1)" > /var/lib/node_exporter/textfile_collector/meta_size.prom
2. Point your Prometheus scrape job to the Node Exporter.
Summary Table
Metric | Type | Purpose
tablet_metadata_mem_bytes | Gauge | Track memory overhead of metadata.
starrocks_fe_tablet_num | Gauge | Track the number of tablets (baseline for meta size).
be_tablets.NUM_ROWSET | SQL | Query via information_schema to see metadata density.
References
• administration/management/monitoring/metrics.md
• administration/management/BE_configuration.md
• sql-reference/information_schema/be_metrics.md
metrics)
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/be_tablets.md
• sql-reference/information_schema/be_metrics.md
• knowledge/admin_and_operation/shared_data_compaction.mdFrancisco Silva
06/19/2026, 4:22 PMRocky
06/19/2026, 4:22 PMmeta_tool.sh (or the underlying meta_tool binary) is a command-line utility located in the be/bin/ directory of a StarRocks Backend (BE) node. It is primarily used for low-level inspection and manipulation of tablet metadata stored in the BE's internal RocksDB database (the meta folder).
It is considered a diagnostic and emergency tool and should generally only be used under the guidance of StarRocks support or for specific maintenance tasks.
1. Common Uses in Standard (Shared-Nothing) BEs
In a standard StarRocks deployment, meta_tool allows you to interact directly with the local RocksDB metadata without the BE process necessarily being active. Key operations include:
* get_meta: Retrieves the JSON-formatted metadata for a specific tablet_id. This is useful for checking the schema, rowset versions, or state of a corrupted tablet.
* list_meta: Lists all tablets stored on the current BE node according to the RocksDB metadata.
* delete_meta: Manually removes a tablet's metadata from RocksDB. This is sometimes used to clean up "zombie" tablets that the FE no longer recognizes but still occupy space in the BE.
* compact_meta: Triggers a compaction on the RocksDB metadata instance to reclaim space (though the HTTP API compact_rocksdb_meta is the preferred way for live nodes).
2. Specific Use in Shared-Data (Lake) Clusters
As of StarRocks 3.x, meta_tool.sh gained a critical role in Garbage Collection (GC) for shared-data clusters (where data is stored in S3/OSS).
* Operation: lake_datafile_gc
* Purpose: Compares the data files present in object storage (S3/OSS) against the Tablet Meta records.
* Function: It identifies "garbage" files—data files that exist in storage but are no longer referenced by any tablet metadata (often due to failed compactions or interrupted loads).
* Usage Example:
bash
./bin/meta_tool.sh --operation=lake_datafile_gc --root_path="<s3://my-bucket/starrocks/>" --conf_file=./conf/be.conf --do_delete=false
3. How to See Available Commands
You can view all supported operations by running the tool with the --help flag or by checking the binary directly:
bash
# Check the help output
./bin/meta_tool --help
Warning
Directly modifying metadata with this tool is dangerous.
• If you delete metadata for a tablet that the FE still thinks is healthy, you can cause permanent data inconsistency or "replica missing" errors.
• Always back up your meta folder before performing write/delete operations with meta_tool.
meta_tool`.
References
• knowledge/admin_and_operation/shared_data_compaction.mdFrancisco Silva
06/19/2026, 4:27 PMRocky
06/19/2026, 4:27 PMmeta folder is 50GB on one node and only 7GB on another despite running the compaction API, you likely have an accumulation of stale rowset versions or a significant imbalance in tablet/version distribution.
Follow these steps to diagnose and resolve the 50GB bloat:
1. Compare Tablet and Version Counts
First, verify if the "bloated" node actually has more data or more fragmentation than the healthy one. Run this query in your StarRocks MySQL client:
sql
SELECT
BE_ID,
count(TABLET_ID) as tablet_count,
sum(NUM_ROWSET) as total_rowsets,
max(NUM_ROWSET) as max_rowsets_per_tablet
FROM information_schema.be_tablets
GROUP BY BE_ID;
* If the bloated node has significantly more tablets: You need to rebalance your cluster (check show proc '/cluster_balance').
* If tablet counts are similar but total_rowsets is much higher: This confirms fragmentation.
2. Accelerate the "Stale Sweep"
StarRocks keeps metadata for old rowset versions (replaced by compaction) for a certain period before permanently deleting them from the meta folder. If this cleanup is too slow, the folder grows.
Reduce the sweep interval and the grace period on the 50GB node:
sql
-- Decrease the sweep check interval (default 1800s)
UPDATE information_schema.be_configs SET VALUE = "300" WHERE name = "tablet_rowset_stale_sweep_time_sec";
-- Decrease the time a version must be stale before deletion (default 1800s)
-- Caution: Setting this too low during active long-running queries might cause them to fail.
UPDATE information_schema.be_configs SET VALUE = "600" WHERE name = "tablet_rowset_stale_sweep_reclaim_max_interval_sec";
After applying these, wait 10–20 minutes and then run curl -X POST http://<be_ip>:<be_http_port>/api/compact_rocksdb_meta again.
3. Identify Large "Zombie" Metadata
Sometimes the meta folder contains entries for tablets that were deleted from the cluster but failed to be removed from the local BE RocksDB.
1. Check for "Trash" folder growth: Ensure the bloat is actually in meta/ and not in storage/trash/.
2. Inspect RocksDB files: Go into the meta folder and see if it's full of .sst files or WAL files.
* If you see many WAL files, it means the RocksDB log isn't flushing.
* If you see many SST files, the compaction isn't merging them.
4. Force "Base Compaction" on Heavy Tablets
Metadata size is heavily influenced by the number of rowset versions. Find the 10 tablets with the most versions on that specific BE and force a base compaction on them:
sql
SELECT TABLET_ID, NUM_ROWSET
FROM information_schema.be_tablets
WHERE BE_ID = <bloated_be_id>
ORDER BY NUM_ROWSET DESC LIMIT 10;
For the top results, run:
bash
curl -X POST "http://<be_ip>:<be_http_port>/api/compact?tablet_id=<tablet_id>&compaction_type=base"
This forces many small metadata entries into one, allowing the subsequent compact_rocksdb_meta call to actually delete the old records.
5. The "Last Resort" (Re-clone the Node)
If the metadata is 50GB and none of the above reduces it, the internal RocksDB may be fragmented beyond what the CompactRange API can fix, or it may contain orphaned "zombie" metadata.
The safest way to "force clean" is to let StarRocks rebuild the node:
1. Decommission the BE: ALTER SYSTEM DROP BACKEND "be_host:port";
2. Wait for replicas to finish migrating to other nodes.
3. Wipe the BE storage: Delete the entire contents of your storage_root_path (including data/ and meta/).
4. Re-add the BE: ALTER SYSTEM ADD BACKEND "be_host:port";
5. StarRocks will sync a "clean" copy of the metadata and data from the other healthy replicas (resulting in a meta folder closer to 7GB).
References
• administration/management/BE_configuration.mdRocky
06/19/2026, 4:27 PMFrancisco Silva
06/22/2026, 9:34 AMRocky
06/22/2026, 9:35 AMmeta store doesn't just hold rowset pointers; it manages the EditVersion log and Delete Vectors (DelVecs).
Here is the breakdown of the root cause and the specific levers available to fix it.
1. The Root Cause: PK Metadata vs. Standard Rowsets
Standard "Stale Sweep" configs (tablet_rowset_stale_sweep_time_sec) only clean up orphaned Rowsets. In a PK table, every commit (even for 1 row) generates:
1. A new EditVersion record: Metadata mapping the tablet version to its constituent rowsets.
2. A new Delete Vector: A bitmap of deleted rows for every segment affected by the upsert.
Why it bloats to 90GB:
RocksDB is an LSM-tree. When you update a DelVec or EditVersion, the old version isn't deleted; a new version is "appended" with a higher sequence number. The 95GB you see is the accumulated history of metadata versions.
_ Standard rowset sweeping deletes the _data files* (.orc/.parquet), but it doesn't trigger the RocksDB Compaction required to physically drop the superseded metadata keys from the meta/ folder.
* StarRocks historically throttled the internal meta-RocksDB compaction to prioritize query/load I/O, leading to the "bounded but massive" growth you see.
2. Confirming with meta_tool
When you run your queued meta_tool --operation=get_meta_stat, look for the following:
* EDIT_VERSION count: If this is in the millions, your connector is committing too frequently.
* DEL_VECTOR count: This is usually the primary source of bloat. High churn on the same segments causes thousands of DelVec versions to pile up in RocksDB.
3. The Fix: Tuning PK-Specific Retention
Since you've ruled out the rowset sweep configs, you need to tune the PK history retention and the metadata compaction itself.
A. Reduce PK History Window
By default, StarRocks keeps old PK versions to support snapshot reads and consistency. If your churn is high, the default retention creates too many metadata entries.
* streaming_inner_max_history_resultsets (BE Config): Controls how many historical versions of a PK tablet are kept. Default is often higher than needed for pure upsert workloads.
* tablet_max_versions: You've checked this, but ensure it's not set to something like 10,000. For high churn, 1,000 is safer.
B. Force RocksDB to Self-Compact (The "Fix")
Since you don't want to schedule compact_rocksdb_meta, you must allow the internal RocksDB to be more aggressive on its own. StarRocks 3.x/4.x uses a specific Column Family for meta.
Check if these are set in your `be.conf`:
properties
# Ensure the internal rocksdb doesn't ignore compaction triggers
rocksdb_max_background_compactions = 4
# Adjust the level0 trigger for the meta store specifically if visible,
# but usually, the following is more effective:
metadata_max_rowset_versions_to_optimize = 512
C. Connector Batching (The "Architectural Fix")
If your update memory is 14GB and meta on-disk is 95GB, you are likely hitting the BE with hundreds of commits per minute.
* Goal: Aim for a commit frequency of once every 5–10 seconds per table, rather than "as fast as possible."
* If the connector sends 100 upserts in 100 separate transactions, you generate 100 DelVec versions. If you batch them into 1 transaction, you generate one DelVec version. This is the single most effective way to keep the meta/ folder under 5GB.
4. Why "Slow Boots"?
The 20-minute boot time happens because, during startup, the BE must iterate through the entire RocksDB meta store to rebuild the in-memory tablet metadata. Because the store is 95GB of mostly "stale" tombstones/superseded keys, the iterator spends 99% of its time skipping dead records.
RecommendationRocky
06/22/2026, 9:35 AMbuffer_flush_interval or batch_size in your connector (Flink/Python/etc.) to reduce the commit rate.
2. Verify Retention: Check the update mem-tracker details: http://<be_ip>:<be_port>/mem_tracker?type=update&upper_level=4. Look for DelVec vs PKIndex.
3. RocksDB Log: Check data/meta/LOG. If you see "Too many L0 files," it confirms RocksDB is struggling to keep up with the metadata write rate, leading to the bloat.
References
• administration/management/BE_configuration.md
• best_practices/primarykey_table.mdFrancisco Silva
06/22/2026, 9:47 AM-operation=get_meta_statRocky
06/22/2026, 9:47 AM-operation=get_meta_stat in the standard meta_tool.sh. I likely conflated a manual diagnostic script with the binary's internal operations.
Given your StarRocks v4.0.9 environment and the specific PK table churn symptoms, here is how you can actually verify which metadata type is causing the 95GB bloat and what the root cause is.
1. The Definitive "Stat" Source: RocksDB LOG
Since meta/ is a standard RocksDB instance, the most accurate diagnostic is its internal LOG file. It periodically prints a Compaction Stats table that breaks down data by Column Family (CF).
Run this on the bloated BE node:
bash
# Locate the meta folder (e.g., storage/meta/)
grep -A 20 "Compaction Stats" storage/meta/LOG | tail -n 50
What to look for in the output:
RocksDB in StarRocks uses multiple CFs. Look for these names in the "CP" or "Column Family" column:
* del_vector: This is almost certainly where your 90GB is. In PK tables, every commit writes a new Delete Vector. High churn = massive DelVec history.
* edit_version: Stores the mapping of tablet versions to rowsets.
* default: Usually stores general tablet metadata.
If del_vector shows 80GB+ and a high level (L5/L6) of SST files, it confirms that the metadata compaction is not keeping up with the DelVec generation rate.
2. Confirming the "DelVec" Theory with meta_tool
While there isn't a summary stat command, you can use the get_meta operation on a "hot" tablet (identified from your information_schema.be_tablets query) to see the version history.
bash
./bin/meta_tool --operation=get_meta --tablet_id=<tablet_id> --root_path=<storage_root_path>
If the output shows a massive list of rowset_ids or multiple historical versions that haven't been merged, it indicates the EditVersion and DelVec retention window is too wide.
3. Root Cause Analysis: Why does it regrow?
Your measurement of update(14GB) memory is a "smoking gun." In StarRocks, the update mem-tracker accounts for the Primary Index (the PK-to-location mapping). 14GB of index memory suggests either:
1. Massive Row Count: You have billions of unique keys.
2. Fragmented Index: If the row count is low, the index might be holding onto too many historical "apply" states.
The Loop:
High-frequency small commits $\rightarrow$ Thousands of DelVec/EditVersion records $\rightarrow$ RocksDB Write Amplification $\rightarrow$ StarRocks throttles meta-compaction to save I/O $\rightarrow$ Meta folder grows to 95GB.
4. How to Fix (Architectural vs. Config)
Since you've already tried aggressive sweeping and rejected scheduled compaction:
* The "Batching" Fix (Highest Priority):
If your connector is doing many tiny upserts, you are generating a new EditVersion and DelVec record every few seconds. Even if the data is small, the metadata is not. Increase your connector's flush interval (e.g., to 10–15 seconds) or batch size. This reduces the number of metadata keys RocksDB has to manage.
* RocksDB-Specific Tuning:
StarRocks provides a configuration to make the internal metadata RocksDB more aggressive. Check if you can increase:
properties
# allow more background threads for meta compaction
rocksdb_max_background_compactions = 4
* Reduce PK History Window:
Lower the version retention specifically for the PK engine:
properties
# BE config: Number of historical versions to keep in memory/meta
streaming_inner_max_history_resultsets = 3
Summary Recommendation
1. Check storage/meta/LOG to see if the del_vector column family is the space hog.
2. If confirmed, the only long-term fix is increasing the batch size in your connector to reduce the frequency of metadata commits. RocksDB simply cannot compact individual small metadata updates as fast as a high-speed connector can generate them.
ReferencesRocky
06/22/2026, 9:47 AMFrancisco Silva
06/22/2026, 9:48 AMstreaming_inner_max_history_resultsets existsRocky
06/22/2026, 9:48 AMstreaming_inner_max_history_resultsets is an internal/unexposed parameter and get_meta_stat is not a standard meta_tool flag.
Given your specific symptoms (PK tables, high churn, 95GB regrowing after manual compaction), here is the technical breakdown of the root cause and how to address it beyond just scheduling more compaction.
1. The Root Cause: Why it regrows
In Primary Key (PK) tables, every commit doesn't just add a rowset; it generates a new EditVersion and a set of Delete Vectors (DelVecs).
* The Bloat Mechanism: Delete Vectors are stored in a specific Column Family inside the internal RocksDB (meta/). When you update a DelVec (which happens on every upsert/delete for affected segments), RocksDB appends a new version of that DelVec. The 95GB isn't "live" data; it is the version history of these metadata objects.
* Why compact_rocksdb_meta works: It triggers a CompactRange() on RocksDB, which forces the LSM-tree to merge levels and finally drop those superseded/stale DelVec keys.
* Why it regrows: If your connector commits too frequently (e.g., every 1–2 seconds), you are generating metadata versions faster than the background RocksDB compaction is scheduled to merge them. StarRocks' internal metadata RocksDB is purposefully throttled to prevent I/O spikes that would hurt query performance.
2. Diagnosis: Confirming the "DelVec" Bloat
Since get_meta_stat isn't available, use the standard RocksDB log to see exactly which "Column Family" (CF) is taking up the space:
bash
# Locate your BE storage root, go into the meta folder
grep -A 20 "Compaction Stats" data/meta/LOG | tail -n 50
Look for a row named del_vector. If you see it sitting at 80GB+ with many files in Level 0 or Level 1, you have confirmed the issue.
3. Solutions to Prevent Regrowth
A. Batching (The "Architectural" Fix)
This is the only way to fundamentally stop the regrowth. If your connector sends 100 upserts in 100 separate transactions, you generate 100 DelVec versions. If you batch those 100 upserts into one transaction, you generate one DelVec version.
* Action: Increase your connector's flush interval (e.g., from 1s to 10s) or batch size. This reduces the rate of metadata version generation.
B. Tune Primary Key Metadata Retention
Lowering the threshold for when StarRocks considers a version "removable" can help the background cleanup keep pace:
* tablet_max_versions: (Default: 1000). For extremely high churn, try lowering this to 500. This triggers more aggressive version recycling.
* max_rowset_num_per_tablet: Ensure this isn't set too high, as it keeps more metadata "alive."
C. Tune Internal RocksDB Compaction
You can make the internal RocksDB more aggressive so it doesn't wait for your manual compact_rocksdb_meta call. Add/modify these in `be.conf`:
properties
# Increase background threads for metadata compaction
rocksdb_max_background_compactions = 4
rocksdb_max_background_flushes = 2
# Make the level0 trigger smaller to force compaction sooner
# (Note: These are global for the meta-RocksDB, use with caution)
# rocksdb_level0_file_num_compaction_trigger = 4
Why the Slow Boot?
The 20-minute boot is because, on startup, the BE iterates through the entire meta RocksDB to rebuild the in-memory primary index and tablet state. Because you have 90GB of "dead" versions, the iterator has to scan through all that garbage before finding the current version of the metadata.
Recommendation:
1. Verify the del_vector bloat in the meta/LOG.
2. If confirmed, double your connector's batch size/time. This is usually the only way to keep the meta/ folder under 5GB sustainably. 5GB permanently without manual intervention.
References
• table_design/table_types/primary_key_table.mdRocky
06/22/2026, 9:48 AMFrancisco Silva
06/22/2026, 11:00 AMRocky
06/22/2026, 11:01 AMmeta/LOG showing L0 write stalls and *continuous 269 MB/s compaction*—your diagnosis is 100% correct. You are experiencing "Metadata Write Amplification" caused by high-frequency commits on Primary Key (PK) tables.
1. Is 15s flush enough?
15s is the "Sweet Spot."
For most StarRocks production environments with CDC workloads, 15s is sufficient to stop the "Stalling writes" cycle.
* Why 15s? StarRocks internal metadata compaction (for the del_vector and edit_version Column Families) is optimized for batch-sized updates. At 1s intervals, the overhead of creating a new EditVersion and Delete Vector for every affected segment creates "garbage" keys faster than the background RocksDB can merge them.
* When to go to 30s: Only if your grep -c "Stalling writes" continues to climb during peak traffic hours (e.g., a massive Postgres bulk update). If you see the meta/ folder size stabilize or decline over 24 hours at 15s, stay there.
2. Other Meta-Reduction Knobs
Beyond the commit interval, you can reduce the metadata pressure with these settings:
* enable_persistent_index (Table Property):
Ensure this is true for all PK tables. If set to false, the Primary Index is kept entirely in memory and rewritten to the meta/ store frequently. With it true, the index is persisted to a separate set of files, reducing the churn in the core meta/ RocksDB.
* tablet_max_versions (BE Config - default 1000):
Consider lowering this to 500 or 300 on your high-churn nodes. This forces the BE to be more aggressive in "recycling" old metadata versions of a tablet, which tells the background compaction it can drop superseded DelVecs sooner.
* RocksDB Compaction Threads (BE Config):
If the BE nodes have spare CPU, you can increase the background compaction for the internal meta-store:
properties
rocksdb_max_background_compactions = 4
rocksdb_max_background_flushes = 2
* Partitioning Strategy:
If you have tables like experiences that are monolithic (single partition), consider partitioning them by time (e.g., month). This prevents a single tablet from becoming a "hotspot" for all metadata writes, distributing the DelVec churn across multiple RocksDB keys.
3. Downsides to Large-Batch Upserts
Moving from 1s to 15s/30s has a few trade-offs, but they are generally preferable to 95GB bloat:
1. Memory Spikes during "Apply":
When a 15s batch arrives, the "Apply" phase (mapping PKs to locations and generating DelVecs) will consume more memory in the update tracker than a 1s batch. Watch your update memory (currently 14GB); if it spikes near your BE limit, you may need to tune l0_max_mem_usage.
2. Increased Visibility Latency:
Postgres changes will now take ~15s (+ Kafka lag) to appear in StarRocks.
3. Transaction Conflict Window:
Larger batches increase the duration of the "Apply" lock on a tablet. If multiple sinks are writing to the same table, you might see more Publish Version wait times, though with a single Kafka Sink connector, this is rarely an issue.
4. Load Timeout:
Ensure streaming_load_rpc_timeout_ms (default 600s) is sufficient for your largest potential 15s burst.
Summary Verdict
Your shift to 15s bufferflush.intervalms is the correct architectural fix. The "Slow Boot" was a direct result of the BE iterator having to skip over tens of gigabytes of "tombstoned" metadata keys in RocksDB. By reducing the commit frequency, you allow the background compaction to keep the meta/ store in the "healthy" ~3GB range permanently.
References
• loading/Kafka-connector-starrocks.md
• loading/Flink-connector-starrocks.md
• best_practices/primarykey_table.mdFrancisco Silva
06/22/2026, 11:05 AMRocky
06/22/2026, 11:06 AMrocksdb_max_background_compactions and rocksdb_max_background_flushes are native RocksDB parameters, but they are not exposed as standard configuration items in StarRocks' be.conf.
I likely conflated standard RocksDB tuning with the subset of parameters StarRocks actually surfaces. Here is the accurate status of RocksDB and compaction tuning for StarRocks v4.0.9:
1. What actually exists in be.conf
StarRocks abstracts most internal RocksDB settings. The only official rocksdb_-prefixed parameters (introduced in v3.5+) for the internal meta-store are focused on memory:
* rocksdb_max_write_buffer_memory_bytes: (Default: 1GB) The maximum size of the write buffer for metadata in RocksDB.
* rocksdb_write_buffer_memory_percent: (Default: 5%) The percentage of BE memory dedicated to the metadata write buffer.
2. How StarRocks controls Compaction Threads
For data and metadata compaction, StarRocks uses its own thread management:
* compact_threads: (Default: 4) This is the primary knob for the number of concurrent compaction tasks the BE can run.
* max_compaction_concurrency: (Default: -1) Limits the total number of simultaneous compaction tasks.
Crucially, the internal RocksDB (in meta/) that stores your PK del_vector and edit_version data does not have a user-exposed configuration for its internal background thread pool in be.conf. It typically relies on internal defaults that are not meant to be modified by users.
3. Your Path Forward
Since you've already identified that L0 write stalls are the bottleneck and that compaction was already running at 269 MB/s, increasing the thread count (even if the parameters existed) might not have helped as much as reducing the write rate, which you've already done by increasing the bufferflush.intervalms to 15s.
If you still see stalls at 15s, check these valid StarRocks knobs instead:
* tablet_max_versions: Lowering this (e.g., to 500) is the official way to make StarRocks "clean up" old metadata versions more aggressively.
* update_memory_limit_percent: Since your update tracker is at 14GB, ensure the BE has enough headroom. If this limit is hit, the BE will prioritize flushing the Primary Index over compacting metadata, which can lead to the bloat you saw.
Summary: You were right to question those settings. Stick with the 15s flush interval and monitor the meta/LOG for a decrease in "Stalling writes." That change is far more effective than any thread-tuning would be for this specific "high-frequency commit" problem.
References
• administration/management/BE_configuration.md
• best_practices/primarykey_table.md
• administration/management/BE_configuration.md
References
• administration/management/BE_configuration.mdFrancisco Silva
06/22/2026, 1:26 PMRocky
06/22/2026, 1:31 PMCOMMIT, StarRocks must create a new metadata entry. For Primary Key tables, this includes an EditVersion and a Delete Vector (DelVec).
* The 95GB Bloat: If you commit every 1 second, you generate 86,400 "versions" per day per tablet. Even if you only updated 1 row, StarRocks has to track that this row is now "deleted" in its original segment and "active" in the new one.
* The Compaction Bottleneck: While the server can compact these versions, compaction is an I/O-intensive process that physically rewrites metadata to merge it. When the Write Rate (1 commit/sec) exceeds the Compaction Rate, the "stale" metadata keys pile up in the internal RocksDB. The 95GB you see is effectively the "trash" that hasn't been hauled away yet.
2. Server-Side Knobs to Mitigate Meta Growth
If you cannot change the writer easily, you can tune StarRocks to be more aggressive in cleaning up, but be aware this trades CPU/IO for Disk Space.
A. Force Faster Metadata Cleanup (BE Config)
* update_compaction_per_tablet_min_interval_seconds: (Default: 120). This is the "sleep timer" between compaction runs for a PK tablet.
_ _Tweak:* Lower this to 60 or 30. This tells the BE to check for "trash" versions more frequently.
* tablet_max_versions: (Default: 1000).
_ _Tweak:* Lower this to 500. This forces the system to trigger "cumulative compaction" sooner to merge rowsets and expire old DelVecs.
B. Offload Metadata (Table Property)
* enable_persistent_index: (Default: true in recent versions).
_ _Check:* Ensure your tables have this set to true. If false, the Primary Key index is kept in memory and frequently flushed to the core meta/ RocksDB. With it true, the index is stored in its own specialized disk structure, significantly reducing the "noise" in the general meta/ store.
C. Server-Side "Group Commit" (v4.0.x feature)
StarRocks has introduced a Group Commit feature (specifically lake_enable_batch_publish_version for shared-data, and internal optimizations for shared-nothing) designed to coalesce multiple small transactions.
* However, for Stream Load (which the Kafka Sink uses), StarRocks still considers each HTTP request a discrete transaction. True server-side "transparent batching" of separate HTTP requests into one rowset is a feature currently being refined in newer 4.x sub-versions.
3. Why batching on the writer is still "Best Practice"
Even with the knobs above, writer-side batching is superior because:
1. RPC Overhead: 100 commits/sec means 100 sets of network handshakes between the Connector, the FE (Leader), and the BEs.
2. Lock Contention: Each "Publish Version" phase takes a short lock on the tablet metadata. High-frequency commits lead to "lock queuing," which eventually slows down queries.
3. The "Boot" Time: As you've seen, your 20-minute boot is caused by the BE having to scan through the version history. No matter how fast you compact, a 1-second commit interval will always create a "longer tail" of versions than a 15-second interval.
Summary Recommendation:
Stick with your 15s-30s flush interval. It is the single most effective way to keep the meta/ folder size stable at ~3GB and keep your BE boot times under 1 minute. The server-side knobs (update_compaction_...) should be treated as "secondary help" rather than the primary solution.
ReferencesRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMRocky
06/22/2026, 1:31 PMFrancisco Silva
06/22/2026, 2:07 PMRocky
06/22/2026, 2:12 PMenable_persistent_index is already enabled, the bloat you are seeing in the meta/ directory is purely Version Churn (the accumulation of millions of small EditVersion and Delete Vector keys in the internal RocksDB).
It might feel "strange" to solve this on the writer side, but here is the technical reality of StarRocks metadata and the server-side options you can use instead.
1. Why Writer-Side Batching is "Standard"
In StarRocks, every COMMIT is an atomic, immutable version change.
* The Problem: If you commit once per second, you are asking the server to create, index, and eventually compact 86,400 metadata versions per table per day.
* The Cost: Compaction is asynchronous. When you commit faster than the background RocksDB can physically merge the keys, the meta/ store expands.
* The Advantage: Batching at the connector (e.g., 15s) doesn't just reduce disk bloat; it significantly reduces FE CPU usage (transaction management) and BE RPC overhead, improving overall cluster stability.
──────────
2. The Server-Side Alternative: "Merge Commit"
If you want the server to handle the batching so your connector can keep sending 1s flushes, you can use the Merge Commit feature (introduced in v3.4.0). This coalesces multiple small Stream Load requests into a single transaction on the server side.
In your Kafka Sink connector config, you can pass these parameters via `sink.properties`:
json
"sink.properties.enable_merge_commit": "true",
"sink.properties.merge_commit_interval_ms": "15000",
"sink.properties.merge_commit_async": "true"
* How it works: The BE receives the 1s small loads, holds them in a buffer, and only performs the "Apply" (metadata update) once every 15 seconds.
* Result: You get the same metadata efficiency as your manual 15s connector flush, but the connector logic remains simple.
──────────
3. BE Knobs to Force Aggressive Cleanup
If you must stick with high-frequency commits, you can tune the BE to be much more aggressive about compacting metadata and expiring old versions. These settings in be.conf specifically target the PK metadata store:
Parameter | Default | Recommended for CDC
update_compaction_per_tablet_min_interval_seconds | 120 | 30 (Checks for metadata "garbage" more often)
tablet_max_versions | 1000 | 300 - 500 (Forces compaction to merge versions sooner)
rocksdb_max_write_buffer_memory_bytes | 1GB | 2GB (Provides more memory for the internal meta-store to handle bursts)
──────────
4. Summary Recommendation
* Manual Batching (15s/30s): This is still the "best practice." It is the most robust way to prevent L0 stalls and ensure fast BE reboots.
* Merge Commit: Use this if you want to keep the connector code "dumb" but want the server to behave as if it's receiving 15s batches.
* Avoid 1s Flushes: Even with the best BE tuning, 1s commit frequency on 60 tables will eventually hit a wall where the background compaction thread can't physically move enough I/O to keep up with the metadata churn.
Your current 15s connector-side flush is exactly where you want to be for a fleet of this size. If the meta/ folder stays around 3GB and reboots stay under 1 minute, you have found your optimal configuration.
References
• loading/StreamLoad.md
• loading/Flink-connector-starrocks.md
• best_practices/primarykey_table.md
• administration/management/BE_configuration.md
• administration/management/BE_configuration.md
• loading/Kafka-connector-starrocks.mdRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMRocky
06/22/2026, 2:12 PMFrancisco Silva
06/22/2026, 2:34 PMRocky
06/22/2026, 2:34 PMbe.conf.
Because you are dealing with Primary Key tables and metadata bloat, compaction is split into two parts: Data Compaction (merging rowsets) and Metadata Compaction (cleaning up old EditVersions and Delete Vectors).
Here are the knobs to make the process more aggressive:
1. Trigger Compaction More Often
These settings reduce the "wait time" between compaction checks and lower the threshold for how much "garbage" must accumulate before work starts.
* update_compaction_per_tablet_min_interval_seconds (Default: 120)
* Tune to: 30 or 60
_ _What it does:* Specifically for PK tables, this controls the minimum sleep time between metadata compaction runs for a single tablet. Lowering this ensures the BE checks for "stale" metadata versions much more frequently.
* cumulative_compaction_num_rowset_min (Default: 5)
* Tune to: 3
_ _What it does:* Triggers cumulative compaction as soon as this many small rowsets accumulate. Lowering this keeps the "version count" low.
* tablet_max_versions (Default: 1000)
* Tune to: 300 or 500
_ _What it does:* This is the "emergency brake." When a tablet exceeds this version count, the BE will prioritize compaction for it. Lowering it forces the system to stay "leaner."
2. Make Compaction Faster (Resource Allocation)
Once compaction is triggered, these settings control how much CPU and I/O the BE is allowed to use to finish the job.
* compact_threads (Default: 4)
* Tune to: 8 or 16 (Depending on your CPU cores)
_ _What it does:* Increases the number of concurrent compaction tasks the BE can run.
* max_compaction_concurrency (Default: -1, which scales with disks)
* Tune to: 16 or 32
_ _What it does:* Sets a hard limit on total compaction tasks.
* compaction_max_mbytes_per_second (Default: 256)
* Tune to: 512 or 1024
_ _What it does:* This is the I/O throughput cap for compaction. If you have fast NVMe SSDs, the default 256MB/s is often too slow to clear out 95GB of metadata quickly.
3. Handle Metadata Bursts
Since your problem is specifically meta/ folder growth:
* rocksdb_max_write_buffer_memory_bytes (Default: 1GB)
* Tune to: 2GB
_ _What it does:* Gives the internal RocksDB more RAM to buffer incoming metadata before it is forced to flush to disk. This helps prevent the "L0 Write Stalls" you saw in your logs.
──────────
How to apply and monitor
1. Apply via SQL (No restart needed for most):
You can test these settings live without restarting the BE:
sql
ADMIN SET FRONTEND CONFIG ("be_number_of_compaction_threads" = "16"); -- FE knob for global management
-- Note: Most be.conf changes require updating the file and restarting,
-- but you can use the BE HTTP API to change some live.
2. Monitor the "Compaction Score":
Check the StarRocks dashboard or use:
bash
curl <http://BE_IP:8040/metrics> | grep compaction_score
If the score is consistently high (e.g., > 100), compaction is still falling behind.
⚠️ A Warning on "Too Fast"
If you set these too aggressively:
1. CPU Usage: Your BE CPU will spike as it constantly rewrites files.
2. Disk Write Amplification: If you compact too often (e.g., merging 2 files into 1, then merging that 1 with another 1 immediately), you will wear out SSDs and consume significant Disk I/O, which can slow down your actual queries.
Recommendation: Start by lowering update_compaction_per_tablet_min_interval_seconds to 60 and increasing compaction_max_mbytes_per_second to 512. This targets your specific metadata bloat without over-taxing the hardware.
ReferencesRocky
06/22/2026, 2:34 PMFrancisco Silva
06/22/2026, 2:37 PMRocky
06/22/2026, 2:37 PMstarrocks_be_compaction_bytes_total is a cumulative counter that tracks the total amount of data (in bytes) that a Backend (BE) node has processed through compaction tasks since the process started.
Here is the breakdown of what this tells you and how it relates to your metadata growth issue:
1. What it covers
This metric aggregates data from the two main "background" compaction types:
* Cumulative Compaction: Merging several small, newly written rowsets (Level 0) into larger rowsets.
* Base Compaction: Merging large rowsets into the base data level to reduce the total number of versions.
2. How to use it for Tuning
By itself, a total byte count isn't very helpful. To see if your tuning is working, you should wrap it in a rate function (like irate or rate) in Grafana/Prometheus:
* Metric: irate(starrocks_be_compaction_bytes_total[5m])
* Insight: This gives you the current compaction throughput in bytes per second.
* Correlation: If you increase compaction_max_mbytes_per_second (which defaults to 256MB/s) and you see this rate climb, it means the BE is successfully using the extra headroom to clear the backlog faster.
3. Relation to Primary Key (PK) Tables
While compaction_bytes_total covers the physical rowset merging, Primary Key tables have a specialized compaction process for metadata called Update Compaction.
If your primary concern is the meta/ folder growth and BE boot times, you should also monitor these specific metrics:
* starrocks_be_update_compaction_task_byte_per_second: The actual speed of compaction specifically for Primary Key tables.
* starrocks_be_tablet_update_max_compaction_score: This is the "health" of your PK tablets. If this score is high (e.g., > 100), it means StarRocks is falling behind on merging versions, which leads directly to the 95GB metadata bloat you experienced.
Summary
If starrocks_be_compaction_bytes_total is rising steadily but your meta/ folder is still growing, it means you are compacting data successfully, but the metadata churn (Delete Vectors/EditVersions) is still being generated faster than the Update Compaction can clean it up. In that case, focus on the update_compaction_... settings mentioned previously.
References
• administration/management/monitoring/metrics.md
• administration/management/compaction.md
• best_practices/primarykey_table.md
References
• administration/management/monitoring/metrics.mdFrancisco Silva
06/22/2026, 2:39 PMRocky
06/22/2026, 2:39 PMrocksdb_, StarRocks exposes high-level metrics that track the compaction and health of this internal RocksDB store.
To track "RocksDB" (Persistent Index) compaction per BE node, use the following metrics:
1. Key Compaction Metrics
* update_compaction_outputs_total
* Description: Total number of Primary Key index compactions completed on the BE.
* Usage: Use irate(update_compaction_outputs_total[5m]) to see the current frequency of metadata compactions.
* pk_index_compaction_queue_count
* Description: The number of index compaction tasks currently waiting in the thread pool.
* Usage: If this number is consistently high, your BE is struggling to keep up with metadata churn, leading to meta/ directory bloat.
* update_compaction_duration_us (if available in your version)
* Description: Total time spent on Primary Key index compaction.
2. Disk & File Health (RocksDB SSTs)
Since RocksDB stores data in SST files, these metrics track their physical operation:
* pk_index_sst_write_error_total: Incremented if RocksDB fails to write a new SST file (often due to disk full or I/O errors).
* pk_index_sst_read_error_total: Incremented if RocksDB fails to read an existing SST file (potential disk corruption).
3. Monitoring via SQL
If you want to see the disk usage of the RocksDB-based index per table/tablet, you can query the internal metadata:
sql
SELECT
TABLE_NAME,
SUM(INDEX_DISK) / 1024 / 1024 / 1024 AS index_size_gb
FROM information_schema.be_tablets
GROUP BY TABLE_NAME;
_`INDEX_DISK` directly represents the size of the RocksDB files on disk._
4. Direct RocksDB Internal Stats
If you need deeper internal details (like RocksDB levels, memtable flushes, or specific stall reasons) that Prometheus doesn't capture, you can access the BE's internal status page directly:
* URL: http://<BE_IP>:<BE_HTTP_PORT>/mem_tracker?type=update
* What it shows: This page provides granular memory tracking for the update (Primary Key) module, which includes the RocksDB memtables and index caches.
Summary for Grafana
For a "RocksDB Health" dashboard, I recommend plotting:
1. Rate: irate(update_compaction_outputs_total[1m]) (Are we compacting?)
2. Backlog: pk_index_compaction_queue_count (Is there a backlog?)
3. Errors: sum(rate(pk_index_sst_write_error_total[1m])) (Is the disk healthy?)
References
• administration/management/monitoring/metrics.mdFrancisco Silva
06/22/2026, 2:59 PMRocky
06/22/2026, 2:59 PMmeta/ folder size is primarily driven by Primary Key metadata rather than basic tablet headers. If you are seeing multi-gigabyte growth, it is almost certainly due to Persistent Index and Delete Vector accumulation.
Here is the breakdown of the "math" for your sizing:
1. Persistent Index (The Largest Driver)
If enable_persistent_index is true (default), StarRocks stores the Primary Key index in a RocksDB instance inside the storage path.
* Formula: (Key_Size + 8 bytes) _ Row_Count _ 50% (compression)
* Math for 1,000 tablets:
* Assume 1,000 tablets total 500 million rows across all tables.
* Assume your Primary Key is a BIGINT (8 bytes).
_ (8 + 8) _ 500,000,000 * 0.5 = 4,000,000,000 bytes ≈ 4 GB.
2. Tablet Metadata (Headers)
Every tablet has a physical metadata file (TabletMeta) that tracks its rowsets and versions.
* Formula: Number_of_Tablets * Average_Header_Size
* Math for 1,000 tablets:
* A typical tablet header is 10 KB to 100 KB (larger if you have hundreds of rowsets).
_ 1,000 _ 50 KB = 50,000 KB ≈ 50 MB (Negligible).
3. Version History Bloat (EditVersions)
For Primary Key tables, every update or compaction creates an "EditVersion" in the metadata RocksDB.
* Formula: Number_of_Tablets _ Versions_per_Tablet _ Size_per_Version_Record
* Math for 1,000 tablets:
* StarRocks keeps up to tablet_max_versions (Default: 1000).
* Each record is approximately 200–500 bytes.
_ 1,000 tablets _ 1,000 versions * 500 bytes = 500,000,000 bytes ≈ 500 MB.
4. Delete Vectors (DelVector)
Delete Vectors track which rows in old segments are "deleted" by newer updates. They use Roaring Bitmaps.
* Formula: Extremely variable, but for estimation: Total_Rows * Delete_Ratio / 8 (bits to bytes)
* Math for 1,000 tablets:
* If you have 10% churn on 500M rows: 50,000,000 bits ≈ 6.25 MB.
* Crucial Note: Because StarRocks keeps 1,000 versions, it may store multiple historical Delete Vectors until compaction cleans them up. This can easily multiply to several GBs during heavy update bursts.
5. RocksDB Internal Overhead (Log & WAL)
The metadata engine itself requires space for Write-Ahead Logs (WAL) and SST file overhead.
* Config: rocksdb_max_write_buffer_memory_bytes (Default: 1 GB).
* Even with few tablets, RocksDB can occupy a baseline of 1–2 GB for its operation logs and manifest files.
──────────
Total Estimate Summary (for 1,000 Tablets / 500M Rows)
Component | Estimated Size
Persistent Index | ~4.0 GB
Tablet Headers | ~0.05 GB
Version History | ~0.5 GB
Delete Vectors | ~0.1 GB (Normal) to ~5 GB (Bloated)
RocksDB Logs/WAL | ~1.0 GB
BE Log Files | ~10.0 GB (rotated)
TOTAL | ~15.65 GB
Why your folder might reach 95GB:
If your meta/ folder is significantly larger than this math suggests, it means tablet_max_versions is being hit but Update Compaction is failing to keep up. This leaves thousands of "zombie" Delete Vectors and Index SST files on disk that haven't been garbage collected yet.
Recommendation
Check your compaction score:
bash
curl <http://BE_IP:8040/metrics> | grep tablet_update_max_compaction_score
If this is 100, the math above is being multiplied by the "backlog" of versions waiting to be merged. References • table_design/table_types/primary_key_table.md • best_practices/primarykey_table.md • administration/management/BE_configuration.md References • administration/management/monitoring/metrics.md
Rocky
06/22/2026, 2:59 PMFrancisco Silva
06/22/2026, 3:02 PMRocky
06/22/2026, 3:04 PMtablet_update_max_compaction_score) is more complex. It tracks the number of "EditVersions" and metadata churn. You can normalize how this score is calculated using the BE config update_compaction_size_threshold.
* Grouping: StarRocks groups rowsets by size. The compaction score is usually determined by the group with the highest number of files, not the total number of files in the tablet.
2. How to Interpret the Score
Score | Status | Impact
0 – 10 | Healthy | Compaction is keeping up with ingestion.
10 – 100 | Busy | The BE is actively compacting; queries might see slight latency increases.
100+ | Unhealthy | Shared-data: Triggers "Ingestion Slowdown" (commits are delayed to let compaction catch up). <br> Shared-nothing: Approaching the tablet_max_versions limit.
2000+ | Critical | Shared-data: System rejects new writes for that partition. <br> Shared-nothing: Usually hits tablet_max_versions (default 1000) and fails with "too many versions".
3. How to Check the Score
You can view the score via SQL or Prometheus:
* Prometheus Metric: starrocks_be_tablet_max_compaction_score (General) or starrocks_be_tablet_update_max_compaction_score (Primary Key).
* SQL (Shared-nothing):
sql
-- Check for tablets with the highest version count (proxy for score)
SHOW PROC '/statistic/unhealthy_tablets';
* SQL (Shared-data):
sql
-- Look for the MaxCS column
SELECT * FROM information_schema.partitions_meta ORDER BY Max_CS DESC;
4. Why it Matters
If your compaction score stays high, it means your BE nodes are failing to merge data as fast as you are writing it. To fix this, you generally need to:
1. Reduce load frequency: Increase the batch size of your imports.
2. Increase resources: Increase compact_threads or update_compaction_num_threads_per_disk in be.conf.
3. Check for I/O bottlenecks: Ensure your disks aren't at 100% utilization.
References
• administration/management/compaction.md
• administration/management/monitoring/metrics.md
• best_practices/primarykey_table.md
References
• administration/management/monitoring/metrics.md
• best_practices/primarykey_table.md
• administration/management/compaction.md
• administration/management/BE_configuration.mdFrancisco Silva
06/22/2026, 3:11 PMRocky
06/22/2026, 3:11 PMstarrocks_be_tablet_cumulative_max_compaction_score
* What it tracks: The "Front-line" compaction.
* Definition: It represents the highest number of small, newly-loaded rowsets waiting to be merged into a single larger rowset.
* Impact: A high cumulative score means you are loading data too frequently in small batches. This causes *Read Amplification*—queries become slow because they have to open and merge hundreds of small files on the fly.
* Action: If this is high, increase your load batch size or reduce the frequency of your stream loads.
2. starrocks_be_tablet_base_max_compaction_score
* What it tracks: The "Background" consolidation.
* Definition: It represents the backlog of large rowsets (already processed by cumulative compaction) waiting to be merged into the final "Base" data file.
* Impact: This is a heavy I/O operation. A high score here usually indicates that the BE node's disk I/O is saturated or that the node doesn't have enough background threads to handle the volume of data being moved into long-term storage.
* Action: Check disk I/O utilization and consider increasing base_compaction_num_threads_per_disk in be.conf.
3. starrocks_be_tablet_update_max_compaction_score
* What it tracks: Primary Key Table metadata health.
* Definition: This is unique to Primary Key tables. It tracks the backlog of "EditVersions" (the history of updates/deletes) and the Persistent Index files.
* Impact: A high update score means the metadata is bloated. For Primary Key tables, this is often the cause of the meta/ folder growth you asked about earlier. It affects the performance of UPSERT operations and can lead to massive disk consumption if the index isn't being compacted.
* Action: Increase update_compaction_num_threads_per_disk or check if the BE has enough CPU to perform the metadata merges.
──────────
Threshold Reference Table
Metric Value | Status | System Behavior
0 - 10 | Healthy | Normal operation.
10 - 100 | Warning | Compaction is falling behind ingestion.
100 - 500 | Unhealthy | Shared-data: Ingestion begins to "slow down" (throttling). <br> Shared-nothing: Queries will slow down significantly.
1000+ | Critical | Risk of "Too many versions" errors. Shared-data clusters may start rejecting writes entirely for affected partitions.
Summary Tip
* If Cumulative is high: You are loading too often.
* If Base is high: Your disks are too slow for the data volume.
* If Update is high: Your Primary Key tables are under heavy update stress.
References
• administration/management/compaction.md
• administration/management/monitoring/metrics.md
• best_practices/primarykey_table.md
References
• administration/management/monitoring/metrics.md
• administration/management/compaction.md
• sql-reference/information_schema/be_compactions.md
• knowledge/admin_and_operation/shared_data_compaction.mdFrancisco Silva
06/22/2026, 3:50 PMRocky
06/22/2026, 3:50 PMNumber_of_Filesets * pk_index_compaction_score_ratio (default ratio is 1.5).
* Size Normalization: You can tune update_compaction_size_threshold (default 256MB) to normalize the score. If a rowset is larger than this threshold, it contributes differently to the score, helping the system prioritize merging many small files over a few large ones.
2. Critical Thresholds & Impact
Monitoring this specific metric is vital because Primary Key tables do not just suffer from slow queries when the score is high; they will eventually stop accepting data.
Score | Status | Behavior in Shared-nothing | Behavior in Shared-data
< 10 | Healthy | Normal operation. | No compaction tasks are triggered.
100 | Warning | Queries become significantly slower. | Ingestion Slowdown: Transaction commits are delayed (throttled).
1000+ | Error | Fails with "too many versions". | Continues to throttle until it hits the upper bound.
2000+ | Critical | System is likely unresponsive to writes. | Ingestion Stop: Rejects all new import transactions.
3. How to Troubleshooting a High Score
If starrocks_be_tablet_update_max_compaction_score is consistently high, use the following levers:
A. Increase Compaction Resources
In your be.conf, increase the threads dedicated to Primary Key compaction:
properties
# Increase the number of concurrent compaction threads
update_compaction_num_threads_per_disk = 2 (Default: 1)
# Reduce the wait time between compaction rounds for a single tablet
update_compaction_per_tablet_min_interval_seconds = 60 (Default: 120)
B. Adjust Slowdown Thresholds (Shared-data only)
If your hardware can handle more unmerged versions without too much latency, you can relax the FE limits:
sql
ADMIN SET FRONTEND CONFIG ("lake_ingest_slowdown_threshold" = "200");
ADMIN SET FRONTEND CONFIG ("lake_compaction_score_upper_bound" = "5000");
C. Change Ingestion Patterns
If the score is rising, it usually means your load frequency is too high.
* Stream Load: Increase the amount of data per load and decrease the frequency (aim for once every 10–60 seconds rather than every 1 second).
* Routine Load: Increase max_routine_load_batch_size and routine_load_task_consume_second.
Summary Metric Comparison
* `tablet_cumulative_max_compaction_score`: Backlog of brand-new, small rowsets.
* `tablet_base_max_compaction_score`: Backlog of large rowsets merging into the base data.
* tablet_update_max_compaction_score: Backlog of Primary Key metadata and update versions (most critical for PK table health).
References
• administration/management/monitoring/metrics.md
• administration/management/compaction.md
• best_practices/primarykey_table.md
• administration/management/BE_configuration.md
)
References
• administration/management/BE_configuration.mdRocky
06/22/2026, 3:50 PMFrancisco Silva
06/22/2026, 3:56 PMRocky
06/22/2026, 3:56 PMfe/starrocks-meta)
This folder contains the catalog metadata (table schemas, partitions, user permissions) stored in Berkeley DB JE.
* Expected Size: For most production clusters, 100 GB of SSD/HDD is sufficient.
* Key Factors: The size depends on the total number of tablets, partitions, and the frequency of schema changes.
* Critical Note: Ensure you have at least 5 GB of free space; otherwise, the FE may fail to restart due to BDB JE safety checks.
* Reference Doc: Plan StarRocks cluster - FE Storage
2. BE Primary Key Metadata (storage/meta and Persistent Index)
If you are using Primary Key tables, your metadata footprint on the BE can be significant because of the Persistent Index and Delete Vectors.
A. Persistent Index Storage Formula
If enable_persistent_index is set to true (default), the index is stored on the BE's local disk. You can estimate its size with this formula:
Storage Size =_ _Note: 50% is the estimated compression ratio.* * Reference Doc: Primary Key Tables - Formula for storage space cost B. Tablet Metadata ((Primary Key Size in bytes + 8 bytes) _ Row Count _ 50%
storage/meta)
This folder on each BE contains the RocksDB-based metadata for tablets (e.g., EditVersions, Rowset metadata).
* Expected Size: Usually small (a few GBs), but it grows if the Compaction Score is high.
* Why it grows: If compaction cannot keep up with high-frequency updates, the "EditVersions" (history of updates) pile up in this directory.
* Management: Monitoring the starrocks_be_tablet_update_max_compaction_score metric (as discussed earlier) is the best way to predict if this folder will grow unexpectedly.
Summary of Useful Docs
1. Plan StarRocks Cluster: Best for initial FE/BE storage capacity planning.
2. Primary Key Table Best Practices: Best for calculating the specific overhead of Primary Key indexes.
3. BE Configuration - `bdbje_reserved_disk_size`: (For FE) Explains how to control how much disk space the metadata log cleaner reserves.
If your meta/ folder is currently much larger than these formulas suggest, it is almost certainly due to a backlog of EditVersions caused by high update frequency or slow compaction.
References
• administration/management/monitoring/metrics.md
• administration/management/BE_configuration.md
• best_practices/primarykey_table.md
• deployment/plan_cluster.md
• table_design/indexes/Bitmap_index.md
• table_design/table_types/primary_key_table.mdFrancisco Silva
06/23/2026, 10:58 AMRocky
06/23/2026, 10:58 AMmeta_tool.sh (specifically using --operation=get_meta) is a low-level utility used to inspect the local metadata stored in a Backend (BE) node's RocksDB.
To answer your question: No, it does not represent "live-only, non-compactable" data. Instead, it shows the current "active" version of the tablet, which may include a significant amount of data that is highly compactable.
1. What the output represents
When you run meta_tool --operation=get_meta, the tool dumps the Rowset Meta for a specific tablet. This includes:
* Active Rowsets: All rowsets that currently make up the tablet's data. If you have a high "Cumulative Compaction Score" (e.g., 500), meta_tool will list all 500 small rowsets. These are "live" (needed for queries), but they are absolutely compactable.
* Logical Size vs. Physical Size: The metadata includes fields like data_disk_size and index_disk_size. As noted in recent community bug reports (e.g., #65275), these values are sometimes logical estimates recorded at write-time and may not perfectly match the physical bytes on disk if compaction or compression has occurred.
2. Is anything "Stale" included?
Standard StarRocks metadata management handles two types of data:
* Active: Part of the current tablet version. This is what get_meta shows.
* Stale (Garbage): Rowsets that have already been merged into a newer, larger rowset but haven't been deleted from the disk yet by the garbage collector (GC).
* meta_tool --operation=get_meta for a specific tablet usually excludes these stale rowsets because they are no longer part of that tablet's "active" list.
3. Primary Key Tables (The "Update" Factor)
If you are looking at a Primary Key table:
* The meta_tool output will include metadata for the Persistent Index and EditVersions.
* If your tablet_update_max_compaction_score is high, the meta/ folder and the metadata reported by the tool will be "bloated" with historical update markers.
* This data is compactable via update_compaction. Once compacted, the metadata size reported by the tool will shrink because many old EditVersions are merged into a single state.
Summary
Data Type | Shown in get_meta? | Is it Compactable?
Active Rowsets (uncompacted) | Yes | Yes (Cumulative/Base compaction)
Active Rowsets (fully compacted) | Yes | No (until new data arrives)
Persistent Index / EditVersions | Yes | Yes (Update compaction)
Stale/Garbage Rowsets | No | N/A (Waiting for Delete/GC)
Conclusion: If you see a large size or a long list of rowsets in meta_tool, it is a sign that your data needs compaction, not that it is "live data only." High-score tablets will show many rowsets in this tool until compaction merges are completed."
References
• administration/management/BE_configuration.md
• best_practices/primarykey_table.md
• administration/management/compaction.md
• administration/management/monitoring/metrics.md
References
• sql-reference/sql-statements/cbo_stats/SHOW_META.md
• knowledge/admin_and_operation/shared_data_compaction.md