Apache Software Foundation logo

Skill

doris-debug-query

diagnose Apache Doris query performance

Covers Performance Monitoring Debugging

Description

Use for Apache Doris slow/hanging/timeout queries. Covers FE planner (Nereids timeout), BE Profile bottlenecks, and Exchange WaitForData / brpc E1008 on port 8060. Session vars: enable_profile, query_timeout, nereids_timeout_second.

SKILL.md

Query Troubleshooting

Causes

IDCauseEvidence
AClient timeout too smallquery_timeout vs Profile wall
BPlannerNereids cost too much time / nereids_timeout_second
CBE compute (scan/join/spill)Profile active ExecTime
DExchange / brpcWaitForData ≈ timeout; failed to send brpc when exchange; [E1008] on :8060

10 min

SET enable_profile = true;
-- reproduce
./scripts/doris-debug log-grep fe/log be/log --query-id "$QID" --pack planner
./scripts/doris-debug log-grep be/log --query-id "$QID" --pack exchange
./scripts/doris-debug audit-topk fe/log/fe.audit.log -k 20 --min-ms 5000

Planner mitigation (session only): SET disable_join_reorder=true; for fat ETL joins; fix stats with ANALYZE.

Cause C — BE compute (scan/join/spill)

When Profile shows high active ExecTime (not Wait*), route to doris-profile-reader for deep Profile analysis:

Skill routing: If doris-profile-reader is available, invoke it with the query's Profile to identify which operator (scan/join/agg/spill) dominates. Key indicators to pass:

  • ActiveTime per operator
  • RowsRead / ScanBytes for scan operators
  • SpillDataSize if disk spill occurred
  • JoinType + JoinRows for join operators

Without profile-reader, check directly:

# Get the Profile text
curl -s "http://$FE:8030/api/query_profile?query_id=$QID"

Key Profile counters for Cause C:

CounterMeaningThreshold
ScannerGetBlockTimeTime reading from storage> 50% of ExecTime → IO bound
SpillDataSizeData spilled to disk> 0 → memory pressure, check enable_spill
JoinProbeTimeHash join probe wall time> 30% → check join order / type
RowsRead / ScanBytesScan volume> 1B rows → check partition pruning

Profile interpretation: prefer active time over Wait*.

Cause D — Exchange / brpc

Code facts (apache/doris):

  1. Error text in be/src/exec/operator/exchange_sink_buffer.h.
  2. GET /api/reset_rpc_channel/{endpoints} clears brpc_internal_client_cache only (reset_rpc_channel_action.cpp).
  3. enable_brpc_connection_check (default false) → FragmentMgr::_check_brpc_available hand_shake; consecutive failures erase internal cache.
curl -s "http://$BE:8040/api/reset_rpc_channel/all"
# be.conf — restart for static DEFINE_Bool
enable_brpc_connection_check = true
brpc_connection_check_timeout_ms = 10000

Do not trust ICMP alone. Check priority_networks.

Source

  • SessionVariable.javaQUERY_TIMEOUT, NEREIDS_TIMEOUT_SECOND
  • Profile WaitForData — exchange source operator
  • exchange_sink_buffer.h, reset_rpc_channel_action.cpp, fragment_mgr.cpp

© 2026 YourAI.tools. Every skill from an identity-verified publisher.

Independent catalog. Not affiliated with, endorsed by, or sponsored by Anthropic or any listed publisher. All trademarks belong to their respective owners.