您可以使用plprofiler插件对PolarDB PostgreSQL集群进行性能分析。

背景信息

您在使用Postgres服务端进行编程的时候,您会发现PostgreSQL的PL/PGSQL是黑盒环境,内部的任何问题都有可能造成性能瓶颈。常见异常情况如下:

  • 问题语句一开始执行速度很快,调用多次后速度变慢。
  • 随机出现的性能瓶颈问题。
  • 生产系统上出现了性能问题。

通常情况下,上述性能问题只能采取人工分析(分析Schema、统计信息、SQL语句)或断点(pldebugger)的形式进行排查,排查时间长且不直观、性能问题时隐时现(对于上述的第一个问题,甚至无法排查出原因),因此您需要有一个更好的排查方式,来帮助您找到性能的瓶颈。

plprofiler提供了一个简洁的PL/PGSQL的性能采集方式,用于发现PL/PGSQL的性能瓶颈,让您可以针对性地对函数、存储过程和Schema等性能进行优化。更多关于插件的信息,请参见plprofiler

准备工作

说明 以下操作示例仅适用于Linux系统和Mac OS系统。
  1. 从GitHub获取plprofiler源码。
  2. 导出变量环境。
    export PGHOST=<polardb_host>
    export PGPORT=<polardb_port>
    export PGUSER=<polardb_user>
    export PGPASSWORD=<polardb_password>
    export PGDATABASE=pgbench_plprofiler
    export PLPROFILER_PATH=<path-to-plprofiler>
    export USE_PGXS=1
    export PATH=<path-to-plprofiler>/bin:$PATH
    说明 请将示例中的连接串信息替换成真实连接串信息,如何查看连接地址请参见查看连接地址
  3. 进入到源码目录,安装客户端软件,操作示例如下。
    cd $PLPROFILER_PATH/python-plprofiler
    python setup.py install #sudo python setup.py install, or using 'pip install plprofiler'
  4. 登录PolarDB PostgreSQL数据库,创建数据库和插件,操作示例如下。
    > CREATE DATABASE pgbench_plprofiler;
    > \c pgbench_plprofiler
    > CREATE EXTENSION plprofiler;
  5. 准备用于测试的表、数据和函数。
    cd $PLPROFILER_PATH/examples
    bash prepdb.sh

性能分析

  1. 运行plprofiler命令进行性能分析,命令如下:
    plprofiler run --command "SELECT tpcb(1, 2, 3, -42)" --output tpcb-test1.html
    说明 其中tpcb-test1.html为输出的性能分析页面地址。
  2. 命令完成后会进入编辑界面,可以在当前界面编辑输出网页的标题、长宽、描述等信息,您无需修改直接退出即可。
    plprofiler-1
  3. 使用浏览器打开tpcb-test1.html,如下所示。
    plprofiler-2

    从上方火焰图中可以看出最影响性能的函数是tpcb_fetch_abalance,可以分析出是因为没有创建索引导致性能差。虽然tpcb_upd_accounts性能也很差,但是该函数可能是受到子函数的影响导致性能差,需要优化完子函数后再查看是否正常。

  4. 创建索引完成本次优化,示例如下。
    psql
    > CREATE INDEX pgbench_accounts_aid_idx ON pgbench_accounts (aid);
  5. 再次执行plprofiler命令进行性能分析,结果如下。
    plprofiler-3

    通过上图中的火焰图可以看出,tpcb_fetch_abalance不再是性能瓶颈。由于优化了tpcb_fetch_abalancetpcb_upd_accounts的执行时间也缩短了。

    如果符合期望,那么本次优化就到此为止;如果没有达到预期,您可以通过新的火焰图继续分析出性能瓶颈进行优化。