Pglog高压下日志瓶颈分析

审计日志打开后会影响性能,本篇做下根因分析。

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_statementlog_durationtps下降%
none166786.1375390%
alloff141541.26518415%
allon96551.54443642%

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 
perf report -n --showcpuutilization -g --no-children --stdio 
perf top -n -g --no-children

使用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锁竞争是明显的瓶颈。

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

select 1的完整调用栈

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高铭杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值