PG源码分析系列:Pglog性能测试分析

简介: title: PG源码分析系列一:Pglog性能测试分析 date: 2019-07-17 11:19:03 categories: - Postgresql - PgSource 这篇主要从现象出发,给出分析流程、结论。 1 相关参数 这两个参数打开后会增加大量的日志写入,一般生产环境上纠结的就是这两个参数了,其他日志参数使用的较少。 log_statement:有效值
title: PG源码分析系列一:Pglog性能测试分析
date: 2019-07-17 11:19:03
categories: 
- Postgresql
- PgSource

这篇主要从现象出发,给出分析流程、结论。

1 相关参数

这两个参数打开后会增加大量的日志写入,一般生产环境上纠结的就是这两个参数了,其他日志参数使用的较少。

  • log_statement:有效值是 none (off)、ddlmodall(所有语句),打开all后会记录大量日志

    14115 [local] postgres bench 2019-07-16 07:13:41 UTC 00000LOG:  execute P0_1: SELECT abalance FROM pgbench_accounts WHERE aid = $1;
    14115 [local] postgres bench 2019-07-16 07:13:41 UTC 00000DETAIL: parameters: $1 = '13660205'
  • log_duration:记录语句的持续时间

    14499 [local] postgres bench 2019-07-16 07:25:19 UTC 00000LOG:  execute P0_1: SELECT abalance FROM pgbench_accounts WHERE aid = $1;
    14499 [local] postgres bench 2019-07-16 07:25:19 UTC 00000DETAIL: parameters: $1 = '17685816'
    14499 [local] postgres bench 2019-07-16 07:25:19 UTC 00000LOG: duration: 0.055 ms

 

2 测试记录

  • 环境:64C(小规格上测不出来的,需要大并发引起log大量锁冲突)

  • 初始化:pgbench -i -s 200 bench

结果对比:

log_statement log_duration tps 下降%
none   166786.137539 0%
all off 141541.265184 15%
all on 96551.544436 42%

2.1 关闭审计日志

关闭审计日志,使用prepared协议,只做select尽量增加SQL执行数量,避免IO影响测试(IO一般都会是瓶颈)

alter system set logging_collector=on;
alter system set log_rotation_size='128MB';
alter system set log_statement='none';
select pg_reload_conf();

测试:tps = 166786.137539

pgbench -M prepared -c 64 -j 64 -P 1 -T 120 -r -v -S bench

transaction type: <builtin: select only>
scaling factor: 200
query mode: prepared
number of clients: 64
number of threads: 64
duration: 120 s
number of transactions actually processed: 20016075
latency average = 0.384 ms
latency stddev = 0.097 ms
tps = 166786.137539 (including connections establishing)
tps = 166823.430955 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
        0.002 \set aid random(1, 100000 * :scale)
        0.386 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

 

2.2 打开审计日志&关闭记录时间

alter system set logging_collector=on;
alter system set log_rotation_size='128MB';
alter system set log_statement='all';
alter system set log_duration='off';
select pg_reload_conf();

测试:tps = 141541.265184

pgbench -M prepared -c 64 -j 64 -P 1 -T 120 -r -v -S bench

transaction type: <builtin: select only>
scaling factor: 200
query mode: prepared
number of clients: 64
number of threads: 64
duration: 120 s
number of transactions actually processed: 16989391
latency average = 0.452 ms
latency stddev = 0.300 ms
tps = 141541.265184 (including connections establishing)
tps = 141568.228057 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
        0.002 \set aid random(1, 100000 * :scale)
        0.466 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

2.3 打开审计日志&打开记录时间

alter system set logging_collector=on;
alter system set log_rotation_size='128MB';
alter system set log_statement='all';
alter system set log_duration='on';
select pg_reload_conf();

测试:tps = 96551.544436

pgbench -M prepared -c 64 -j 64 -P 1 -T 120 -r -v -S bench

transaction type: <builtin: select only>
scaling factor: 200
query mode: prepared
number of clients: 64
number of threads: 64
duration: 120 s
number of transactions actually processed: 11589065
latency average = 0.662 ms
latency stddev = 3.185 ms
tps = 96551.544436 (including connections establishing)
tps = 96570.262659 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
        0.002 \set aid random(1, 100000 * :scale)
        0.708 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

