Zurab Kiknavelidze
07/02/2026, 3:22 PMRocky
07/02/2026, 3:23 PMfslib_read_io_latency_count (and the related fslib_read_io_latency histogram) primarily measures the read latency of StarRocks native table data stored on object storage (like S3) in a shared-data (cloud-native) architecture.
Here is the breakdown of what it covers:
1. Native Data Segments (Primary Use)
In StarRocks' shared-data architecture, data is stored as segments on S3. The fslib (FileSystem Library) is part of the Starlet storage engine, which handles I/O for these native tables. This metric tracks the actual latency of the I/O calls to S3 when StarRocks reads these data segments for queries.
2. Is it for External Catalogs?
Usually, no.
* External Catalog queries (e.g., querying Iceberg, Hive, or Hudi on S3) typically use a different scanner path and different metrics, such as starrocks_be_files_scan_num_bytes_read or starrocks_be_files_scan_num_files_read.
* However, if you have Data Cache enabled for your external catalogs in a shared-data cluster, the reads that miss the cache and fetch data from S3 may be tracked via Starlet's I/O layer, but the primary metrics for external catalog performance are found under the be_files_scan or be_scan categories.
3. Is it just about Metadata?
No.
* Data vs. Meta: This metric is for data I/O. There is a separate metric called filesystem_meta_operations for metadata-related operations like directory listing or file creation on S3.
* StarRocks Metadata: The primary cluster metadata (table schemas, etc.) is managed by the Frontend (FE) and is not stored on S3 in a way that would be tracked by this BE/CN-level I/O metric. This metric might include reading low-level storage metadata (like segment footers) stored on S3, but its main volume comes from reading actual table data rows/columns.
Summary
* Target: Native StarRocks tables in Shared-data mode.
* Data Type: Actual data segments (and some segment-level metadata).
* External Catalogs: Generally not covered by this metric; look for starrocks_be_files_scan_* metrics for external data lake queries on external catalogs.
References
• administration/management/monitoring/metrics-shared-data.md
• administration/management/monitoring/metrics.mdZurab Kiknavelidze
07/02/2026, 3:27 PMRocky
07/02/2026, 3:28 PMfslib_read_io_latency) are prefixed with `fslib`; they are captured at this abstraction layer to measure the actual performance of the storage subsystem.
Summary Relationship
* Starlet is the module (the "what" and "where" of cloud storage).
* fslib is the I/O tool (the "how" of reading/writing those files).
When you see fslib_read_io_latency_count, you are looking at the number of read operations handled by this library, which typically corresponds to reading native StarRocks data segments from your remote object store.
References
• introduction/Architecture.md
• quick_start/shared-nothing.md
• administration/management/monitoring/metrics-shared-data.mdZurab Kiknavelidze
07/02/2026, 3:31 PMRocky
07/02/2026, 3:32 PMfslib_read_io_latency (Quantile/Average): This is the direct measure of how long it takes to read from S3.
_ _What to look for:* High P99 latency. S3 typically has a latency of 10-100ms. If you see spikes into the seconds, it indicates S3 throttling or network congestion.
* `fslib_cache_hit_ratio`: Since shared-data clusters use a local disk cache (Data Cache), S3 is only hit when there is a cache miss.
_ _What to look for:* A low hit ratio means most of your query latency is subject to S3's remote I/O speed.
* `fslib_read_iosize`:
_ _What to look for:* S3 performs better with larger read sizes. If your iosize is consistently very small (e.g., < 64KB), you may be suffering from "death by a thousand cuts" (high overhead per request).
* fslib_read_throughput & `fslib_read_iops`: Check if you are hitting the throughput limits of your network or the IOPS limits of your S3 bucket.
2. Query Profile Analysis
For a specific slow query, generate a profile (SET enable_profile = true;) and examine the OLAP_SCAN_NODE.
* DataCacheReadBytes vs. `DataCacheWriteBytes`:
* `DataCacheReadBytes`: Data read from local disk/memory cache.
* `DataCacheWriteBytes`: Data fetched from S3 and then written to cache.
* If DataCacheWriteBytes is high, the query is actively waiting on S3.
* `IOTaskWaitTime`: Time spent waiting in the thread pool queue before the I/O actually starts. High values suggest the BE/CN is overloaded with too many concurrent I/O requests.
* `ScanTime`: Total time spent in the scan operator. In shared-data mode, this is heavily influenced by the remote read latency.
3. Investigation Checklist
1. Check for S3 Throttling: If fslib_read_io_latency is high, check your S3 provider (e.g., AWS CloudWatch) for SlowDown errors or throttling. You may need to spread data across more prefixes.
2. Verify Data Cache Health: Use SHOW BACKEND\COMPUTE NODE to ensure the DataCache is Enable: true and that the disks assigned to the cache are not full or failing.
3. Network Bandwidth: Shared-data performance is often bound by the network throughput of the EC2/VM instances. Monitor the node-level network traffic to see if you are hitting the instance's bandwidth cap.
4. Warm-up: If this is a new cluster or new data, latency will be higher initially as the cache is cold. Use CACHE SELECT... to pre-warm the cache if necessary.
Summary of Metrics to Query in Prometheus:
promql
# P99 Latency for S3 Reads
histogram_quantile(0.99, sum by (le) (rate(starrocks_be_fslib_read_io_latency_bucket[5m])))
# Cache Hit Ratio
rate(starrocks_be_fslib_cache_hits_total[5m]) /
(rate(starrocks_be_fslib_cache_hits_total[5m]) + rate(starrocks_be_fslib_cache_misses_total[5m]))
References
• administration/management/monitoring/metrics-shared-data.md
• data_source/data_cache.md
• best_practices/query_tuning/query_profile_operator_metrics.md
References
• best_practices/query_tuning/query_profile_operator_metrics.md
• data_source/data_cache.mdZurab Kiknavelidze
07/02/2026, 3:33 PMRocky
07/02/2026, 3:33 PMfslib layer if Data Cache is enabled. Use these metrics to see raw S3 performance:
* starrocks_be_fslib_read_io_latency: This histogram measures the actual round-trip time for S3 read requests. If the P99 is high (e.g., >200ms), S3 is likely the bottleneck (check for S3 throttling or high network latency).
* starrocks_be_block_cache_hit_bytes vs. starrocks_be_block_cache_miss_bytes: For external catalogs, these metrics track whether the query is hitting the local disk cache or fetching from S3. High "miss" bytes directly translate to higher query latency due to S3 I/O.
* starrocks_be_fslib_read_iosize: S3 performance is significantly better with larger read sizes. If your average iosize is small (e.g., <128KB), latency will feel much higher due to S3's request overhead.
2. Query Profile Analysis
Run your query with SET enable_profile = true; and find the CONNECTOR_SCAN_OPERATOR (or HdfsScanNode) section. Key counters include:
* ScanTime: The total time spent in the scan operator.
* IOTaskExecTime: The actual time the threads spent performing I/O. If this is high, it confirms the storage backend (S3) is slow.
* IOTaskWaitTime: Time spent waiting in the thread pool queue. If this is high, your BE/CN nodes are likely saturated with too many concurrent I/O requests.
* DataCacheReadBytes: Bytes served from local disk/memory.
* DataCacheWriteBytes: Bytes fetched from S3 to be cached. If this matches your total read volume, you have a cold cache problem.
3. Iceberg-Specific Metadata Latency
If the "Planning" phase of your query is slow (before execution starts), the bottleneck might be fetching Iceberg metadata (manifest files) from S3:
* Check FE Metrics: Look at iceberg_metadata_cache_hit_ratio. StarRocks caches Iceberg metadata on the Frontend.
* Session Variables: Verify that enable_iceberg_metadata_cache is true.
* Metadata Tables: You can query <catalog>.<db>.<table>$files to see how many files are being scanned. If there are thousands of small files, S3 latency will be compounded.
4. Checklist for S3 Performance
* S3 Throttling: Look for 503 Slow Down errors in your S3 provider's logs. This happens if you have too many concurrent requests on a single S3 prefix.
* Instance Bandwidth: Check if your CN/BE nodes are hitting their network throughput limits (e.g., EC2 instance network caps).
* Data Layout: Latency is often a symptom of "too many small files." Use Iceberg's OPTIMIZE or compaction to merge small Parquet files into larger ones (~128MB–256MB).
References
• administration/management/monitoring/metrics-shared-data.md
• best_practices/query_tuning/query_profile_operator_metrics.md
• data_source/iceberg_catalog.md
• data_source/data_cache.md
References
• data_source/data_cache.md
• data_source/data_cache_troubleshooting.md
• administration/management/monitoring/metrics.mdRocky
07/02/2026, 3:33 PMRocky
07/02/2026, 3:33 PMfslib on native tablets) toward the Connector Scan and Data Cache layers.
Here is what you should look into:
1. Prometheus Metrics (BE/CN Nodes)
For external tables, StarRocks uses a different set of counters to track remote I/O and caching:
* starrocks_be_files_scan_num_bytes_read: The total volume of data read from S3 for external formats (Parquet/ORC).
* starrocks_be_block_cache_hit_bytes / block_cache_miss_bytes:
_ _Critical:* In StarRocks, these specific metrics are primarily used to track external table cache performance.
* If block_cache_miss_bytes is high, it means StarRocks is frequently fetching from S3 rather than the local Data Cache.
* starrocks_be_connector_scan_node_io_wait_time: Measures how long threads are waiting for I/O tasks to be scheduled/executed for external scans.
2. Query Profile (Most Detailed)
Run your query with SET enable_profile = true; and find the CONNECTOR_SCAN_NODE section. Look for these specific metrics:
* DataCacheWriteTimer: This is your most direct measure of S3 latency. It tracks the time taken to fetch data from S3 and write it into the local Data Cache.
_ _High values* here confirm S3 is the bottleneck.
* DataCacheWriteBytes: If this matches BytesRead, the cache is completely "cold," and every byte is being pulled from S3.
* IOTaskExecTime: The actual execution time of the I/O tasks. For external tables, this includes the network round-trip to S3.
* ScanTime: The total wall-clock time spent in the scan operator. Compare this to IOTaskExecTime to see if the delay is I/O-bound or CPU-bound (e.g., Parquet decompression).
3. Metadata Latency (FE Node)
Because Iceberg stores metadata (manifests, snapshots) on S3, the Frontend (FE) can also be a source of latency:
* iceberg_metadata_memory_cache_capacity: If this is too small, the FE will constantly reach out to S3 to read Iceberg manifest files, slowing down query planning.
* Query Profile - Analyzer / Optimizer: Check if the "Planner" phase takes a long time. If it's >500ms for Iceberg, the FE is likely struggling to fetch metadata from S3.
4. S3 Specifics
If the metrics confirm S3 is slow (DataCacheWriteTimer is high):
* Check File Sizes: Small Parquet files (e.g., <128MB) in your Iceberg table cause many small S3 GET requests, which have high overhead.
* S3 Throttling: Check AWS CloudWatch for 503 Slow Down errors. StarRocks' high concurrency can sometimes exceed S3's per-prefix request limits.
* Network Path: Ensure your BE/CN nodes are in the same region as the S3 bucket and have sufficient "Network Performance" (check EC2 instance types).
Summary: fslib vs. Connector Scan
While fslib is the underlying library, the Connector Scan metrics in the Query Profile and the Block Cache metrics in Prometheus are much more reliable indicators for Iceberg/Data Lake performance than the generic fslib_read_io_latency_count.
References
• administration/management/monitoring/metrics.md
• data_source/data_cache.md
• best_practices/query_tuning/query_profile_operator_metrics.md
• data_source/catalog/iceberg/iceberg_catalog.mdZurab Kiknavelidze
07/02/2026, 3:35 PMRocky
07/02/2026, 3:35 PMfslib read io_latency (quantile): This is the single most important chart. It shows the P99/P90 latency of reads from the storage backend (S3). If this is consistently high (>100ms), the bottleneck is S3 itself or the network.
* fslib read iosize (quantile): Check if your reads are too small. S3 performance degrades significantly if you are doing many small (e.g., <64KB) reads instead of larger ones.
* fslib read throughput: Check if you are hitting the network bandwidth limit of your CN/BE nodes.
* Section: FSLIB CACHE METRICS
* fslib cache hit ratio: If this is low, every query is being forced to go to S3. A high hit ratio (e.g., >90%) means latency should be low regardless of S3 speed.
* Section: S3 IO METRICS
* fslib s3 single/multi upload latency: Useful if you are investigating write (Iceberg Sink/Insert) latency.
2. BE Dashboard (Data Cache / Block Cache)
External catalog performance relies heavily on the Block Cache.
* Section: Data Cache
* Block Cache Hit/Miss Bytes: This chart specifically tracks bytes read from the local cache versus remote storage for external tables. Look for a high volume of miss_bytes during slow queries.
* DataCache Mem/Disk Used: Ensure the cache isn't "full" and constantly evicting data, which leads to "thrashing" and high S3 latency as data is repeatedly re-fetched.
3. FE Dashboard (Metadata Latency)
If the query planning is slow (the time before the first row starts moving), the bottleneck is likely the FE fetching Iceberg metadata from S3.
* Section: Iceberg Metrics (if available in your template version)
* Iceberg Metadata Cache Hit Ratio: High miss rates here mean the FE is waiting on S3 to read manifest files.
* iceberg_delete_duration: Specifically for Iceberg v2 tables with position deletes.
Summary Checklist for Latency:
1. Check fslib read io_latency (P99): Is S3 responding slowly?
2. Check `fslib cache hit ratio`: Are we missing the cache too often?
3. Check `fslib read iosize`: Are the files/reads too small for S3 to handle efficiently?
Note: If you are using the older shared-nothing architecture with external tables, look specifically for the "Connector Scan" or "External Scan" panels in the BE dashboard.
References
• administration/management/monitoring/metrics-shared-data.md
• using_starrocks/caching/block_cache.md
• data_source/data_cache_observe.md
• administration/management/monitoring/metrics.md
References
• administration/management/monitoring/metrics-shared-data.md
• deployment/shared_data/minio.md
• deployment/shared_data/gcs.md
• deployment/shared_data/azure.mdRocky
07/02/2026, 3:35 PMZurab Kiknavelidze
07/06/2026, 5:16 AMRocky
07/06/2026, 5:16 AMfslib_read_io_latency_count{fstype="s3"} is not increasing despite active S3 reads from an External Catalog (Iceberg/Delta Lake), it is usually due to one of the following reasons:
1. The Metric is Specific to Native Shared-Data Tables
In StarRocks, the fslib (Starlet) metrics are primarily designed to monitor the StarRocks Shared-Data (Cloud-native) storage volume.
* Native Shared-Data Tables: Use fslib to communicate with the S3 bucket defined in your storage_volume.
* External Catalogs: While they also read from S3, they often use a different internal I/O path (the Connector Scan path). Even if you are running a shared-data cluster, reads for Iceberg or Delta Lake tables typically do not increment the Starlet/fslib S3 counters because they are not part of the Starlet-managed internal data volume.
2. You should look at "Block Cache" or "Data Cache" Metrics
For External Catalogs, S3 read monitoring is moved to the Data Cache (also known as Block Cache) layer. Look for these metrics instead:
* starrocks_be_block_cache_miss_bytes: This increases when StarRocks has to go to S3 because the data wasn't in the local cache.
* starrocks_be_block_cache_read_request_total: The total number of requests to the cache system.
* starrocks_be_files_scan_num_bytes_read: The total bytes read from external storage (S3/HDFS).
3. Check the Query Profile (The Source of Truth)
To see exactly which metrics are being populated for your specific Iceberg/Delta Lake query, run:
sql
SET enable_profile = true;
-- Run your query
SHOW PROFILE FOR QUERY "your_query_id";
In the profile, look for the CONNECTOR_SCAN_NODE. You will find the following metrics which track S3 latency for external files:
* DataCacheWriteTimer: This is the time spent fetching data from S3 to fill the cache. If your fslib metrics are zero, this timer will tell you the actual S3 latency.
* ScanTime: Total time spent scanning.
* IOTaskExecTime: The actual execution time of the I/O tasks.
4. StarRocks Version (Unified Cache)
If you are on a version older than v3.4.0, the I/O paths for external catalogs and native tables were entirely separate.
* From v3.4.0 onwards, StarRocks introduced a Unified Data Cache. In this version, you might start seeing some overlap, but generally, the fstype="s3" label in fslib still refers specifically to the backend storage of the StarRocks cluster itself, not the arbitrary S3 buckets used by external Iceberg catalogs.
Recommendation:
Switch your Grafana investigation to the "Data Cache" or "External Scan" panels. If you are using the official templates:
1. Open the BE Dashboard.
2. Find the Data Cache section.
3. Look for Block Cache Hit/Miss and Read/Write Bytes.
4. If those are also zero, verify that you have enabled the cache for your catalog via PROPERTIES ("enable_remote_file_cache" = "true").
References
• administration/management/monitoring/metrics-shared-data.md
• using_starrocks/caching/block_cache.md
• data_source/data_cache.md
• best_practices/query_tuning/query_profile_operator_metrics.md
References
• using_starrocks/caching/block_cache.md
• data_source/data_cache.md
• administration/management/monitoring/metrics-shared-data.mdZurab Kiknavelidze
07/06/2026, 5:25 AMRocky
07/06/2026, 5:25 AMSHOW PROFILE FOR QUERY "id" is indeed deprecated or may not return the detailed information you need. The modern and recommended ways to capture the profile in the 3.x series are as follows:
1. Using get_query_profile (Best for raw text)
This is the most reliable way to get the full execution profile via SQL.
sql
-- 1. Enable profiling for the session
SET enable_profile = true;
-- 2. Execute your query
SELECT * FROM your_iceberg_table LIMIT 10;
-- 3. Get the Query ID of the last query
SELECT last_query_id();
-- Output example: 019b364f-10c4-704c-b79a-af2cc3a77b89
-- 4. Retrieve the profile (use \G if using the mysql command line)
SELECT get_query_profile('019b364f-10c4-704c-b79a-af2cc3a77b89')\G
2. Using ANALYZE PROFILE (Best for readability)
If you want a visualized, text-based summary that highlights bottlenecks (like S3 latency), use this command. It breaks down time spent per operator.
sql
-- Use the Query ID obtained from last_query_id() or SHOW PROFILELIST;
ANALYZE PROFILE FROM 'your_query_id';
3. Using EXPLAIN ANALYZE (One-step)
You can skip the query ID entirely by prefixing your query. This will execute the query and immediately return the analyzed profile.
sql
EXPLAIN ANALYZE SELECT * FROM your_iceberg_table LIMIT 10;
4. Via the FE Web UI (Easiest for navigation)
1. Go to http://<FE_IP>:<FE_HTTP_PORT> (default port is 8030).
2. Click on the Queries tab at the top.
3. Find your query in the list and click the link in the Profile column.
Why you should look at the "CONNECTOR_SCAN" node:
Since you are investigating S3 latency for external catalogs, search for CONNECTOR_SCAN_NODE in the profile output. Specifically, look for:
* DataCacheWriteTimer: The actual time spent waiting for S3 to respond and writing to local cache.
* ScanTime: The total time the scan operator was active.
* WaitPushDownV2Timer: If this is high, the system is waiting for Iceberg metadata/manifest processing.
If these metrics show high values while fslib metrics remain zero, it confirms the I/O is bypassing the Starlet internal volume layer (standard for external catalogs) and you should rely on the Data Cache/Block Cache metrics instead.
References
• best_practices/query_tuning/query_profile_overview.md
• best_practices/query_tuning/query_profile_text_based_analysis.md
• best_practices/query_tuning/query_planning.mdRocky
07/06/2026, 5:27 AMfslib_read_io_latency metrics are not increasing is that your query is hitting the local Data Cache (Block Cache) and not going to S3 at all.
Here is the evidence from your profile:
1. Microsecond Latency (Cache Hit)
Look at the Scan Detail for the `DELTA_LAKE_SCAN`:
* IO Task Exec Time: 573.576 µs (microseconds)
* IO Task Wait Time: 184.001 µs
An actual physical request to S3 typically takes between 20ms to 100ms per file. Seeing latency in the 0.5ms range is a definitive indicator that the data was served from the BE's local disk/memory cache.
2. Why the Metric isn't Increasing
The fslib_read_io_latency_count{fstype="s3"} metric only tracks physical network calls made by the Starlet library to the S3 API.
* If the data is found in the Data Cache (Block Cache), StarRocks bypasses the S3 storage layer entirely.
* The fslib metrics are used for the StarRocks "Shared-Data" native storage. For External Catalogs (like Delta Lake), StarRocks uses the Data Cache layer to manage remote file fragments.
Which Charts to Look Into for Latency Investigation?
Since your query is using the cache, you should stop looking at the Starlet/S3 metrics and focus on the Block Cache metrics in the BE Dashboard:
1. Data Cache: Read Bytes (Hit vs Miss):
* If hit_bytes is high and miss_bytes is zero, your latency is purely based on local disk/SSD speed.
* If miss_bytes starts increasing, that is when you will see query latency jump from 0.5ms to 100ms+.
2. Data Cache: Read Latency:
* This tracks the latency of the cache system itself (disk I/O on the BE nodes).
3. Data Cache: Write Bytes:
* This tracks data being pulled from S3 and written into the local cache. This is where you will see S3-related latency during the "cold" first run of a query.
Summary of your Profile Performance:
Your query is extremely healthy from an I/O perspective:
* Scheduling (14ms): This is your biggest bottleneck (80% of execution). For such a small query (2,006 rows), the overhead of the FE planning and BE fragment scheduling is much larger than the actual data processing.
* Scan Time (1.2ms): The data was retrieved almost instantly from the cache.
To trigger the S3 metrics you were looking for:
Try running a query on a completely new Delta Lake table that hasn't been queried recently (to ensure a cache miss), or temporarily disable the cache for your session:
sql
SET enable_scan_block_cache = false;
Only then will you see the fslib or S3 metrics move.
References
• using_starrocks/caching/block_cache.md
• data_source/data_cache.md
• administration/management/monitoring/metrics.md
• best_practices/query_tuning/query_profile_operator_metrics.md
counters increase.Rocky
07/06/2026, 5:41 AMfslib_read_io_latency_count is not increasing—even with enable_scan_datacache = false and clear S3 I/O in your profile—is that StarRocks uses two completely different I/O libraries for native tables versus external catalogs.
1. fslib is for "Shared-Data" Native Tables ONLY
The metrics starting with fslib_ (FSLib/Starlet) are part of the Starlet storage library. This library is used exclusively for StarRocks' own Cloud-Native (Shared-Data) tables.
* It monitors the S3 bucket where StarRocks stores its own data files (the storage_volume).
* It does not hook into the I/O path used by External Catalogs (Iceberg, Delta Lake, HDFS).
2. The Iceberg I/O Path
In your profile, the node is ICEBERG_SCAN. For Iceberg, StarRocks uses a different internal framework (the Connector Scan path).
* Even though you disabled the datacache, the Connector uses its own S3/HDFS client.
* The latency you see in the profile as FS IO Time (158ms) is real, but it is reported to different metrics.
3. Which metrics should you look at for Iceberg?
For External Catalogs like Iceberg, you should monitor the "Files Scan" and "Connector" metrics instead of the FSLib ones.
Check these in Prometheus/Grafana:
* starrocks_be_files_scan_num_bytes_read: This is the equivalent of "read throughput" for Iceberg/Delta.
* starrocks_be_files_scan_num_files_read: The number of files fetched from S3.
* starrocks_be_connector_scan_node_total_timer: Total time spent in the scan nodes for external catalogs.
4. How to confirm S3 Latency for Iceberg
Currently, StarRocks does not provide a single global Prometheus metric for "S3 Latency" specifically for the Iceberg connector in the same way it does for fslib. To monitor this, you rely on the Query Profile you just generated:
* FS IO Time (158.661 ms): This is your actual S3 network latency.
* Shared IO Time (158.666 ms): This confirms the I/O was spent in the shared buffer layer of the external scan.
Summary
You are looking at the wrong dashboard. The "Starlet" or "Shared-Data" dashboards in Grafana will always be zero for Iceberg queries. You need to look at the "BE" dashboard, specifically the sections for "External Scan" or "Connector".
If you need to track S3 latency trends over time for Iceberg, we recommend monitoring starrocks_be_files_scan_num_bytes_read and checking for spikes in your overall query latency, or enabling the Audit Log which can record the ScanTime for each query.
References
• administration/management/monitoring/metrics-shared-data.md
• administration/management/monitoring/metrics.md
• data_source/catalog/iceberg/iceberg_catalog.md
References
• administration/management/monitoring/metrics.md
• data_source/feature-support-data-lake-analytics.md
• data_source/catalog/iceberg/iceberg_catalog.md
• administration/management/monitoring/metrics-shared-data.mdZurab Kiknavelidze
07/06/2026, 5:48 AMRocky
07/06/2026, 5:48 AMScan Time is not the precise S3 latency metric—it is a "top-level" bucket that includes several different operations. If you want to isolate S3 network performance, you need to look deeper into the Scan Breakdown.
Based on your profile, here is the breakdown of what is actually happening:
1. FS IO Time = The "Real" S3 Latency
In your profile, under the Input Stream section:
* FS IO Time (158.661 ms): This is the actual time the StarRocks BE spent waiting for the S3 API to return data. This is the metric you should track if you suspect S3 itself is slow.
2. Column Read Time = CPU Processing
* Column Read Time (228.555 ms): This is the time spent opening the Parquet files, reading the footers, and decoding the actual columns from the S3 data.
* Note that this is often higher than FS IO Time because StarRocks is doing CPU-intensive work (unzipping/decoding) while the data is streaming in.
3. Scan Time = The Operator Wall-Clock Time
* Scan Time (402.006 ms): This is the cumulative time the scan threads were active. It is effectively:
FS IO Time + Column Read Time + Buffer Management Overhead.
* In your case, Scan Time is roughly double your S3 latency because the BE spent a significant amount of time processing (decoding) the data it received from S3.
4. Why fslib is still zero
As mentioned previously, the fslib_read_io_latency metric in Prometheus is hard-wired to the Starlet library used for StarRocks' own internal storage (Cloud-native tables).
For Iceberg/External Catalogs, StarRocks uses a different I/O path. To monitor this via Prometheus instead of manual profiles, you should look for:
* starrocks_be_connector_scan_node_total_timer: Monitors the total time of external scans.
* starrocks_be_files_scan_num_bytes_read: Monitors the throughput of external scans.
Summary for your Investigation:
If you are trying to prove S3 is the bottleneck:
1. Look at FS IO Time in the profile.
2. If FS IO Time is low (e.g., < 200ms) but Scan Time is high (e.g., > 1s), the bottleneck is likely your BE CPU (decoding Parquet) or Disk I/O (if using cache), not S3 network latency to S3.
3. In your specific profile, S3 (158ms) and Parquet Decoding (228ms) are fairly balanced, which is healthy behavior for a query without a cache.
References
• best_practices/query_tuning/query_profile_operator_metrics.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/metrics-shared-data.md
References
• best_practices/query_tuning/query_profile_operator_metrics.md
• loading/loading_introduction/troubleshooting_loading.mdZurab Kiknavelidze
07/06/2026, 5:59 AMRocky
07/06/2026, 5:59 AMstarrocks_be_files_scan_num_bytes_read
* What it tells you: This is the equivalent of the "S3 Throughput" for your Iceberg/Delta queries. If this is high but your query is slow, S3 is delivering data, but your BE might be struggling to process it.
2. Where to find "Scan Latency"
In the same "Connector" or "BE - Storage" row:
* Panel Name: "Connector Scan Node Total Time".
* Metric used: starrocks_be_connector_scan_node_total_timer
* What it tells you: This is the cumulative time the BE spent on the scan operator. It correlates with the "Scan Time" you see in your query profile.
3. Why you can't find "FS IO Time" in the Dashboard
The metric FS IO Time (the 158ms in your profile) is currently not exported as a standalone Prometheus metric in the default templates for external catalogs.
* Because StarRocks uses a thread-pool-based asynchronous scanner for Iceberg/Delta, this fine-grained I/O wait time is captured in the Query Profile but is typically aggregated into the total scan time for Prometheus.
* To see the "Network Latency" trend for S3 without looking at profiles, you usually have to look at your Cloud Provider's S3 metrics (e.g., AWS CloudWatch for S3 TotalRequestLatency).
Summary of Dashboard Locations:
Information | Dashboard Section | Panel Name
S3 Data Volume | BE -> Connector | Connector Scan Bytes / Throughput
Scan Performance | BE -> Connector | Connector Scan Node Total Time
Cache Hits | BE -> Data Cache | Data Cache Read Bytes (Hit vs Miss)
Pro Tip: If your dashboard is missing the "Connector" row, ensure you are using the latest JSON template from the StarRocks GitHub or documentation, as these metrics were added in later 3.x versions.
References
• administration/management/monitoring/metrics.md