{"id":3430,"date":"2020-06-16T14:04:57","date_gmt":"2020-06-16T14:04:57","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=3430"},"modified":"2020-10-02T05:46:43","modified_gmt":"2020-10-02T05:46:43","slug":"redo-copy-latch-mttr-advisor","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/","title":{"rendered":"Redo Copy Latch Contention 2: MTTR Advisor"},"content":{"rendered":"<h1>Redo copy latch<\/h1>\n<p>In <a href=\"https:\/\/nenadnoveljic.com\/blog\/tracing-latches-redo-copy-contention\/\">the previous blog post<\/a> I showed how a DML can hold a redo copy latch for a very long time if private strands aren&#8217;t used. Since recursive statements during logon bypass private strands, this can cause serious latch wait cascades. In particular, most of this time is spent in the function kcbklbc, which links a changed block to the checkpoint queue.<\/p>\n<p>Unlike redo copy latch, checkpoint queue latch latch is being held very briefly. This indicates that the block is linked very fast, and that the extra time is spent elsewhere. That overhead is the main focus of this article.<\/p>\n<h1>Assembly Tracing<\/h1>\n<p>With DTrace, we can trace offsets <a href=\"https:\/\/www.amazon.com\/DTrace-Dynamic-Tracing-Solaris-FreeBSD\/dp\/0132091518\">[1]<\/a>. An offset is the position of the instruction in bytes relative to the function start. As we shall see, we can get useful information by analyzing an offset trace even without disassembling the code. In addition to offsets, the following script traces latch allocations within the function.<\/p>\n<pre><code>#pragma D option dynvarsize=32m\n#pragma D option quiet\n\npid$target:oracle:kcbklbc:0\n{\n  self-&gt;started = timestamp ;\n  ustack();\n  self-&gt;kcbklbc = 1;\n}\n\npid$target:oracle:kslgetl:entry,\npid$target:oracle:kslfre:entry\n\/ self-&gt;kcbklbc \/\n{\n  printf(\"%s %s %X\\n\", probefunc, probename, arg0);\n}\n\npid$target:oracle:kcbklbc:\n{\n  printf(\"%d offset: %s\\n\", ( timestamp - self-&gt;started ) \/ 1000,  probename);\n}\n\npid$target:oracle:kcbklbc:return\n{\n  self-&gt;kcbklbc = 0 ;\n}<\/code><\/pre>\n<p>Here are the most relevant parts of a huge trace:<\/p>\n<pre><code>..\n<span style=\"color:red\">1<\/span> offset: 0\n3 offset: 2\n6 offset: 3\n...\n453 offset: 882\nkslgetl entry 9E551EB8  --&gt; acquired checkpoint queue latch latch\n462 offset: 887\n...\n1048 offset: 4ac\nkslfre entry 9E551EB8 --&gt; released checkpoint queue latch latch\n1057 offset: 4b1\n...\n1403 offset: d1d\nkslfre entry 9C438688 --&gt; released object queue header operation latch\n<span style=\"color:red\">1424<\/span> offset: d22\n...\n<span style=\"color:blue\">1539 offset: f13\n1543 offset: f17\n1555 offset: f1b\n1566 offset: f23\n1571 offset: f41\n1575 offset: f45\n1579 offset: f48<\/span>\n1581 offset: f13\n1583 offset: f17\n1585 offset: f1b\n1588 offset: f23\n1590 offset: f41\n1592 offset: f45\n1594 offset: f48\n1596 offset: f13\n1598 offset: f17\n1600 offset: f1b\n1610 offset: f23\n1613 offset: f41\n1615 offset: f45\n1618 offset: f48\n...\n<span style=\"color:blue\">10012 offset: f13\n10015 offset: f17\n10017 offset: f1b\n10021 offset: f23\n10023 offset: f25\n10025 offset: f2c\n10027 offset: f33\n10041 offset: f37\n10044 offset: f3a\n10053 offset: f3e\n10055 offset: f41\n10058 offset: f45\n10060 offset: f48<\/span>\n10063 offset: f13\n10066 offset: f17\n10068 offset: f1b\n10077 offset: f23\n10080 offset: f25\n10083 offset: f2c\n10086 offset: f33\n10095 offset: f37\n10098 offset: f3a\n10107 offset: f3e\n10111 offset: f41\n10113 offset: f45\n10116 offset: f48\n10118 offset: f13\n10120 offset: f17\n10122 offset: f1b\n10125 offset: f23\n...\n<span style=\"color:red\">30261<\/span> offset: return<\/code><\/pre>\n<p>The first column is the timing in microseconds relative to the function entry. The cut out parts are marked with &#8220;&#8230;&#8221;.<\/p>\n<p>The latch names can be obtained from the database:<\/p>\n<pre><code>select name,addr from v$latch_children where addr like '%9E551EB8' or addr like '%9C438688';\n\nNAME                                                             ADDR\n---------------------------------------------------------------- ----------------\ncheckpoint queue latch                                           000000009E551EB8\nobject queue header operation                                    000000009C438688<\/code><\/pre>\n<p>From the trace above, we can observe following:<\/p>\n<ul>\n<li>The whole traced execution lasted around <span style=\"color:red\">30ms<\/span>.<\/li>\n<li>The most time is spent in the loop that was executed after the last latch was released. (Two iterations are marked with blue.)<\/li>\n<li>None of the latches were acquired in the loop.<\/li>\n<\/ul>\n<h1>Working data sets array<\/h1>\n<p>There were 1080 loop iterations:<\/p>\n<pre><code>grep f13 kcbklbc.log | wc -l\n1080<\/code><\/pre>\n<p>The number of the iterations coincides with the undocumented parameter _db_block_lru_latches:<\/p>\n<pre><code>select a.ksppinm name,b.ksppstvl value \n  from sys.x$ksppi a, sys.x$ksppcv b\nwhere a.indx = b.indx and b.ksppstvl = '1080'\n;\n\nNAME\n--------------------------------------------------------------------------------\nVALUE\n--------------------------------------------------------------------------------\n_db_block_lru_latches\n1080<\/code><\/pre>\n<p>Each LRU latch protects a working data set <a href=\"https:\/\/www.amazon.com\/Oracle-Core-Essential-Internals-Developers-ebook\/dp\/B006C9EN1U\">[2]<\/a>. There are indeed 1080 working data sets:<\/p>\n<pre><code>select count(*) from x$kcbwds;\n\n  COUNT(*)\n----------\n      1080<\/code><\/pre>\n<p>The loop iterates over the working data sets. I doublecheked that by changing the parameter value and verifying that the number of iterations changed accordingly.<\/p>\n<p>So, the more working data sets, the longer redo copy latch is being held. As the number of working data sets is proportional to the number of CPUs, the problem is worse on larger servers.<\/p>\n<h1>MTTR advisor<\/h1>\n<p>Further, there are two types of iterations: with 7 and 13 instructions. This variation reveals a conditional branching. Three instructions must be for the loop control and three for the branching. This leaves us with just a few instructions doing the actual work &#8211; they calculate the sum of values obtained by dereferencing several pointers in the SGA.<\/p>\n<p>The reads in the loop aren&#8217;t protected by a latch. This means that consistency isn&#8217;t critical. <a href=\"https:\/\/jonathanlewis.wordpress.com\/\">Jonathan Lewis<\/a> pointed out that the result might be consumed by an advisor. Below are all advisor parameters:<\/p>\n<pre><code>@<a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/pd2.sql\">pd2.sql<\/a> %advi%\nShow all parameters and session values from x$ksppi\/x$ksppcv...\n\n       NUM N_HEX NAME                                                     VALUE                          DESCRIPTION\n---------- ----- -------------------------------------------------------- ------------------------------ ---------------------------------------------------------------------------------------------------\n      1825   721 db_cache_advice                                          OFF                            Buffer cache sizing advisory\n      1826   722 _db_cache_advice_sample_factor                           4                              cache advisory sampling factor\n      1827   723 _db_cache_advice_max_size_factor                         2                              cache advisory maximum multiple of current size to similate\n      1828   724 _db_cache_advice_sanity_check                            FALSE                          cache simulation sanity check\n      1829   725 _db_cache_advice_hash_latch_multiple                     16                             cache advisory hash latch multiple\n      1830   726 _db_mttr_advice                                          ON                             MTTR advisory\n      1833   729 _db_mttr_partitions                                      0                              number of partitions for MTTR advisory\n      2690   A82 _simulate_io_wait                                        0                              Simulate I\/O wait to test segment advisor\n      2851   B23 _compression_advisor                                     0                              Compression advisor\n      3245   CAD _library_cache_advice                                    TRUE                           whether KGL advice should be turned on\n      3246   CAE _kglsim_maxmem_percent                                   5                              max percentage of shared pool size to be used for KGL advice\n      3888   F30 _smm_advice_log_size                                     0                              overwrites default size of the PGA advice workarea history log\n      3889   F31 _smm_advice_enabled                                      TRUE                           if TRUE, enable v$pga_advice\n      3972   F84 _sta_control                                             0                              SQL Tuning Advisory control parameter\n      3973   F85 _enable_automatic_sqltune                                TRUE                           Automatic SQL Tuning Advisory enabled parameter\n      4252  109C _partition_advisor_srs_active                            true                           enables sampling based partitioning validation<\/code><\/pre>\n<p>_db_advise_mttr was the first choice, because I previously discovered that the loop isn&#8217;t being executed if fast_start_mttr_target = 0. The program indeed doesn&#8217;t iterate through the working data sets after disabling the MTTR advisor (_db_mttr_advice = OFF). Simply put, on a large server with many CPUs redo copy latch waits can be massively reduced by disabling the MTTR advisor.<\/p>\n<p>What data exactly does the MTTR advisor code read?<\/p>\n<h1>Checkpont queues<\/h1>\n<p>Each working data set has two checkpoint queues. Even though the pointers to them are contained in the working data set structure, they are, sadly, not externalized in x$kcbwds. But we can get them with a debugger by peeking into the following addresses (at least on 19.7): x$kcbwds.addr+0xa0 and x$kcbwds.addr+0x1a8, for example:<\/p>\n<pre><code>select addr from x$kcbwds where rownum=1;\n\nADDR\n----------------\n000000009E49B868<\/code><\/pre>\n<pre><code>(gdb) x\/x 0x9E49B868+0xa0\n0x9e49b908:       0x9e4dceb8\n(gdb) x\/x 0x9E49B868+0x1a8\n0x9e49ba10:       0x9e4dcf18<\/code><\/pre>\n<p>We can confirm, that the addresses above are pointing to the checkpoint queues:<\/p>\n<pre><code>@<a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/fcha.sql\">fcha.sql<\/a> 0x9e4dceb8\n\nLOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR\n--- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ----------------\nSGA 000000009E4DCEA8          1          1 Checkpoint queu          48 perm              0 000000009E0CD000\n\n@<a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/fcha.sql\">fcha.sql<\/a> 0x9e4dcf18\n\nLOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR\n--- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ----------------\nSGA 000000009E4DCF08          1          1 Checkpoint queu          48 perm              0 000000009E0CD000<\/code><\/pre>\n<p>The MTTR advisor code collects the values which are at 0x10 offset and sums them.<\/p>\n<pre><code>(gdb) x\/d 0x9e4dceb8+0x10\n0x9e4dcec8:       0\n(gdb) x\/d 0x9e4dcf18+0x10\n0x9e4dcf28:       0<\/code><\/pre>\n<p><a href=\"https:\/\/jonathanlewis.wordpress.com\/\">Jonathan<\/a> pointed out that those values are probably the number of blocks in the checkpoint queue. In the example above, there aren&#8217;t any blocks on the observed checkpoint queues.<\/p>\n<p>The MTTR advisor code is only executed after a block was linked to the checkpoint queue. There are also kcbklbc executions that don&#8217;t link any blocks and, therefore, hold the redo copy latch only for a very short time. Such cases are recognized by the absence of checkpoint queue latch latch allocations.<\/p>\n<h1>Conclusion<\/h1>\n<p>In conclusion, DMLs bypassing private strands can piggyback data collection for the MTTR advisor. That code is executed immediately after linking a changed block to the checkpoint queue. The function iterates over the working data set array while holding a redo copy latch. This isn&#8217;t a big problem on a database containing a small number of working data sets. But, since the number of working data sets is proportional to the number of CPUs, logon storms can cause serious latch wait cascades on large servers. It&#8217;s something to keep in mind when migrating to a bigger server or configuring hyper-threading, especially when the application doesn&#8217;t use static connection pools.<\/p>\n<h1>References<\/h1>\n<ul>\n<li><a href=\"https:\/\/www.amazon.com\/DTrace-Dynamic-Tracing-Solaris-FreeBSD\/dp\/0132091518\">[1]<\/a> Brendan Gregg, Jim Mauro, <i>DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD.<\/i> 2011.<\/li>\n<li><a href=\"https:\/\/www.amazon.com\/Oracle-Core-Essential-Internals-Developers-ebook\/dp\/B006C9EN1U\">[2]<\/a> Jonathan Lewis, <i>Oracle Core: Essential Internals for DBAs and Developers (Expert&#8217;s Voice in Databases).<\/i> 2012.<\/li>\n<\/ul>\n<h1>Update on October 2, 2020<\/h1>\n<p>The MTTR advisor code is the root cause for the following bug:<br \/>\nBug 29924088 : 18.4 &#8211; HIGH CONCURRENCY FROM UPDATE USER$ &#8211; SQL_ID 9ZG9QD9BM4SPU<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a proprietary code without disassembling it. <a href=\"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[24,34,5,37],"tags":[],"class_list":["post-3430","post","type-post","status-publish","format-standard","hentry","category-dtrace","category-latches","category-oracle","category-redo"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Redo Copy Latch Contention 2: MTTR Advisor - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a propriatery code without disassembling it.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Redo Copy Latch Contention 2: MTTR Advisor - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a propriatery code without disassembling it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-16T14:04:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-02T05:46:43+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Redo Copy Latch Contention 2: MTTR Advisor\",\"datePublished\":\"2020-06-16T14:04:57+00:00\",\"dateModified\":\"2020-10-02T05:46:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/\"},\"wordCount\":861,\"commentCount\":0,\"articleSection\":[\"DTrace\",\"latches\",\"Oracle\",\"redo\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/\",\"name\":\"Redo Copy Latch Contention 2: MTTR Advisor - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2020-06-16T14:04:57+00:00\",\"dateModified\":\"2020-10-02T05:46:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a propriatery code without disassembling it.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/redo-copy-latch-mttr-advisor\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Redo Copy Latch Contention 2: MTTR Advisor\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Redo Copy Latch Contention 2: MTTR Advisor - All-round Database Topics","description":"MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a propriatery code without disassembling it.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/","og_locale":"en_US","og_type":"article","og_title":"Redo Copy Latch Contention 2: MTTR Advisor - All-round Database Topics","og_description":"MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a propriatery code without disassembling it.","og_url":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/","og_site_name":"All-round Database Topics","article_published_time":"2020-06-16T14:04:57+00:00","article_modified_time":"2020-10-02T05:46:43+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Redo Copy Latch Contention 2: MTTR Advisor","datePublished":"2020-06-16T14:04:57+00:00","dateModified":"2020-10-02T05:46:43+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/"},"wordCount":861,"commentCount":0,"articleSection":["DTrace","latches","Oracle","redo"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/","url":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/","name":"Redo Copy Latch Contention 2: MTTR Advisor - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2020-06-16T14:04:57+00:00","dateModified":"2020-10-02T05:46:43+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"MTTR advisor data gathering can cause redo copy latch contention on servers with many CPUs. Checkpoint queue internals. An example of analyzing a compiled function in a propriatery code without disassembling it.","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/redo-copy-latch-mttr-advisor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Redo Copy Latch Contention 2: MTTR Advisor"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/3430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=3430"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/3430\/revisions"}],"predecessor-version":[{"id":3565,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/3430\/revisions\/3565"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=3430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=3430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=3430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}