PoWA--PostgreSQL 负载分析工具
本文主要介绍 PG 的一个性能采集和分析工具 PoWA 的部署方法和使用特点,该工具利用 PG 的扩展插件实现,其性能诊断分析能力比较接近 ORACLE AWR 报表功能。
PoWA是PostgreSQL 9.4及以后更新版本的性能工具,允许从各种Stats Extensions收集、聚合和清除多个 PostgreSQL 实例的统计信息,全称为PostgreSQL工作负载分析器(PostgreSQL Workload Analyzer)。
PoWA组成部分如下:
除了pg_stat_statements、btree_gist、powa为必须的插件,PoWA还支持以下几个插件作为新能指标采集的扩展:
文档:https://powa.readthedocs.io/en/latest/
GitHub地址:https://github.com/powa-team
https://github.com/powa-team/powa-archivist
https://github.com/powa-team/powa-web
cpu, io消耗监控 https://github.com/powa-team/pg_stat_kcache
where条件过滤性统计 https://github.com/powa-team/pg_qualstats
官网提供了一个公网的例子,可以在线查看。
在生产环境中,我们要做的是竟可能避免单个PG的powa库中的数据量过大。但是我们又要存放一段时间的快照信息用于性能分析,这个类似于Oracle的AWR快照信息。
这个时候我们就需要专门创建一个单独的powa数据库用于存储各个pg采集过来的数据。所以生产环境中我们基本上采取的远程模式部署powa。
在每个 PG 实例里启用插件,在独立的服务器上部署采集程序 PoWA collector 和主程序 PoWA web。 上面架构图用到的插件简介如下:
pg_stat_statements
:记录指定 PG 实例上所有 SQL 的统计信息,具体数据在视图 pg_stat_statements
上。pg_qualstats
:采集 SQL 语句的 where
和 join
语句中的条件的统计信息。pg_stat_kcache
:采集主机系统指标的统计信息。pg_wait_sampling
:采集 SQL 语句的等待事件,并提供等待事件的汇总统计视图。pg_track_settings
:主要是跟踪实例的参数配置变化。官网提供了一个公网的例子,可以在线查看。
PoWA的不足之处就是采集账户权限比较大,且在配置的时候还是明文密码保存。所以需要控制好 PoWA web 和 PG 的访问安全。
存在如下风险或者影响:
那有什么措施杜绝这种风险呢?
建议如下:
图1 General Overview
点击放大
字段 | 中文解释 | 英文解释 |
---|---|---|
Queries per sec | 每秒执行查询的次数。 | Number of time the query has been executed,per second |
Runtime per sec | 每秒内执行查询的总耗时。 | Total duration of queries executed,per second |
Avg runtime | 查询的平均耗时。 | Average query duration |
字段 | 中文解释 | 英文解释 |
---|---|---|
Total shared buffers hit | 命中共享缓冲区的数据量。 | Amount of data found in shared buffers |
Total shared buffers miss | 未命中共享缓冲区的数据量。 | Amount of data found in OS cache or read from disk。 |
图2 Database Objects
点击放大
字段 | 中文解释 | 英文解释 |
---|---|---|
Index scans ratio | 索引扫描/序列扫描的比率。 | Ratio of index scan / seq scan |
Index scans | 每秒索引扫描次数。 | Number of index scan per second |
Sequential scans | 每秒顺序扫描次数。 | Number of sequential scan per second |
字段 | 中文解释 | 英文解释 |
---|---|---|
Tuples inserted | 每秒插入的行数。 | Number of tuples inserted per second |
Tuples updated | 每秒更新的行数。 | Number of tuples updated per second |
Tuples HOT updated | 每秒更新(HOT)的行数。 | Number of tuples HOT updated per second |
Tuples deleted | 每秒删除的行数。 | Number of tuples deleted per second |
字段 | 中文解释 | 英文解释 |
---|---|---|
# Vacuum | 每秒手动清理的次数。 | Number of vacuum per second |
# Autovacuum | 每秒自动清理的次数。 | Number of autovacuum per second |
# Analyze | 每秒手动分析的次数。 | Number of analyze per second |
# Autoanalyze | 每秒自动分析的次数。 | Number of autoanalyze per second |
图3 Details for all databases
点击放大
字段 | 注释 |
---|---|
Query | 执行的SQL。 |
(Execution) # | 执行该SQL次数。 |
(Execution) Time | 执行该SQL总时间。 |
(Execution) Avg time | 执行该SQL平均时间。 |
(I/O Time) Read | 读I/O等待时间。 |
(I/O Time) Write | 写I/O等待时间。 |
(Blocks) Read | 磁盘读页面数。 |
(Blocks) Hit | 共享缓冲区命中页面数。 |
(Blocks) Dirtied | 脏页面数。 |
(Blocks) Written | 磁盘写页面数。 |
(Temp blocks) Read | 磁盘读临时页面数。 |
(Temp blocks) Write | 磁盘写临时页面数。 |
General Overview
图1 General Overview性能指标
点击放大
字段 | 中文解释 | 英文解释 |
---|---|---|
Queries per sec | 每秒执行查询的次数。 | Number of time the query has been executed, per second |
Runtime per sec | 每秒执行的查询的总持续时间。 | Total duration of queries executed, per second |
Avg runtime | 平均查询时长。 | Average query duration |
字段 | 中文解释 | 英文解释 |
---|---|---|
Total hit | 在共享缓冲区中找到的数据量。 | Amount of data found in shared buffers |
Total read | 在操作系统缓存中找到或从磁盘读取的数据量。 | Amount of data found in OS cache or read from disk |
图2 Background Writer性能指标
点击放大
字段 | 中文解释 | 英文解释 |
---|---|---|
of requested checkpoints | 已执行的请求检查点数。 | Number of requested checkpoints that have been performed |
of scheduled checkpoints | 已执行的预定检查点数。 | Number of scheduled checkpoints that have been performed |
字段 | 中文解释 | 英文解释 |
---|---|---|
Buffers alloc | 分配的缓冲区数。 | Number of buffers allocated |
Sync time | 文件同步到磁盘的检查点处理部分所花费的总时间(单位 : 毫秒)。 | Total amount of time that has been spent in the portion of checkpoint processing where files are synchronized to disk, in milliseconds |
Write time | 在将文件写入磁盘的检查点处理部分中花费的总时间(单位 : 毫秒)。 | Total amount of time that has been spent in the portion of checkpoint processing where files are written to disk, in milliseconds |
字段 | 中文解释 | 英文解释 |
---|---|---|
Maxwritten clean | 后台编写器因写入过多缓冲区而停止清理扫描的次数。 | Number of times the background writer stopped a cleaning scan because it had written too many buffers |
Buffers clean | 后台写入器写入的缓冲区数。 | Number of buffers written by the background writer |
字段 | 中文解释 | 英文解释 |
---|---|---|
Buffers backend fsync | 后端必须执行自己的 fsync 调用的次数。 | Number of times a backend had to execute its own fsync call (normally the background writer handles those even when the backend does its own write) |
Buffers backend | 后端直接写入的缓冲区数。 | Number of buffers written directly by a backend |
图3 Database Objects性能指标
点击放大
字段 | 中文解释 | 英文解释 |
---|---|---|
Index scans ratio | 索引扫描/序列扫描的比率。 | Ratio of index scan / seq scan |
Index scans | 每秒索引扫描次数。 | Number of index scan per second |
Sequential scans | 每秒顺序扫描次数。 | Number of sequential scan per second |
字段 | 中文解释 | 英文解释 |
---|---|---|
Tuples inserted | 每秒插入的行数。 | Number of tuples inserted per second |
Tuples updated | 每秒更新的行数。 | Number of tuples updated per second |
Tuples HOT updated | 每秒更新(HOT)。 | Number of tuples HOT updated per second |
Tuples deleted | 每秒删除的行数。 | Number of tuples deleted per second |
字段 | 中文解释 | 英文解释 |
---|---|---|
# Vacuum | 每秒手动清理的次数。 | Number of vacuum per second |
# Autovacuum | 每秒自动清理的次数。 | Number of autovacuum per second |
# Analyze | 每秒手动分析的次数。 | Number of analyze per second |
# Autoanalyze | 每秒自动分析的次数。 | Number of autoanalyze per second |
图4 Details for all databases性能指标
点击放大
字段 | 注释 |
---|---|
Database | 数据库名称。 |
#Calls | 执行SQL总数。 |
Runtime | 执行SQL总耗时。 |
Avg runtime | 执行SQL平均耗时。 |
Blocks read | 磁盘读取的页面数。 |
Blocks hit | 共享缓冲区命中的页面数。 |
Blocks dirtied | 脏页数。 |
Blocks written | 磁盘写页面数。 |
Temp Blocks written | 磁盘写临时页面数。 |
I/O time | I/O等待时间。 |
如果要安装所有插件,命令汇总如下。其中 14 是 PG 版本号,需要根据实际情况修改。
-- Debian
cat > /etc/apt/sources.list <<"EOF"
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
EOF
apt-get update
-- Debian 11还需要添加该源
deb https://apt-archive.postgresql.org/pub/repos/apt stretch-pgdg main
apt install -y curl ca-certificates gnupg sudo wget lsb-release apt-utils dialog
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg >/dev/null
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
apt-get install -y postgresql-14-powa postgresql-14-pg-track-settings \
postgresql-14-pg-qualstats postgresql-14-pg-stat-kcache \
postgresql-14-hypopg postgresql-14-pg-wait-sampling
-- yum安装
yum install -y powa_14 powa_14-web pg_qualstats_14 pg_stat_kcache_14 hypopg_14
-- collector需要单独安装
然后创建数据库 powa
并在下面创建相应扩展
create database powa;
\c powa
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION btree_gist;
CREATE EXTENSION powa;
CREATE EXTENSION pg_qualstats;
CREATE EXTENSION pg_stat_kcache;
CREATE EXTENSION pg_wait_sampling;
CREATE EXTENSION pg_track_settings;
CREATE EXTENSION hypopg;
CREATE ROLE powa SUPERUSER LOGIN PASSWORD 'lhr' ;
修改配置文件 postgresql.conf
并重启 PG 实例。
show data_directory;
cat >> /var/lib/postgresql/data/postgresql.conf <<"EOF"
shared_preload_libraries = 'pg_stat_statements,powa,pg_qualstats,pg_stat_kcache,pg_wait_sampling'
# Add settings for extensions here
pg_stat_statements.max = 10000
track_io_timing = on
pg_qualstats.enabled = true
pg_qualstats.max = 10000
pg_qualstats.track_pg_catalog = false
pg_qualstats.resolve_oids = false
pg_qualstats.track_constants = true
pg_qualstats.sample_rate = 0.1
pg_wait_sampling.profile_period = 50
pg_wait_sampling.profile_pid = true
pg_wait_sampling.profile_queries = true
EOF
重启实例后,在数据库 powa
里再运行下面语句。
SELECT powa_kcache_register();
SELECT powa_wait_sampling_register();
SELECT powa_track_settings_register();
查看所有插件情况
powa=# \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+------------------------------------------------------------------------
btree_gist | 1.7 | public | support for indexing common datatypes in GiST
hypopg | 1.3.1 | public | Hypothetical indexes for PostgreSQL
pg_qualstats | 2.0.4 | public | An extension collecting statistics about quals
pg_stat_kcache | 2.2.1 | public | Kernel statistics gathering
pg_stat_statements | 1.10 | public | track planning and execution statistics of all SQL statements executed
pg_track_settings | 2.1.0 | public | Track settings changes
pg_wait_sampling | 1.1 | public | sampling based statistics of wait events
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
powa | 4.1.4 | public | PostgreSQL Workload Analyser-core
(9 rows)
powa=#
在需要监控的其它数据库中都执行如下的SQL:
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION btree_gist;
CREATE EXTENSION powa;
CREATE EXTENSION pg_qualstats;
CREATE EXTENSION pg_stat_kcache;
CREATE EXTENSION pg_wait_sampling;
CREATE EXTENSION pg_track_settings;
CREATE EXTENSION hypopg;
SELECT powa_kcache_register();
SELECT powa_wait_sampling_register();
SELECT powa_track_settings_register();
https://github.com/powa-team/powa-web
在 debian 系统上 ,powa-web 包跟 PG 版本无关。
apt-get install python-pip python-dev
apt-get -y install powa-web
pip3 install psycopg2
pip3 install powa-web
-- 编译安装
wget https://pypi.io/packages/source/p/powa-web/powa-web-4.1.3.tar.gz
tar -zxvf powa-web-4.1.3.tar.gz
cd powa-web-4.1.3
cp ./powa-web.conf-dist ./powa-web.conf
./powa-web
在 CentOS/Linux 系统上,powa-web 包跟 PG 版本有关。
yum install python-pip python-devel
yum -y install powa_14-web
sudo pip install powa-web
配置 PoWA web
cat > /etc/powa-web.conf <<"EOF"
servers={
'main': {
'host': '127.0.0.1',
'port': '5432',
'database': 'powa',
'username': 'powa',
'password': 'lhr',
'query': {'client_encoding': 'utf8'}
}
}
cookie_secret="SECRET_STRING"
port=8808
EOF
注意,监听端口是 8808 ,默认为8888
The following options are optional:
powa-web文件为一个python格式文件。Powa-web 将按以下顺序将其配置搜索为这些文件中的任何一个:
/etc/powa-web.conf
~/.config/powa-web.conf
~/.powa-web.conf
./powa-web.conf
启动 PoWA web
nohup powa-web 2>&1 1>/tmp/powa-web.log &
登录
网址:http://172.18.0.14:8808
用户名和密码就是元数据库 powa
的访问账号。
https://pypi.org/project/powa-collector/
https://files.pythonhosted.org/packages/47/cb/f29fd02912e37aedb11de8a2f36cd1825411009a396fa659ea05d26893a5/powa-collector-1.2.0.tar.gz
一个多线程python程序,它对在powa存储库数据库(在powa_servers表中)中配置的所有远程服务器执行快照收集。可以使用pip、RPM包或手动安装PoWA-collector。
安装方法
-- Debian
apt-get -y install python3 python3-psycopg2
apt-get -y install powa-collector
-- yum安装的是1.1.0,建议使用pip3安装
yum install powa-collector
mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
timeout = 6000
index-url = http://mirrors.aliyun.com/pypi/simple/
index-index-url = http://pypi.douban.com/simple/
[install]
trusted-host =
mirrors.aliyun.com
pypi.douban.com
EOF
pip3 install psycopg2
pip3 install powa-collector
-- 编译安装
wget https://pypi.io/packages/source/p/powa-collector/powa-collector-1.2.0.tar.gz
tar -zxvf powa-collector-1.2.0.tar.gz
cp ./powa-collector.conf-dist ./powa-collector.conf
./powa-collector
-- 配置
cat > /etc/powa-collector.conf <<"EOF"
{
"repository": {
"dsn": "postgresql://powa@127.0.0.1:5432/powa"
},
"debug": false
}
EOF
nohup powa-collector.py 2>&1 1>/tmp/powa-collector.log &
-- 或systemctl status powa-collector.service
/usr/bin/powa-collector
配置方法
通过调整配置文件使其能够连接到想要的PoWA存储库上。其配置文件为一个的JSON格式的文件。
Powa-collector 将按以下顺序将其配置搜索为以下文件之一:
/etc/powa-collector.conf
~/.config/powa-collector.conf
~/.powa-collector.conf
./powa-collector.conf
cat > /etc/powa-collector.conf <<"EOF"
{
"repository": {
"dsn": "postgresql://powa@127.0.0.1:5432/powa"
},
"debug": false
}
EOF
nohup powa-collector.py 2>&1 1>/tmp/powa-collector.log &
释义:
以下选项是可选的:
注:PoWA-collector 的配置中并没有密码的配置,所以powa-repository数据库的pg_hba.conf中需要配置对应的连接策略为trust免密连接。
-- 配置需要采集性能指标的实例信息
select powa_register_server(
hostname => '172.71.0.23',
alias => '172.71.0.23',
port => 5432,
username => 'postgres',
password => 'lhr',
frequency => 300,
retention => '30 day'::interval ,
extensions => '{pg_stat_statements,pg_qualstats,pg_stat_kcache,pg_wait_sampling,pg_track_settings}');
-- 查看当前采集指标信息实例的信息
select * from powa_servers;
powa=# select * from powa_servers;
id | hostname | alias | port | username | password | dbname | frequency | powa_coalesce | retention | allow_ui_connection | version
----+-------------+-------------+------+----------+----------+--------+-----------+---------------+-----------+---------------------+---------
0 | | <local> | 0 | | | | -1 | 100 | 00:00:00 | t |
1 | 172.71.0.23 | 172.71.0.23 | 5432 | postgres | lhr | powa | 300 | 100 | 1 day | t |
(2 rows)
powa=#
如果要增加扩展,方法如下:
SELECT powa_activate_extension(2, 'pg_track_settings');
若要删除:
SELECT powa_delete_and_purge_server(1);
修改:
SELECT powa_configure_server(7, '{"frequency": "30"}');
释义:
1、插件需要在每一个被监控的数据库上都要创建
2、安装可以直接参考汇总部分即可,PoWA web和collector部分只需要在repository库执行即可。
https://www.xmmup.com/pgxingnengcaijifenxigongjuzhipowajieshao.html
https://powa.readthedocs.io/en/latest/
https://powa.readthedocs.io/en/latest/quickstart.html
https://mp.weixin.qq.com/s/yla0G79pYRnZJ7cB-iI0lQ
https://pgfans.cn/a/1111
https://www.modb.pro/db/405306 https://www.modb.pro/db/452080
https://www.modb.pro/db/383587
https://support.huaweicloud.com/bestpractice-rds/rds_pg_0024.html