Mr Dk.
Mr Dk.
## CPU 是如何工作的? CPU 主频提升的根源是芯片制造工艺的提升,意味着更小的线间距离和信号延迟。另外,通过 **流水线** 的方式执行指令,可以让主频进一步提升。每条 CPU 指令需要一个或多个阶段才能被执行完毕,每个阶段需要做的工作较少,这样就可以提升 CPU 主频。 指令流水线的两大克星: - 如果一条指令依赖于前一条指令的执行结果,那么这条指令只能在稍晚些时候才能被推入流水线 - 在条件分支语句中,由于 CPU 不能立刻确定分支结果,因此必须要对分支结果进行预测,把预测为真的分支的指令推入流水线;如果预测错误,那么已经被推入流水线的指令需要被清空:流水线级数越长,越多条指令会被清空;在 DB 中,条件分支是依赖于具体的数据的,和选择率有关,无法预测 另外,超标量 CPU 具有多条指令流水线,能够并行执行多条无关指令。 大多数编程语言不要求开发者显式指定哪些语句是相互无关的,而是由编译器来进行优化,从而达到较好的 CPU 利用率。其中最重要的技术:loop pipelining。对 n 个无关元素的多个相关操作 `F()`...
## TPC-H Query 1 对 DBMS 中的 **表达式计算** 进行分析。 TPC-H 的 Query 1 是一个 CPU-bound 的查询,因为其执行计划非常简单,优化器没有什么优化的余地。Query 1 会扫描事实表,并选择出基本所有的元组,然后进行一些定点数计算: - 列与常数的减法 - 列与常数的加法 - 列与列的乘法 - 聚合 对于火山模型的执行器来说,一个扫描算子通常会有三个参数:`ScanSelect(R, b, P)`: -...
对于大型的数据中心应用,优化代码布局可以取得极大的性能提升。优化的时机可以有很多:  BOLT 是一个链接后优化技术,基于 sample-based profiling,对可执行文件的布局进行优化。由 Facebook 基于 LLVM 框架开发。目前已经正式合并到 LLVM 主体代码中。
BOLT 与 FDO(PGO)有何异同? 已有的实践证明,通过程序的真实负载信息反馈(Feedback)优化代码可以极大提升性能,这里最核心的问题是:如何采集程序的真实负载信息?最早期使用的是 instrumentation-based profiling:通过编译一个特殊的插桩程序版本,然后运行一段时间的负载,取得负载信息。由于插桩会引起极大的开销,导致: 1. 性能低到无法在生产环境中运行 2. 程序的行为可能与未插桩前有极大的区别 所以 FDO 技术的落地逐步演进为 sample-based profiling。通过 perf 等工具以较低的开销采样生产环境中的真实负载,然后将负载信息反馈给编译器/链接器进行优化。在采样过程中,通过使用 CPU 上的硬件计数器,提升采样信息的准确性。比如 Facebook 推出的 AutoFDO。 FDO 存在的技术问题:profiling 数据可以输入给编译/链接的各个阶段,但是 profiling 数据在形式上是可执行文件中的代码形式。因此,如果想要将 profiling 应用于编译/链接的早期阶段,就需要把 binary...
BOLT 基于 LLVM 框架来实现: 1. 可以借助 LLVM 框架的能力进行反汇编和可执行文件修改 2. LLVM 的模块化设计便于扩展 3. LLVM 支持多个目标架构,这样可以快速迭代到多种 CPU 平台上 BOLT 所做的具体优化:  在 sampling 时,需要尽量启用硬件上的计数器支持,以保证采样的准确性和信息的完整性,便于 BOLT 利用。 BOLT 最大的性能提升来自于 basic block 的 reordering...
@ericjest Sorry for the late response. Yes, you can deploy PolarDB without RDMA hardware. 1. If you just want to deploy only a primary computing node as a PostgreSQL plus,...
## Introduction FDO:使用代码的运行时行为来指引编译优化。性能提升数量级:10%~15%。在数据中心中,这个级别的性能提升能够省下数以千计的 CPU。然而,FDO 因为过程繁琐而很难投入实际使用。传统 FDO 的流程包含: 1. 在编译程序时插入采集代码 2. 使用具有代表性的负载,运行编译后的程序,产生 profile 3. 使用 profile 重新编译代码 基于以上步骤,FDO 较难铺开的原因: 1. 程序代码量大,并且性能攸关的代码位置通常会剧烈变化 2. 由于安全限制,保存和访问数据很困难 3. 插入 profiling 采集代码之后的程序运行会变得很慢,导致其运行时行为和未插桩前的程序迥然不同 基于这三个限制,想使用 real-world 的业务负载来进行 FDO...
# 4 Object Lock Optimization GP 如何优化数据库内的对象锁,并解决 *全局死锁* 问题。