
如图BE节点内存分配为30G,be.conf配置如下,元数据和碎片过高导致查询sql经常受限,求解决思路,另外尝试过碎片清理和表合并的脚本,作用不大,脚本一并贴上。
物理内存上限(30 G 硬顶)
mem_limit=32212254720
soft_mem_limit_frac=0.9
===== 1. 查询层 =====
enable_query_memory_overcommit=false
max_query_instances_per_be=40
query_cache_max_size_mb=256
===== 2. 导入层 =====
load_process_max_memory_limit_percent=20
load_process_soft_mem_limit_percent=15
===== 3. Compaction 层 =====
3 GB = 3221225472 字节,3.0.6 必须纯数字
compaction_memory_bytes_limit=3221225472
vertical_compaction_max_row_source_memory_mb=2048
enable_compaction_pause_on_high_memory=true
===== 4. 缓存层 =====
storage_page_cache_limit=10
inverted_index_searcher_cache_limit=5
row_cache_mem_limit=0
===== 5. 读数据方式 =====
enable_mmap_read_buffer=true
disable_storage_page_cache=false
===== 6. 内存追踪 =====
enable_memory_tracker=true
mem_tracker_consume_min_size_bytes=1048576
===== 7. jemalloc 碎片治理 =====
je_dirty_decay_ms=1000
je_muzzy_decay_ms=1000
je_background_thread=true
===== 8. 必缺项 =====
enable_segment_cache=true
segment_cache_capacity=100000
#!/bin/bash
BE_PID=$(pgrep -f doris_be)
LOG=/tmp/ods_compact.log
echo "1. 碎片回收 ..."
gdb -n -q -batch -p $BE_PID
-ex "call (int)malloc_trim(0)"
-ex "detach" -ex "quit"
echo "2. 设置 je 持续回收 ..."
mysql -h127.1 -P9030 -uroot -e "
ADMIN SET FRONTEND CONFIG ('je_dirty_decay_ms' = '100');
ADMIN SET FRONTEND CONFIG ('je_muzzy_decay_ms' = '100');" >>$LOG 2>&1
echo "3. 生成全库 ODS 表清单 ..."
mysql -h127.1 -P9030 -uroot -N -e "
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'ods' AND TABLE_TYPE = 'BASE TABLE';" > /tmp/ods_tables.txt
echo "4. 全库合并(FORCE 绕过无分区报错) ..."
while read -r tbl; do
echo "[$(date '+%F %T')] 开始合并 ods.$tbl ..."
mysql -h127.1 -P9030 -uroot -e "ADMIN COMPACT TABLE ods.$tbl PARTITION (*) FORCE;" >>$LOG 2>&1
done < /tmp/ods_tables.txt
echo "5. 加快合并频率 + 清垃圾 ..."
mysql -h127.1 -P9030 -uroot -e "
ADMIN SET FRONTEND CONFIG ('cumulative_compaction_check_interval_seconds' = '10');
ADMIN CLEAN TRASH;" >>$LOG 2>&1
echo "6. 每 30 秒观察下降 ..."
for i in {1..30}; do
echo ===== $(date '+%F %T') =====
curl -s http://172.20.1.23:8040/memz |
awk '/UntrackedMemory|RowsetMetaMemBytes|PhysicalMemory/ {print strftime("%H:%M:%S"), $0}'
sleep 30
done