温馨提示×

Linux Dolphin内存占用高怎么解决

小樊
43
2026-01-08 14:20:07
栏目: 智能运维

先确认所指的 Dolphin

  • 若你说的是DolphinDB(分布式时序数据库),请看第2节的“DolphinDB场景”处理。
  • 若你说的是DolphinScheduler(工作流调度平台),请看第3节的“DolphinScheduler场景”处理。

DolphinDB场景

  • 快速定位占用来源

    • 查看节点内存上限与许可证限制:
      • 配置上限:getConfig("maxMemSize")(单位字节)
      • 许可证上限:license().maxMemoryPerNode(单位GB)
      • 单次查询结果上限:getMemLimitOfQueryResult();必要时用 setMemLimitOfQueryResult(newLimit) 调整(谨慎)。
    • 查会话与对象占用:
      • 会话内存:getSessionMemoryStat();必要时 closeSessions(sessionIds) 结束异常会话。
      • 节点对象:pnodeRun(objs())pnodeRun(objs(true)) 查非共享/共享变量;用 undefundef("name", SHARED) 释放。
    • 查后台任务:getRecentJobs()getConsoleJobs();对异常长任务 cancelJob/cancelConsoleJob
    • 查引擎缓存:OLAP/TSDB 引擎缓存与索引占用较高时,可分别执行 flushOLAPCache()flushTSDBCache()invalidateLevelIndexCache() 释放。
    • 查是否触发系统 OOM Killer:dmesg -T | grep -i "out of memory\|kill process",若命中说明节点被系统杀死,需要下调内存上限或扩容。
    • 客户端侧(如 GUI/VS Code)执行 select * 容易把全分区数据拉到客户端内存,建议改为 select top 1000 * 或先 t=select ... 再取子集。
  • 立即可执行的缓解动作

    • 释放无用对象与缓存:
      • 释放变量:undef("v")v=NULL;释放共享表:undef("sharedTbl", SHARED)
      • 清理引擎缓存:clearAllCache()flushOLAPCache()flushTSDBCache()invalidateLevelIndexCache()
    • 终止异常会话/任务:closeSessions(...)cancelJob(...)
    • 降低单次查询内存峰值:避免 select *,只查需要的列,并尽量在 WHERE 中使用分区列前置过滤;必要时临时下调 setMemLimitOfQueryResult()
    • 控制流计算内存:适当降低发布/订阅队列容量(如 maxPubQueueDepthPerSite),避免瞬时堆积。
  • 配置与架构层面的优化

    • 合理设置 maxMemSize:通常设为物理内存的80%–90%;若许可证上限更低,则以许可证为准(如社区版常见上限为4GB)。
    • 分区设计:每个分区压缩前数据量建议100MB–1GB;查询务必带上分区过滤,减少扫描分区数与列数。
    • 避免超大分区:超大分区即使只查少量行,也可能因“按分区列加载”而把整分区多列读入内存;需重分区或改写查询。
    • 插件与外部组件:插件内存问题常体现在日志中(如 “[xx plugin], Out of memory”);更新插件或修正内存管理;GUI 端避免一次性拉全量数据。

DolphinScheduler场景

  • 现象与快速止血
    • WebUI 删除工作流实例失败、任务阻塞且内存飙高时,可临时登录后端数据库清理“僵尸”实例与定义(示例为 MySQL):
      • 删除运行中的任务实例(示例条件 command_type=9):
        • DELETE FROM t_ds_process_instance WHERE end_time IS NULL AND command_type = 9;
      • 删除某日期的工作流实例(示例日期 2021-06-23):
        • DELETE FROM t_ds_process_instance WHERE DATE_FORMAT(start_time, "%Y-%m-%d") = '2021-06-23' AND state = 1;
      • 删除某日期的工作流定义:
        • DELETE FROM t_ds_process_definition WHERE DATE_FORMAT(create_time, "%Y-%m-%d") = '2021-06-23';
    • 操作前务必做好备份变更窗口,并在测试环境验证 SQL 条件,避免误删。

通用 Linux 层面的排查与临时缓解

  • 观察与定位
    • top/htop 按内存排序(键入 M),识别占用最高的进程;用 free -h 查看整体内存与缓存;vmstat 1 观察内存与换页;dmesg -T | grep -i "oom\|kill" 检查是否被 OOM Killer 终止。
  • 非数据库缓存的释放(谨慎,仅用于临时缓解)
    • 写入 1/2/3/proc/sys/vm/drop_caches 可分别清理 pagecache、dentries/inodes、或三者全部;此操作会影响系统缓存命中率,生产慎用。
  • 其他通用手段
    • 关闭不必要的服务/进程,释放系统内存;结合业务调优 swappiness、I/O 调度器等系统参数,减轻内存压力。

0