如何进一步提高Oracle lgwr的写性能?

server/2025/1/9 12:58:08/

今天在我们的一个项目中,客户非常关系Oracle的log file sync、db file parallel write性能。

由于我们的分布式存储zdatax已经是nvme了,因此db file parallel write的性能足够好了,平均等待时间也就0.13ms。

然后log file sync 确高达0.6ms,实际上大家都知道0.6ms也是非常非常的低了。无奈,客户要求很高,那么怎么办?

通过awr报告我发现很大一部分的等待消耗在了log file parallel write上,如何能降低这个等待,那么log file sync是不是也降低了呢?

这里想到一个测试优化的方法,以及我的测试过程和结论,供大家参考!

+++test 1alter system set "_redo_write_coalesce_all_threshold"=1048576   scope=spfile sid='*';
alter system set "_redo_write_coalesce_slave_threshold"=1048576 scope=spfile sid='*';
alter system set "_redo_write_sync_single_io"=true scope=spfile sid='*';--session 1
SQL> startup force
ORACLE instance started.Total System Global Area 4294965376 bytes
Fixed Size                  8947840 bytes
Variable Size            1811939328 bytes
Database Buffers         2147483648 bytes
Redo Buffers              326594560 bytes
Database mounted.
Database opened.
SQL> !host ps -ef|grep lgwr
/bin/bash: host: command not foundSQL> host ps -ef|grep lgwr
oracle   30829     1  0 20:32 ?        00:00:00 ora_lgwr_ora19c
oracle   31428 16274  0 20:32 pts/2    00:00:00 /bin/bash -c ps -ef|grep lgwr
oracle   31430 31428  0 20:32 pts/2    00:00:00 grep lgwrSQL> @test_lgwr.sqlTable dropped.
。。。。。。--session 2
oracle@oradb1:/home/oracle $sqlplus "/as sysdba" SQL*Plus: Release 19.0.0.0.0 - Production on Tue Nov 19 20:33:05 2024
Version 19.23.0.0.0Copyright (c) 1982, 2023, Oracle.  All rights reserved.Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0SQL> oradebug setospid 30829
Oracle pid: 21, Unix process pid: 30829, image: oracle@oradb1 (LGWR)
SQL> oradebug event 10046 trace name context forever,level 12
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_30829.trc
SQL> oradebug event 10046 trace name context off
Statement processed.
SQL> oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_30829.trc|grep "log file single write" | awk '{sum+=$8} END {print sum}'
25441
oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_30829.trc|grep "log file parallel write" | awk '{sum+=$8} END {print sum}'
2075230
oracle@oradb1:/tmp $+++test 2alter system set "_redo_write_coalesce_all_threshold"=1048576   scope=spfile sid='*';
alter system set "_redo_write_coalesce_slave_threshold"=1048576 scope=spfile sid='*';
alter system set "_redo_write_sync_single_io"=true scope=spfile sid='*';oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_32733.trc|grep "log file single write" | awk '{sum+=$8} END {print sum}'
2726
oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_32733.trc|grep "log file parallel write" | awk '{sum+=$8} END {print sum}'
1544500
oracle@oradb1:/tmp $+++test 3alter system set "_redo_write_coalesce_all_threshold"=10485760   scope=spfile sid='*';
alter system set "_redo_write_coalesce_slave_threshold"=10485760 scope=spfile sid='*';
alter system set "_redo_write_sync_single_io"=true scope=spfile sid='*';oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_2429.trc|grep "log file single write" | awk '{sum+=$8} END {print sum}'
7907
oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_2429.trc|grep "log file parallel write" | awk '{sum+=$8} END {print sum}'
1403895
oracle@oradb1:/tmp $+++test 4alter system set "_redo_write_coalesce_all_threshold"=10485760   scope=spfile sid='*';
alter system set "_redo_write_coalesce_slave_threshold"=10485760 scope=spfile sid='*';
alter system set "_redo_write_sync_single_io"=false scope=spfile sid='*';oracle@oradb1:/tmp $ cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_5665.trc|grep "log file single write" | awk '{sum+=$8} END {print sum}'
25678
oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_5665.trc|grep "log file parallel write" | awk '{sum+=$8} END {print sum}'
888966
oracle@oradb1:/tmp $++++test 5alter system reset "_redo_write_coalesce_all_threshold"   scope=spfile sid='*';
alter system reset "_redo_write_coalesce_slave_threshold" scope=spfile sid='*';
alter system set "_redo_write_sync_single_io"=true scope=spfile sid='*';oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_7680.trc|grep "log file single write" | awk '{sum+=$8} END {print sum}'
47659
oracle@oradb1:/tmp $cat /u01/app/oracle/diag/rdbms/ora19c/ora19c/trace/ora19c_lgwr_7680.trc|grep  "log file parallel write" | awk '{sum+=$8} END {print sum}'
2105721
oracle@oradb1:/tmp $其中sql脚本如下:
oracle@oradb1:/home/oracle $                                 cat test_lgwr.sql 
drop table test1119;
alter system switch logfile;
create table test1119 as select * from dba_objects;
insert into test1119 select * from test1119;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119  select * from dba_objects where rownum <100;
commit;
insert into test1119 select * from test1119;
commit;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

