{"id":2967,"date":"2019-10-20T16:43:19","date_gmt":"2019-10-20T16:43:19","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=2967"},"modified":"2019-10-20T16:43:21","modified_gmt":"2019-10-20T16:43:21","slug":"log-write-elapsed-time","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/","title":{"rendered":"Warning: log write elapsed time"},"content":{"rendered":"<p>Maybe you&#8217;ve already seen the following warning in the log writer (lgwr) trace file correlating with slow commits:<\/p>\n<pre><code>Warning: log write elapsed time 738ms, size 20KB<\/code><\/pre>\n<p>Many articles found on the Internet claim that this is an indication of an IO bottleneck and recommend fixing it straight away. But that might be misleading, because the code instrumented by this trace entry comprises much more than an OS write call. I&#8217;m going to show here what exactly gets measured and how to precisely identify the underlying problem.<\/p>\n<p>While the low-level analysis is Solaris specific, the conclusions are OS independent.<\/p>\n<p>Firstly, the measured time interval starts in the Oracle C procedure <span style=\"color: red;\"><i>kcrfw_redo_write_driver<\/i><\/span> which, in turn, calls the OS kernel function <a href=\"https:\/\/docs.oracle.com\/cd\/E86824_01\/html\/E54766\/gethrtime-3c.html\"><i>gethrtime<\/i><\/a> to get the current timestamp. Unsurprisingly, <span style=\"color: red;\"><i>kcrfw_redo_write_driver<\/i><\/span> is the function that performs redo write <a href=\"https:\/\/fritshoogland.wordpress.com\/2018\/02\/12\/a-look-into-oracle-redo-part-3-the-log-writer-work-cycle-overview\/\">[1]<\/a>.<\/p>\n<p>Secondly, <span style=\"color: red;\"><i>kcrfw_postprocess_write<\/i><\/span>, which is executed after the redo buffer was written, retrieves the end timestamp and calculates the elapsed time.<\/p>\n<p>Finally, the same function writes the warning into the lgwr trace file if the operation lasted longer than 500 ms:<\/p>\n<pre><code>#0  0x00007ffafd13d0c4 in write () from \/lib\/64\/libc.so.1\n#1  0x000000000b1910a2 in sdbgrfuwf_write_file ()\n#2  0x000000000b19100a in sdbgrfwf_write_file ()\n#3  0x000000000b174de0 in dbgtfdFileWrite ()\n#4  0x000000000b0e07e7 in dbgtfdFileAccessCbk ()\n#5  0x000000000b172665 in dbgtfWriteRec ()\n#6  0x000000001d6df55a in dbgtRecVAWriteDisk ()\n#7  0x000000000b170cd6 in dbgtTrcVaList_int ()\n#8  0x000000000b170226 in dbgtTrc_int ()\n#9  0x0000000015adb8f3 in dbktWriteTimestampWCdbInfo ()\n#10 0x000000000ac2d62c in <span style=\"color: red;\">kcrfw_postprocess_write<\/span> ()\n#11 0x000000000ac1bf1c in <span style=\"color: red;\">kcrfw_redo_write<\/span> ()\n#12 0x000000000af0462c in kcrfw_redo_write_driver ()\n#13 0x00000000194f3fea in ksb_act_run_int ()\n#14 0x00000000194f9ebd in ksb_act_run ()\n#15 0x000000000af0e263 in ksbcti ()\n#16 0x000000000af0263f in ksbabs ()\n#17 0x000000000af00bc7 in ksbrdp ()\n#18 0x000000000aaccf54 in opirip ()\n#19 0x0000000009d10a2b in opidrv ()\n#20 0x0000000009d10747 in sou2o ()\n#21 0x0000000009d1050f in opimai_real ()\n#22 0x0000000009d100a6 in ssthrdmain ()\n#23 0x0000000009d0fe17 in main ()<\/code><\/pre>\n<p>I wrote the following DTrace script to gain an insight into what&#8217;s instrumented by the trace file entry:<\/p>\n<pre><code>\/*\n(c) 2019 Nenad Noveljic All Rights Reserved\n\nusage: dtrace -s log_write_elapsed.d -p PID\n*\/\n\n#pragma D option quiet\n\npid$target::kcrfw_redo_write_driver:entry\n{\n  self-&gt;entered_kcrfw_redo_write_driver = 1 ;\n}\n\npid$target::gethrtime*:return\n\/ self-&gt;entered_kcrfw_redo_write_driver \/\n{\n  self-&gt;log_write_started = arg1 ;\n  self-&gt;entered_kcrfw_redo_write_driver = 0 ;\n}\n\npid$target::kcrfw_postprocess_write:entry\n{\n  self-&gt;entered_kcrfw_postprocess_write = 1 ;\n}\n\npid$target::gethrtime*:return\n\/ self-&gt;entered_kcrfw_postprocess_write \/\n{\n  printf(\"log write elapsed [ms]: %d\\n\\n\", \\\n    ( arg1 - self-&gt;log_write_started ) \/ 1000000 ) ;\n  self-&gt;entered_kcrfw_postprocess_write = 0 ;\n  self-&gt;log_write_started = 0 ;\n}\n\npid$target::pwrite:entry\n\/ strstr(fds[arg0].fi_pathname,\"redo\") != 0 &amp;&amp; self-&gt;log_write_started \/\n{\n  self-&gt;pwrite_start = timestamp ;\n}\n\npid$target::pwrite:return\n\/ self-&gt;pwrite_start \/\n{\n  printf(\"OS write elapsed [ms]: %d\\n\", \\\n    ( timestamp - self-&gt;pwrite_start ) \/ 1000000  ) ;\n  self-&gt;pwrite_start = 0 ;\n}\n\npid$target::kslgetl:entry\n\/ self-&gt;log_write_started \/\n{\n  printf(\"get latch: 0x%X %d 0x%X %d\\n\", arg0, arg1, arg2, arg3);\n}<\/code><\/pre>\n<p>This script independently measures the instrumented time by capturing the <i>gethrtime<\/i> return values and calculating the difference. On top of that, it traces the latch allocations within the observed time period. It is tested on Oracle 18.7 \/ Solaris x64 11.4 and assumes synchronous IO (<i>disk_asynch_io=FALSE<\/i>).<\/p>\n<p>Here&#8217;s a sample output:<\/p>\n<pre><code>get latch: 0x6000B2B0 1 0x0 322\nget latch: 0x6000B2B0 1 0x0 322\nget latch: 0x6001EC40 1 0x0 2749\nget latch: 0x6001EC40 1 0x0 2749\nget latch: 0x969B61B0 1 0x0 3737\nget latch: 0x969B61B0 1 0x0 3737\nget latch: 0x969B6250 1 0x1 3737\nget latch: 0x969B6250 1 0x1 3737\nget latch: 0x969B62F0 1 0x2 3737\nget latch: 0x969B62F0 1 0x2 3737\nget latch: 0x969B6390 1 0x3 3737\nget latch: 0x969B6390 1 0x3 3737\nget latch: 0x969B6430 1 0x4 3737\nget latch: 0x969B6430 1 0x4 3737\nget latch: 0x969B64D0 1 0x5 3737\nget latch: 0x969B64D0 1 0x5 3737\nget latch: 0x969B6570 1 0x6 3737\nget latch: 0x969B6570 1 0x6 3737\nget latch: 0x6000B2B0 1 0xBE913438 321\nget latch: 0x6000B2B0 1 0xBE913438 321\nget latch: 0x6000B2B0 1 0x0 322\nget latch: 0x6000B2B0 1 0x0 322\nget latch: 0x6001EC40 1 0x0 2749\nget latch: 0x6001EC40 1 0x0 2749\nget latch: 0x969B61B0 1 0x0 3737\nget latch: 0x969B61B0 1 0x0 3737\nget latch: 0x969B6250 1 0x1 3737\nget latch: 0x969B6250 1 0x1 3737\nget latch: 0x969B62F0 1 0x2 3737\nget latch: 0x969B62F0 1 0x2 3737\nget latch: 0x969B6390 1 0x3 3737\nget latch: 0x969B6390 1 0x3 3737\nget latch: 0x969B6430 1 0x4 3737\nget latch: 0x969B6430 1 0x4 3737\nget latch: 0x969B64D0 1 0x5 3737\nget latch: 0x969B64D0 1 0x5 3737\nget latch: 0x969B6570 1 0x6 3737\nget latch: 0x969B6570 1 0x6 3737\nget latch: 0x60025EF8 1 0x0 3752 \nget latch: <span style=\"color: red;\">0x60025EF8<\/span> 1 0x0 3752\n<span style=\"color: blue;\">OS write elapsed [ms]: 3\nlog write elapsed [ms]: 3<\/span><\/code><\/pre>\n<p>We can observe two things. One is that, normally, the OS write is the largest contributor to the instrumented elapsed time. The other is, there are lots of latch allocations within the instrumented time period.<\/p>\n<p>In particular, one of the allocated latches is <span style=\"color: red;\"><i>redo writing<\/i><\/span>:<\/p>\n<pre><code>column name format a12\nselect name from v$latch where addr like '%<span style=\"color: red;\">60025EF8<\/span>%' ;\n\nNAME\n------------\n<span style=\"color: red;\">redo writing<\/span><\/code><\/pre>\n<p>Now it&#8217;s time for a little experiment (but not in production!) &#8211; I&#8217;ll allocate the <span style=\"color: red;\"><i>redo writing<\/i><\/span> latch by directly calling the Oracle C function <i>kslgetl<\/i> <a href=\"https:\/\/andreynikolaev.files.wordpress.com\/2016\/03\/latches_and_mutexes_in_oracle_12c.pdf\">[2]<\/a> from another session before committing some changed data:<\/p>\n<pre><code>oradebug setmypid\noradebug call kslgetl <span style=\"color: red;\">0x60025EF8<\/span> 1 0x0 3752<\/code><\/pre>\n<p>Expectedly, the commit was hanging, because it was waiting on the redo writing latch, and it completed immediately after terminating the latch holder session.<\/p>\n<p>The DTrace script produced the following output:<\/p>\n<pre><code>$dtrace -s log_write_elapsed.d -p 4198\n\nOS write elapsed [ms]: 13\nOS write elapsed [ms]: 5\nOS write elapsed [ms]: 2\n<span style=\"color: red;\">log write elapsed [ms]: 12872<\/span><\/code><\/pre>\n<p>As you can see, the measured time is now significantly longer than the time it took for the IO operation to complete.<\/p>\n<p>The trace file entry matches the time measured by the DTrace script:<\/p>\n<pre><code>*** 2019-10-07T08:15:33.531014+02:00\nWarning: <span style=\"color: red;\">log write elapsed time 12872ms<\/span>, size 20KB<\/code><\/pre>\n<p>That was the proof that a slow IO isn&#8217;t the only possible cause for this warning.<\/p>\n<p>Anyway, if you notice this message, you can use Tanel Poder&#8217;s <a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ash\/ash_wait_chains.sql\">ash_wait_chains.sql<\/a> to see if the log writer was waiting on something &#8211; before compulsively addressing an &#8220;IO issue&#8221;:<\/p>\n<pre><code>@<a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ash\/ash_wait_chains.sql\">ash_wait_chains.sql<\/a> program2||event2 session_id=148 \"to_date('07.10.2019 08:15:21','dd.mm.yyyy hh24:mi:ss')\" \"to_date('07.10.2019 08:15:34','dd.mm.yyyy hh24:mi:ss')\"\n\n-- Display ASH Wait Chain Signatures script v0.4 BETA by Tanel Poder ( http:\/\/blog.tanelpoder.com )\n\n%This     SECONDS        AAS\n------ ---------- ----------\nWAIT_CHAIN\n--------------------------------------------------------------------------------\nFIRST_SEEN          LAST_SEEN\n------------------- -------------------\n 100%          12         .9\n-&gt; (sqlplus) log file sync  -&gt; (LGWR) latch: redo writing  -&gt; [<span style=\"color: red;\">idle blocker<\/span>\n1,<span style=\"color: red;\">253<\/span>,8655]\n2019-10-07 08:15:21 2019-10-07 08:15:32<\/code><\/pre>\n<p>The output above shows us that the log writer was waiting on the redo writing latch which was held by the session <span style=\"color: red;\">253<\/span> &#8211; the session that issued the <i>kslgetl<\/i> call. Notice that this session is correctly annotated as an &#8220;<span style=\"color: red;\">idle blocker<\/span>&#8220;, as it didn&#8217;t do anything after allocating the latch, and, consequently, didn&#8217;t produce any samples in <i>v$active_session_history<\/i>.<\/p>\n<p>In conclusion, the code instrumented by the log writer trace file entry entails not only the the OS write call, but also the latch handling. Therefore, triage is the first thing to do after spotting longer redo writes in the lgwr trace: was it an IO bottleneck or, perhaps, some wait chain? You can crosscheck the former with OS utilities and\/or <i>log file parallel write<\/i> waits. The latter you can investigate with <a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ash\/ash_wait_chains.sql\">ash_wait_chains.sql<\/a>. In any case, there isn&#8217;t any room left for guesswork and speculation.<\/p>\n<p>References:<\/p>\n<ul>\n<li><a href=\"https:\/\/fritshoogland.wordpress.com\/2018\/02\/12\/a-look-into-oracle-redo-part-3-the-log-writer-work-cycle-overview\/\">[1]<\/a> Frits Hoogland, <i>A look into Oracle redo, part 3: log writer work cycle overview.<\/i> February 12, 2018<\/li>\n<li><a href=\"https:\/\/andreynikolaev.files.wordpress.com\/2016\/03\/latches_and_mutexes_in_oracle_12c.pdf\">[2]<\/a> Andrey Nikolaev, <i>New features of Latches and Mutexes in Oracle 12c.<\/i> December 9, 2015.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Oracle database internals &#8211; (redo) &#8220;log write elapsed time&#8221; instrumentation <a href=\"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/\" 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,5],"tags":[],"class_list":["post-2967","post","type-post","status-publish","format-standard","hentry","category-dtrace","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Warning: log write elapsed time - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Oracle database internals - (redo) &quot;log write elapsed time&quot; instrumentation\" \/>\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\/log-write-elapsed-time\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Warning: log write elapsed time - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Oracle database internals - (redo) &quot;log write elapsed time&quot; instrumentation\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-20T16:43:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-10-20T16:43:21+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\\\/log-write-elapsed-time\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Warning: log write elapsed time\",\"datePublished\":\"2019-10-20T16:43:19+00:00\",\"dateModified\":\"2019-10-20T16:43:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/\"},\"wordCount\":625,\"commentCount\":5,\"articleSection\":[\"DTrace\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/\",\"name\":\"Warning: log write elapsed time - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2019-10-20T16:43:19+00:00\",\"dateModified\":\"2019-10-20T16:43:21+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Oracle database internals - (redo) \\\"log write elapsed time\\\" instrumentation\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/log-write-elapsed-time\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Warning: log write elapsed time\"}]},{\"@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":"Warning: log write elapsed time - All-round Database Topics","description":"Oracle database internals - (redo) \"log write elapsed time\" instrumentation","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\/log-write-elapsed-time\/","og_locale":"en_US","og_type":"article","og_title":"Warning: log write elapsed time - All-round Database Topics","og_description":"Oracle database internals - (redo) \"log write elapsed time\" instrumentation","og_url":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/","og_site_name":"All-round Database Topics","article_published_time":"2019-10-20T16:43:19+00:00","article_modified_time":"2019-10-20T16:43:21+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\/log-write-elapsed-time\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Warning: log write elapsed time","datePublished":"2019-10-20T16:43:19+00:00","dateModified":"2019-10-20T16:43:21+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/"},"wordCount":625,"commentCount":5,"articleSection":["DTrace","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/","url":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/","name":"Warning: log write elapsed time - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2019-10-20T16:43:19+00:00","dateModified":"2019-10-20T16:43:21+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Oracle database internals - (redo) \"log write elapsed time\" instrumentation","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/log-write-elapsed-time\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Warning: log write elapsed time"}]},{"@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\/2967","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=2967"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/2967\/revisions"}],"predecessor-version":[{"id":2989,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/2967\/revisions\/2989"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=2967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=2967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=2967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}