Hacker News 中文摘要

RSS订阅

Postgres更优即时编译 -- Better JIT for Postgres

文章摘要

pg_jitter是一个为PostgreSQL数据库设计的JIT(即时编译)优化工具,旨在提升查询执行性能。该项目托管在GitHub上,由开发者vladich维护。

文章总结

GitHub 项目 pg_jitter:为 PostgreSQL 提供更优的 JIT 编译方案

项目简介

pg_jitter 是一个轻量级的 PostgreSQL JIT(即时)编译扩展,提供三种替代后端方案: 1. sljit - 超快速编译(微秒级) 2. AsmJit - 擅长宽表行处理 3. MIR - 高可移植性方案

项目地址:https://github.com/vladich/pg_jitter

核心优势

  • 编译速度:相比 PostgreSQL 默认的 LLVM 后端(毫秒级),pg_jitter 实现微秒级编译
  • 执行性能:在多数场景下超越 LLVM 的执行效率
  • 适用性:使 JIT 技术可应用于 OLTP 等轻量级查询场景

性能表现

| 后端 | 编译时间 | 典型加速效果 | 最佳场景 | |---------|---------------|--------------------|-------------------| | sljit | 10-100微秒 | 比解释器快5-25% | 通用场景 | | AsmJit | 数百微秒 | 宽表查询快达32% | 行变形操作 | | MIR | 数百微秒-毫秒 | 稳定提升 | 跨平台需求 | | LLVM | 数十-数百毫秒 | 多数场景较慢 | 复杂分析查询 |

技术特性

  • 零配置:通过 jit_provider 参数即可启用
  • 运行时切换后端(无需重启)
  • 支持 PostgreSQL 14-18
  • 两级函数优化体系
  • 无 LLVM 依赖
  • 支持预编译函数内联

快速入门

构建要求

  • PostgreSQL 14-18 开发头文件
  • CMake ≥ 3.16
  • C11/C++17 编译器
  • 需将依赖库置于同级目录

典型构建命令

```bash

构建所有后端

./build.sh

构建单个后端

./build.sh sljit

自定义PostgreSQL路径

./build.sh --pg-config /opt/pg17/bin/pg_config all ```

配置示例

```sql -- 使用特定后端 ALTER SYSTEM SET jitprovider = 'pgjitter_sljit';

-- 或使用元提供者实现运行时切换 ALTER SYSTEM SET jitprovider = 'pgjitter'; SET pg_jitter.backend = 'asmjit'; -- 实时切换 ```

架构设计

  • 表达式编译:实现 PostgreSQL 的 JitProviderCallbacks 接口
  • 两级优化
    • Tier 1:值类型操作直接编译为原生调用
    • Tier 2:引用类型操作通过 C 包装器调用
  • 内存管理:与 PostgreSQL 资源所有者系统集成
  • 版本兼容:单一代码库支持 PG14-18

当前状态

  • 测试状态:通过所有 PostgreSQL 回归测试
  • 稳定性:Beta 质量(尚缺大规模生产验证)
  • 许可证:Apache 2.0

项目资源

  • 基准测试脚本:tests/ 目录下
  • 多版本测试脚本:./tests/run_all_versions.sh
  • ARM/x86 性能报告:参见项目 bench 目录

评论总结

以下是评论内容的总结,平衡呈现不同观点并保留关键引用:

  1. 关于JIT编译性能的争议

    • 批评观点:LLVM-based JIT编译速度慢(数十到数百毫秒),可能仅适用于重型OLAP查询,且默认启用会导致性能不稳定。
      引用:"standard LLVM-based JIT is notoriously slow... massive slowdown in some queries" (eru, fabian2k)
    • 优化建议:提出预编译(AOT)或缓存JIT结果的可能性。
      引用:"good case for ahead of time compilation... caching your JIT results" (eru)
  2. 技术改进的设想

    • 用AI生成定制化编译器:
      引用:"point AI at this problem... synthesize a bespoke compiler" (asah)
    • 对预编译的呼吁:
      引用:"no reason for DB queries to not be precompiled" (sourcegrift)
  3. 适用场景的讨论

    • 质疑JIT在高并发短查询(OLTP)中的价值:
      引用:"tested under high concurrency... lots of short OLTP queries?" (swaminarayan)
    • 对CPU密集型查询的困惑:
      引用:"what sort of things... make them CPU bound?" (the_biot)
  4. 其他意见

    • 平台支持缺失:
      引用:"no windows version yet" (larodi)
    • 对JIT生态的惊讶:
      引用:"amazed to see... several generic JIT frameworks" (the_biot)

总结呈现了性能争议(4条)、技术设想(2条)、场景适用性(2条)和次要观点(2条),引用覆盖所有核心观点。