针对上述4个场景的测试数据进行一下汇总:

场景1: 单块写 25441 多块写 2075230 合计时间 2100671

场景2: 单块写 2726 多块写 1544500 合计时间 1547226

场景3: 单块写 7907 多块写 1403895 合计时间 1411802

场景4: 单块写 25678 多块写 888966 合计时间 914644

场景5: 单块写 47659 多块写 2105721 合计时间 2153380

从测试来看,_redo_write_sync_single_io参数的影响微乎其微,可忽略不计。

而_redo_write_coalesce_all_threshold和_redo_write_coalesce_slave_threshold的参数如果设置为10m和保持默认值的情况进行对比。 我们可以发现lgwr写消耗时间差了几乎1倍。由此可见,这是一个提升log file parlalel write的重要手段。

通过降低log file parallel write的等待,进而降低log file sync的等待。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

加入DataBase Fans付费群,您能有哪些收获? 

1、大家可与顶级数据库专家互动,问题范围不限于Oracle,MySQL,openGauss等。
      -群内有全国Oracle顶级恢复专家,sql优化专家,MySQL源码专家,都是实战派
2、 入群可以获得顶级专家的收藏脚本。
3、 可提供原厂资料文档代查【包括xxxx账号,你们懂的】
4、 不定期组织直播案例分析【包括但不限于Oracle、MySQL、国产xxx数据库
5、 付费群:365人/年 【2025/1/1 - 2025/12/31】

想加入的朋友, 加v咨询 Roger_database


http://www.ppmy.cn/server/156561.html

相关文章

redis解决高并发抢购

对于前后端不分离的程序可以用悲观锁&#xff0c;对于前后端分离的程序可以用redis分布式锁 分布式锁 setnx key value&#xff0c;将key设置为value&#xff0c;当键不存在时&#xff0c;才能成功&#xff0c;若键存在&#xff0c;什么也不做&#xff0c;成功返回1&#xff0…

NebulaGraph学习笔记-自定义SessionPool

最近看了一下NebulaGraph图数据库连接的部分资料&#xff0c;发现还可以通过SessionPool的方式连接。下面是一个简单的DEMO记录。 组件项目 相关依赖包 <!-- SpringBoot依赖包 --> <dependency><groupId>org.springframework.boot</groupId><art…

ubuntu 22下解决Unment dependencies问题

问题现象 在使用apt安装包的时候&#xff0c;出现如下错误&#xff1a; 解决方案 第一步 sudo apt-get -f install sudo apt-get update sudo apt-get upgrade第二步 sudo apt-get update sudo apt-get clean sudo apt-get autoremove第三步 sudo apt --fix-broken inst…

行政审批远程勘验管理系统(源码+文档+部署+讲解)

引言 在快速发展的现代社会&#xff0c;远程踏勘系统作为一项创新技术&#xff0c;正逐渐改变传统的现场勘察工作模式。本文将详细介绍远程踏勘系统的核心功能、技术优势以及它如何提升现场勘察的效率。 系统概述 远程踏勘系统采用前后端分离的架构设计&#xff0c;服务端基…

【漏洞分析】DDOS攻防分析(二)

0x00 HTTP DDOS攻击实例解析 2014年5月&#xff0c;颇负盛名的搜狐视频&#xff0c;背负了一起著名的DDoS攻击事件。 当时&#xff0c;日本CDN服务商Incapsula声称&#xff0c;自己的一位客户的服务器遭遇了搜狐视频发起的DDoS攻击&#xff0c;期间总共有超过2万的网民通过搜…

HTML5新特性|05 CSS3边框CSS3背景

CSS3边框 1、CSS3边框: 通过CSS3&#xff0c;您能够创建圆角边框&#xff0c;向矩形添加阴影&#xff0c;使用图片来绘制边框-并且不需使用设计软件&#xff0c;比如PhotoShop。 属性: border-radius 圆角box-shadow:水平阴影 垂直阴影 阴影的清晰度 阴影的大小 阴影的颜色…

python+PyMuPDF库:(三)pdf文件的选择性合并、其他格式文件转pdf

insert_file: 支持docx、xlsx、pdf、PPTX、txt、svg、xps、FB2、CBZ、EPUB、MOBI、HWPX、图片等多种格式的文件的插入。利用此方法可以将此类文件转为pdf格式的文件。 insert_pdf &#xff1a;用来打开pdf文件并插入。 insert_file和insert_pdf使用相同的参数&#xff0c;常用…

【设计模式】 基本原则、设计模式分类

设计模式 设计模式是软件工程中的一种通用术语&#xff0c;指的是针对特定问题的经过实践验证的解决方案。设计模式并不是最终的代码实现&#xff0c;而是描述了如何解决某一类问题的思路和方法。 如果熟悉了设计模式&#xff0c;当遇到类似的场景&#xff0c;我们可以快速地…