您可以使用plprofiler插件对PolarDB PostgreSQL版集群进行性能分析。
背景信息
您在使用Postgres服务端进行编程的时候,您会发现PostgreSQL的PL/PGSQL是黑盒环境,内部的任何问题都有可能造成性能瓶颈。常见异常情况如下:
- 问题语句一开始执行速度很快,调用多次后速度变慢。
- 随机出现的性能瓶颈问题。
- 生产系统上出现了性能问题。
通常情况下,上述性能问题只能采取人工分析(分析Schema、统计信息、SQL语句)或断点(pldebugger)的形式进行排查,排查时间长且不直观、性能问题时隐时现(对于上述的第一个问题,甚至无法排查出原因),因此您需要有一个更好的排查方式,来帮助您找到性能的瓶颈。
plprofiler提供了一个简洁的PL/PGSQL的性能采集方式,用于发现PL/PGSQL的性能瓶颈,让您可以针对性地对函数、存储过程和Schema等性能进行优化。更多关于插件的信息,请参见plprofiler。
准备工作
说明 以下操作示例仅适用于Linux系统和Mac OS系统。
- 从GitHub获取plprofiler源码。
- 导出变量环境。
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
说明 请将示例中的连接串信息替换成真实连接串信息,如何查看连接地址请参见查看或申请连接地址。 - 进入到源码目录,安装客户端软件,操作示例如下。
cd $PLPROFILER_PATH/python-plprofiler python setup.py install #sudo python setup.py install, or using 'pip install plprofiler'
- 登录PolarDB PostgreSQL版数据库,创建数据库和插件,操作示例如下。
> CREATE DATABASE pgbench_plprofiler; > \c pgbench_plprofiler > CREATE EXTENSION plprofiler;
- 准备用于测试的表、数据和函数。
cd $PLPROFILER_PATH/examples bash prepdb.sh
性能分析
- 运行plprofiler命令进行性能分析,命令如下:
plprofiler run --command "SELECT tpcb(1, 2, 3, -42)" --output tpcb-test1.html
说明 其中tpcb-test1.html为输出的性能分析页面地址。 - 命令完成后会进入编辑界面,可以在当前界面编辑输出网页的标题、长宽、描述等信息,您无需修改直接退出即可。
- 使用浏览器打开tpcb-test1.html,如下所示。
从上方火焰图中可以看出最影响性能的函数是
tpcb_fetch_abalance
,可以分析出是因为没有创建索引导致性能差。虽然tpcb_upd_accounts
性能也很差,但是该函数可能是受到子函数的影响导致性能差,需要优化完子函数后再查看是否正常。 - 创建索引完成本次优化,示例如下。
psql > CREATE INDEX pgbench_accounts_aid_idx ON pgbench_accounts (aid);
- 再次执行plprofiler命令进行性能分析,结果如下。
通过上图中的火焰图可以看出,
tpcb_fetch_abalance
不再是性能瓶颈。由于优化了tpcb_fetch_abalance
,tpcb_upd_accounts
的执行时间也缩短了。如果符合期望,那么本次优化就到此为止;如果没有达到预期,您可以通过新的火焰图继续分析出性能瓶颈进行优化。