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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
性能测试 PTS,5000VUM额度
简介: 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进行规格选择与性能压测。
目录
相关文章
|
10天前
|
缓存 监控 算法
软件测试中的性能瓶颈分析与优化策略
【10月更文挑战第6天】 性能测试是确保软件系统在高负载条件下稳定运行的重要手段。本文将深入探讨性能测试的常见瓶颈,包括硬件资源、网络延迟和代码效率等问题。通过具体案例分析,我们将展示如何识别并解决这些问题,从而提升软件的整体性能。最后,文章还将分享一些实用的性能优化技巧,帮助读者在日常开发和测试中更好地应对性能挑战。
45 3
|
29天前
|
监控 测试技术 持续交付
软件测试中的性能瓶颈分析与优化策略
性能瓶颈,如同潜伏于软件深处的隐形障碍,悄然阻碍着系统的流畅运行。本文旨在揭示这些瓶颈的形成机理,剖析其背后的复杂成因,并汇聚一系列针对性的优化策略,为软件开发者提供一套系统性的解决方案。
43 5
|
15天前
|
缓存 监控 测试技术
软件测试中的性能瓶颈分析与优化策略
本文深入探讨了在软件测试过程中,如何有效地识别和解决性能瓶颈问题。通过对性能瓶颈的定义、分类以及常见原因的分析,结合实际案例,提出了一系列针对性的优化策略和方法。这些策略旨在帮助测试人员和开发人员提高软件的性能表现,确保软件在高负载条件下依然能够稳定运行。
|
1月前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
62 1
|
1月前
|
监控 算法 测试技术
软件测试中的性能瓶颈分析与优化策略
本文旨在深入探讨软件测试过程中性能瓶颈的识别与优化方法。通过对性能瓶颈的概念、分类及其成因进行分析,结合实际案例,提出一套系统的性能瓶颈诊断流程和针对性的优化策略。文章首先概述了性能瓶颈的基本特征,随后详细介绍了内存泄漏、资源竞争、算法效率低下等常见瓶颈类型,并阐述了如何通过代码审查、性能监测工具以及负载测试等手段有效定位问题。最后,结合最佳实践,讨论了代码级优化、系统配置调整、架构改进等多方面的解决措施,旨在为软件开发和测试人员提供实用的性能优化指导。
55 4
|
2月前
|
前端开发 测试技术 UED
【测试效率对比】深入分析:为何UI自动化测试的投资回报率通常低于接口自动化测试?
这篇文章深入分析了UI自动化测试与接口自动化测试的投资回报率(ROI)问题,指出UI自动化测试在某些情况下的ROI并不低,反驳了没有实施过UI自动化就轻易下结论的观点,并强调了实践的重要性和自动化测试在项目迭代中的作用。
70 1
|
1月前
|
SQL 搜索推荐 测试技术
ChatGPT与测试分析
本产品需求文档(PRD)针对论坛网站的搜索功能优化,旨在提升搜索结果的准确性和速度,增强用户体验。文档涵盖项目背景、目标、功能需求(如搜索结果准确性、搜索速度优化、过滤和排序等)、非功能需求(如兼容性、性能、安全性等)、用户界面设计和技术架构等内容,并制定了详细的测试和上线计划,确保项目顺利实施。
21 0
|
3月前
|
监控 算法 Java
|
3月前
|
监控 算法 Java
压测分析Java内存和CPU暂用
7月更文挑战第7天
58 5
|
4月前
|
存储 缓存 NoSQL
Redis性能测试实操记录与分析
Redis性能测试实操记录与分析
58 3