Mysql 与 openGauss 性能视图比较

2023年 9月 27日 114.4k 0

1.简介

与 Mysql 的 Performance_schema 类似,openGauss 本身也提供类似的性能监控视图。但与 Mysql 也存在差异,本文就针对两者异同做个比较。

Mysql 的性能监控视图保存在 performance_schema schema 下,openGauss 主要保存在 dbe_perf schema 下。本人主要比较 statement,wait event 和 io 相关视图。

2.语句相关视图

Mysql 通过 performance_schema.events_statements_current 显示当前运行或者刚刚完成的语句,可以显示成功或者失败的语句。与此功能对应的 openGauss 视图是 pg_catalog.pg_stat_activity。但两者的统计信息还是有很多差异的,比如 Mysql 会记录语句执行报错信息,但 openGauss 当前版本(3.0.1)系统表并不显示该信息。

下面看一下两个系统显示信息的差别:

mysql> select * from performance_schema.events_statements_current\G
*************************** 1. row ***************************
THREAD_ID: 67
EVENT_ID: 3
END_EVENT_ID: NULL
EVENT_NAME: statement/sql/select
SOURCE: init_net_server_extension.cc:95
TIMER_START: 1832456036100746000
TIMER_END: 1832456036738383000
TIMER_WAIT: 637637000
LOCK_TIME: 3000000
SQL_TEXT: select * from performance_schema.events_statements_current
DIGEST: 91caf112a1e8c015485be7c90b3abc04f3aa12909461daf3d3c002cc88ed6f0f
DIGEST_TEXT: SELECT * FROM `performance_schema` . `events_statements_current`
CURRENT_SCHEMA: NULL
OBJECT_TYPE: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: NULL
MYSQL_ERRNO: 0
RETURNED_SQLSTATE: NULL
MESSAGE_TEXT: NULL
ERRORS: 0
WARNINGS: 0
ROWS_AFFECTED: 0
ROWS_SENT: 0
ROWS_EXAMINED: 0
CREATED_TMP_DISK_TABLES: 0
CREATED_TMP_TABLES: 0
SELECT_FULL_JOIN: 0
SELECT_FULL_RANGE_JOIN: 0
SELECT_RANGE: 0
SELECT_RANGE_CHECK: 0
SELECT_SCAN: 1
SORT_MERGE_PASSES: 0
SORT_RANGE: 0
SORT_ROWS: 0
SORT_SCAN: 0
NO_INDEX_USED: 1
NO_GOOD_INDEX_USED: 0
NESTING_EVENT_ID: NULL
NESTING_EVENT_TYPE: NULL
NESTING_EVENT_LEVEL: 0
STATEMENT_ID: 1090
CPU_TIME: 0
MAX_CONTROLLED_MEMORY: 0
MAX_TOTAL_MEMORY: 0
EXECUTION_ENGINE: PRIMARY
1 row in set (0.00 sec)

openGauss=# select *from pg_stat_activity;
-[ RECORD 1 ]----+----------------------------------------------------------------------------------------------------------------------------
datid | 15630
datname | postgres
pid | 140516278662912
sessionid | 140516278662912
usesysid | 10
usename | omm1
application_name | gsql
client_addr |
client_hostname |
client_port | -1
backend_start | 2023-04-26 06:50:29.843509+08
xact_start | 2023-04-26 06:50:41.311718+08
query_start | 2023-04-26 06:50:41.311718+08
state_change | 2023-04-26 06:50:41.311735+08
waiting | f
enqueue |
state | active
resource_pool | default_pool
query_id | 1688849860305527
query | select *from pg_stat_activity;
connection_info | {"driver_name":"libpq","driver_version":"(openGauss 3.1.1 build ) compiled at 2023-04-22 01:42:25 commit 0 last mr debug"}
unique_sql_id | 3800022352
trace_id |

在 pg_stat_activity 中,query_id 与 unique_sql_id 在语句执行完成后都会清零,只有在执行中的语句才能看到 query_id 与 unique_sql_id。

Mysql 中显示历史执行语句的视图是 performance_schema.events_statmements_history。列定义与 events_statements_current 相同。 而 openGauss 对应该功能的视图是 dbe_perf.statement_history。表定义与 pg_stat_activityc 差异较大。performance_schema.events_statements_history 表并不显示关闭进程的信息,而 openGauss 存储所有的信息,重启实例后也能查询到相关信息。需要配置相关参数,track_stmt_stat_level、track_stmt_parameter 等,另外特权用户(sysadmin 权限或者 monitor admin 权限)在系统库(postgres)中查询才能看到相关记录。两者虽然都记录历史信息,但 openGauss 历史表中不记录失败语句,只记录成功执行的语句,而 Mysql 也会保存执行失败语句。Mysql 通过配置参数( performance_schema_events_statements_history_size、 performance_schema_events_statements_history_long_size )可以控制保存记录的数量,超过配置参数后会替换更早执行的语句。

经过归一化处理后的语句,Mysql 保存在 performance_schema.events_statements_summary_by_digest 中,而 openGauss 保存在 dbe_perf.statement 中。openGauss 要求特权用户才可以查看,并且只记录执行正确的语句。

Mysql openGauss 对应系统表/视图 区别
events_statements_current 显示当前运行语句,每个进程一条,显示当前运行或刚刚完成的语句。 pg_catalog.pg_stat_activity 显示当前运行语句,每个进程一条,显示当前运行或刚刚完成的语句。 1、系统表不保存错误或警告相关信息 2、统计指标不尽相同
events_statements_history 每个线程最近结束的 N 条语句,不显示关闭线程 dbe_perf.statement_history 是记录数据库运行中产生的 sql 与其运行信息,保证即便数据库重启,SQL 信息也依然可以查询到。 需要打开相关配置参数: track_stmt_stat_level = 'L1,L0' track_stmt_parameter = on 需要在系统库查询 1、dbe_perf.statement_history,需要在系统库查询,若不删除记录,会显示关闭线程。需要打开相关 oG 相关参数。 2、oG 不记录执行失败语句。mysql 会记录失败语句。 3、oG 必须具有 sysadmin 权限或者 monitor admin 权限。mysql 不需要 4、统计指标不尽相同
events_statements_summary_by_digest 按照归一化语句对执行信息进行汇总 dbe_perf.statement 按照归一化语句对执行信息进行汇总 1、统计指标不尽相同 2、oG 必须具有 sysadmin 权限或者 monitor admin 权限,mysql 不需要 3、oG 只记录正确执行的语句,mysql 也存错误语句

3.等待事件相关视图

Mysql 查看当前正在执行的等待事件的系统表为 performance_schema.events_waits_current。对应的历史表为 events_waits_history 和 events_wait_history_long。记录已经执行完的等待事件历史。各种等待事件的统计保存在 events_waits_summary_global_by_event_name 中。

openGauss 查看当前等待事件的视图为 pg_catalog.pg_thread_wait_status。但 openGauss 没有保存等待事件历史。各种等待事件的统计信息保存在 dbe_perf.wait_events 中。

下面看一下两个系统显示信息的差别:

mysql> select * from performance_schema.events_waits_current\G
*************************** 1. row ***************************
THREAD_ID: 67
EVENT_ID: 61
END_EVENT_ID: NULL
EVENT_NAME: wait/lock/metadata/sql/mdl
SOURCE: mdl.cc:3429
TIMER_START: 1834596125174160296
TIMER_END: 1834601588671364336
TIMER_WAIT: 5463497204040
SPINS: NULL
OBJECT_SCHEMA: mysql
OBJECT_NAME: t1
INDEX_NAME: NULL
OBJECT_TYPE: TABLE
OBJECT_INSTANCE_BEGIN: 140237528633264
NESTING_EVENT_ID: 60
NESTING_EVENT_TYPE: STATEMENT
OPERATION: metadata lock
NUMBER_OF_BYTES: NULL
FLAGS: NULL
...

openGauss=# select *from pg_catalog.pg_thread_wait_status;
...
-[ RECORD 14 ]---+-----------------------
node_name | db1
db_name | postgres
thread_name | gsql
query_id | 1688849860305936
tid | 140516163778304
sessionid | 140516163778304
lwtid | 220949
psessionid |
tlevel | 0
smpid | 0
wait_status | acquire lock
wait_event | relation
locktag | 3d0e:58aa:0:0:0:0
lockmode | AccessExclusiveLock
block_sessionid | 140516278662912
global_sessionid | 0:0#0
...

Mysql openGauss 对应系统表/视图 区别
events_waits_current 显示当前等待事件,每个线程一条,显示当前的等待事件 pg_catalog.pg_thread_wait_status 检测当前实例中工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况 1、等待事件标识方式不同
events_waits_history 1、oG 不存储等待事件历史
events_waits_history_long 1、oG 不存储等待事件历史
events_waits_summary_global_by_event_name 列出所有等待时间的统计信息 dbe_perf.wait_events 列出所有等待时间的统计信息 1、等待事件标识方式不同

4.IO 相关视图

Mysql 通过 performance_schema.file_summary_by_instance 表统计文件 IO 事件,除了数据文件 IO,也包含日志文件,系统元信息文件等 IO 信息。openGauss 类似系统表为 dbe_perf.file_iostat,但他仅统计数据文件 IO。并且读写也没有分别统计。

