DataGrip等待长运行查询时CPU占用过高的原因及解决方法
结论
DataGrip在等待PostgreSQL长耗时查询返回、无任何操作的状态下持续高CPU占用不属于正常现象,部分场景与JDBC参数配置直接相关,也存在IDE版本缺陷、系统适配问题类的诱因,可按对应方案逐一排查修复。
常见诱因
- JDBC驱动默认配置不合理:PostgreSQL官方JDBC驱动默认不会采用流式拉取结果集,若查询预计返回结果量级较大,驱动会在等待服务端响应的过程中持续做结果集预解析、类型映射、内存结构初始化,哪怕还未拿到完整返回结果也会持续消耗CPU;若开启了高频预编译缓存、自动元数据全量拉取,会进一步抬升等待阶段的CPU占用。
- 2022.1.1版本固有缺陷:该版本存在查询执行阶段的后台空转bug,IDE会启动独立线程以1秒为间隔轮询查询状态,同时提前做结果表格UI预构建、文本高亮预计算;在OSX 11.x系统下,因为Java Metal渲染栈的适配问题,该预计算逻辑会出现无效循环,CPU占用可稳定达到20%以上,无操作时也不会下降。
- 连接心跳配置错误:若JDBC连接配置了过短的socket超时阈值、主动心跳间隔,驱动会在等待查询结果的过程中频繁发送探测包校验连接状态,造成无意义的CPU消耗。
修复方案
JDBC参数优化
打开DataGrip数据源配置页,选中对应PostgreSQL连接,进入「高级」配置tab,调整以下参数:
- 开启流式结果集拉取,在JDBC URL末尾追加参数:
defaultRowFetchSize=200,避免驱动提前预加载全量结果做预处理 - 降低元数据解析开销:设置
assumeMinServerVersion参数为你实际使用的PostgreSQL大版本(例如12、14),设置databaseMetadataCacheFields=2000,关闭驱动对全库元数据的实时拉取逻辑 - 调整连接探测规则:设置
socketTimeout=0(查询执行阶段不触发socket超时断开)、tcpKeepAlive=true,移除所有自定义的短间隔连接心跳配置
注意:不要在JDBC URL中添加
autosave=always参数,该参数会在查询执行全周期频繁持久化连接状态,额外抬升CPU占用
IDE配置调整
- 关闭结果预渲染:进入
设置 > 工具 > 数据库 > 数据编辑器,取消勾选查询执行过程中预加载结果并准备渲染选项 - 修复OSX渲染适配bug:点击顶部菜单栏
Help > Edit Custom VM Options,在打开的配置文件末尾新增一行-Dsun.java2d.metal=false,重启DataGrip即可关闭存在兼容问题的Metal渲染栈,改用稳定的OpenGL渲染逻辑 - 降低轮询频率:进入
设置 > 工具 > 数据库 > 连接监控,将执行中查询的状态轮询间隔从默认的1秒调整为10秒,消除高频轮询带来的CPU空转
版本兜底修复
若以上配置调整后问题仍存在,2022.1.1是2022大版本的早期迭代,存在多个数据库模块的CPU占用相关bug,可升级到2022.1.4之后的小版本,或2022.2及以上的正式稳定版,官方已在后续迭代中修复OSX系统下查询等待阶段的CPU空转问题。
内容的提问来源于stack exchange,提问作者Alexi Theodore
相关产品推荐
相关产品推荐