3 PERF分析

3.1 两个日志参数打开

打开参数执行压测的同时开始perf收集5s数据

perf record -agv -- sleep 5

使用perf展示结果

perf report -v -n --showcpuutilization -g --stdio

使用gprof2dot处理数据图形化展示结果

perf script | c++filt | gprof2dot -f perf | dot -Tpng -o output.png

上半部分可以明显看到errfinish的占用率是比较高的,这个函数会刷审计日志,如果参数不打开的话这个函数占用时间非常少。继续看下这个函数为什么占用时间高:

直接看最后的部分

这里可以看到pipe_write函数在等mutex_lock,等锁占用了大量的时间(14%)。

完整的调用栈:

3.2 关闭日志时间参数

只打开log_statement='all'参数,为了是问题更明显,测试使用select 1增加日志的写入量!

pgbench -M prepared -c 64 -j 64 -P 1 -T 1200 -r -f ./s1.sql

对比一下select 1pgbench -S的效果

可以看到mutex锁竞争是明显的瓶颈。

select 1的完整调用栈

那么pipe的mutex锁是哪来的?pipe锁的机制是什么样的?下一篇继续分析。

 

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
3月前
|
人工智能 自然语言处理 安全
【AI 现况分析】AI 如何帮助开发者完成自动化测试
【1月更文挑战第27天】【AI 现况分析】AI 如何帮助开发者完成自动化测试
|
4月前
|
测试技术 API 容器
|
4月前
|
人工智能 缓存 并行计算
技术改变AI发展:Ada Lovelace架构解读及RTX 4090性能测试分析(系列三)
简介:随着人工智能(AI)的迅速发展,越来越多的应用需要巨大的GPU计算资源。Ada lovelace(后面简称Ada)是NVIDIA最新的图形处理器架构,随2022年9月20日发布的RTX 4090一起公布。
135349 10
技术改变AI发展:Ada Lovelace架构解读及RTX 4090性能测试分析(系列三)
|
2月前
|
计算机视觉
Google Earth Engine(GEE)——使用MODIS数据单点测试SG滤波和harmonics method 滤波的差异分析
Google Earth Engine(GEE)——使用MODIS数据单点测试SG滤波和harmonics method 滤波的差异分析
45 0
|
3月前
|
监控 数据可视化 Java
jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
51 1
|
1月前
|
jenkins 测试技术 持续交付
提升软件测试效率与准确性的策略分析
【2月更文挑战第28天】 在快速迭代的软件发展周期中,高效的测试流程是确保产品质量和用户满意度的关键。本文旨在探讨提高软件测试效率和准确性的策略,包括自动化测试工具的选择、测试用例的优化设计以及持续集成的实践。通过分析当前软件测试领域面临的挑战,提出了相应的解决方案,并通过案例分析来展示这些策略的实际应用效果。文章的目的是为软件测试工程师提供实用的指导和参考,帮助他们在保证测试质量的同时,缩短测试周期,降低成本。
38 1
|
7天前
|
Web App开发 前端开发 Java
框架分析(11)-测试框架
框架分析(11)-测试框架
|
30天前
|
测试技术 持续交付 UED
提升软件测试效率与准确性的策略分析
【2月更文挑战第29天】 随着软件开发周期的缩短和市场对质量要求的提高,传统的软件测试方法面临诸多挑战。本文针对如何提升软件测试的效率与准确性进行深入探讨,分析了自动化测试、持续集成、测试驱动开发(TDD)等现代测试策略的优势与实施要点。通过案例分析和数据对比,论证了这些策略在确保软件产品质量和加快上市速度方面的积极作用。
|
2月前
岩土工程监测振弦采集仪广泛应用于岩土工程中的土体动力特性的测试和分析
岩土工程监测振弦采集仪广泛应用于岩土工程中的土体动力特性的测试和分析。以下是一些岩土工程监测振弦采集仪的应用案例:
|
2月前
|
安全 测试技术
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?