下面看一下两个系统显示信息的差别:

mysql> select * from performance_schema.file_summary_by_instance

...

*************************** 76. row ***************************
FILE_NAME: /var/lib/mysql/mysql/slow_log.CSV
EVENT_NAME: wait/io/file/csv/data
OBJECT_INSTANCE_BEGIN: 140239856545536
COUNT_STAR: 3
SUM_TIMER_WAIT: 98207256
MIN_TIMER_WAIT: 32359920
AVG_TIMER_WAIT: 32735752
MAX_TIMER_WAIT: 33246744
COUNT_READ: 0
SUM_TIMER_READ: 0
MIN_TIMER_READ: 0
AVG_TIMER_READ: 0
MAX_TIMER_READ: 0
SUM_NUMBER_OF_BYTES_READ: 0
COUNT_WRITE: 0
SUM_TIMER_WRITE: 0
MIN_TIMER_WRITE: 0
AVG_TIMER_WRITE: 0
MAX_TIMER_WRITE: 0
SUM_NUMBER_OF_BYTES_WRITE: 0
COUNT_MISC: 3
SUM_TIMER_MISC: 98207256
MIN_TIMER_MISC: 32359920
AVG_TIMER_MISC: 32735752
MAX_TIMER_MISC: 33246744

...

openGauss=# select * from dbe_perf.file_iostat;
-[ RECORD 1 ]----
filenum | 15039
dbid |
spcid | 1664
phyrds | 2
phywrts | 0
phyblkrd | 2
phyblkwrt | 0
readtim | 62
writetim | 0
avgiotim | 31
lstiotim | 5
miniotim | 5
maxiowtm | 57

...

Mysql 可以按照 table 或 index 对 IO 事件进行分类统计,对应系统表为 table_io_waits_summary_by_table 和 table_io_waits_summary_by_index_usage。openGauss 没有单独的系统视图,但可以通过 filenum 与 pg_class 的 relfilenode 信息关联,然后按照表或者索引进行聚合查询分析。

Mysql openGauss 对应系统表 区别
file_summary_by_instance 按照文件名和 event_name 进行统计,包括等待时间,读、写、其他的 max,min,max,avg 等统计信息 dbe_perf.file_iostat 对数据文件 IO 的统计,反映数据的 IO 性能 1、oG 仅统计数据库文件,没有 event_name 概念 2、oG 仅统计读写相关信息,没有等待时间,其他,并且读写不分开
table_io_waits_summary_by_table 按照 table 对 io 进行统计,包括等待时间,读、写、其他的 max,min,max,avg 等统计信息 dbe_perf.file_iostat 对数据文件 IO 的统计,反映数据的 IO 性能 1、没有按照 table 进行汇总,但可以通过 relfilenode 连接后找到对应表
table_io_waits_summary_by_index_usage, 按照 table,index 对 IO 进行统计,包括等待时间,读、写、其他的 max,min,max,avg 等统计信息 dbe_perf.file_iostat 对数据文件 IO 的统计,反映数据的 IO 性能 1、没有按照 table,index 进行汇总,但可以通过 relfilenode 连接后找到对应索引及表

5.总结

从上面的分析可以看出 Mysql 的系统监控表与 openGauss 还是有挺大差别。Mysql 中用 X_current 查询事件当前状态,每个线程一条。执行完成后转存到 X_history 与 X_history_long 表。相关表定义类似。openGauss 中查询当前执行与执行历史的表并不对应。

另外两个系统开启相关记录的方式也不尽相同。Mysql 通过更新 performance_schema.setup_consumers 表,可以控制开启与关闭相关视图。更新后立即影响监控。

mysql> SELECT * FROM performance_schema.setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | YES |
| events_transactions_history | YES |
| events_transactions_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+----------------------------------+---------+

openGauss 则通过修改系统参数,且各个事件都不尽相同。

比如记录归一化语句的 dbe_perf.statement 的条件为:1 enable_resource_track 打开且 2 instr_unique_sql_count 大于 0.

记录语句执行历史的 dbe_perf.statement_history 的条件为:

1.打开了动态语句追踪功能:采用 dynamic_func_control 追踪 STMT。

2.track_stmt_stat_level 追踪第一个 level 为 L0 或者更高。

3.track_stmt_stat_level 追踪第二个 level 为 L0 或者更高,且语句运行时间大于 log_min_duration_statement 设定值,且 log_min_duration_statement 大于等于 0,并且没有打开 track_stmt_parameter

4.打开 track_stmt_parameter,并且时间模式第一个值(消耗的 DBTIME)大于 0。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论