feat(perf): cap Java agent heap and large result memory across all db…#2253
feat(perf): cap Java agent heap and large result memory across all db…#2253lzero07 wants to merge 1 commit into
Conversation
6d7de43 to
67c903d
Compare
针对实际反馈(单个 DBX 会话 java agent 约 4.5GB、WebView 约 4.6GB)做最坏情况内存兜底,覆盖所有数据库类型(原生 + agent/JDBC),不依赖用户手动配置环境变量。 第一层 — Java agent 堆上限(所有 JDBC/agent 库): - agent_java_args 启动时强制注入 -Xmx(默认 512m),非法值回退默认 - JavaRuntimeConfig.max_heap 可配置,DriverStoreDialog 新增「最大堆内存」输入框,保存即 stop_daemons 重启 JVM - native/Go agent(oracle-go、xugu)走旁路,不受影响 第二层 — 后端结果集硬上限(所有类型): - enforce_result_limits 在 do_execute 全类型汇合点:行数 + 字节(64MB)双截断,防大 BLOB 行 - resolve_query_timeout 禁止 Some(0)(原为无限挂起),封顶 3600s - data_compare:20 万行预检 + 50 万行 fetch 上限,启用预留的 source_truncated/target_truncated - 导出 MAX_EXPORT_ROWS=100万 后端硬上限 第三层 — 前端大数据量兜底: - 结果缓存按 300MB 字节预算 + tab 数双上限淘汰(原只数 tab) - 大结果(50MB/10万行)主动 toast 告警 - page size 硬顶 10万→5万,导出默认开 row limit(10万) - QueryChart 加 5000 点采样 同步更新受新默认值影响的测试;附带修复 3 个预存的 Windows/locale 测试失败(startup_error #[cfg(unix)]、manifest 路径、ai.spec locale mock)。
67c903d to
5ddd02b
Compare
|
Thanks for the detailed PR! This touches a lot of core areas (agent JVM, result limits, frontend memory). I'll need some time to review it carefully before merging. Will get back to you soon. |
|
我认为是个不错的思路,有几个点探讨下:
|
t8y2
left a comment
There was a problem hiding this comment.
内存保护方向没问题,但目前有三个阻塞问题。
-
64MB 限制是在 Agent 已经读取并推进 ResultSet 游标后才由 Rust 裁剪的。比如一页请求 1000 行、每行约 100KB,Agent 会消费完整 1000 行,Rust 只返回约 640 行,但下一页会从第 1001 行继续,页尾约 360 行被永久跳过。这个问题也会让 Agent 流式导出的 CSV/XLSX 静默缺行。字节预算需要在 Agent 的逐行读取过程中执行,或者协议必须提供可恢复的 continuation,不能在游标推进后删除行。
-
enforce_result_limits()在完整QueryResult构建、Agent JSON 序列化和 Rust 反序列化之后才运行,因此无法限制峰值内存。超大 BLOB/TEXT 页仍可能先占用数百 MB,甚至让默认 512MB JVM 在返回结果前 OOM。建议参考现有 fetch size/max rows 机制,把字节/行限制下推到驱动读取或流式序列化过程,而不是返回后裁剪。 -
validate_max_heap()只校验“数字 + 单位”,会接受0m、1k等 JVM 无法启动的值。保存后又立即停止所有 daemon,用户会失去所有 Java Agent 连接。我本机验证java -Xmx0m -version和java -Xmx1k -version都直接启动失败。请解析并限制合理范围,最好先用当前 Java 验证参数可启动,再持久化并重启 Agent。
请补充大单元格游标分页、截断后的下一页、Agent 导出行完整性,以及最小/无效 JVM heap 参数的回归测试。
针对实际反馈(单个 DBX 会话 java agent 约 4.5GB、WebView 约 4.6GB)做最坏情况内存兜底,覆盖所有数据库类型(原生 + agent/JDBC),不依赖用户手动配置环境变量。
第一层 — Java agent 堆上限(所有 JDBC/agent 库):
第二层 — 后端结果集硬上限(所有类型):
第三层 — 前端大数据量兜底: