{"id":2918,"date":"2019-09-08T15:22:22","date_gmt":"2019-09-08T15:22:22","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=2918"},"modified":"2019-09-08T15:22:24","modified_gmt":"2019-09-08T15:22:24","slug":"bad-commit-performance-control-file-writes","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/","title":{"rendered":"Bad commit Performance due to Slow Control File Writes"},"content":{"rendered":"<h1>Wait chains<\/h1>\n<p>I observed user sessions intermittently waiting longer on <i>log file sync<\/i>. Untypically, there weren&#8217;t any indications of slow redo log writes. In fact, according to the OS performance statistics, all redo log writes completed within 5 ms. But if the redo writes were fast, what was the log writer (LGWR) actually doing?<\/p>\n<p>If you&#8217;ve licensed the Diagnostic and Tuning Pack, <a href=\"https:\/\/blog.tanelpoder.com\/about\/\">Tanel Poder<\/a>&#8216;s <a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ash\/ash_wait_chains.sql\">ash_wait_chains.sql<\/a> is the perfect tool for displaying such hidden dependencies &#8211; it proved invaluable for uncovering the root cause:<\/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 1=1 \"to_date('04.09.2019 07:05:09','dd.mm.yyyy hh24:mi:ss')\" \"to_date('04.09.2019 07:06:09','dd.mm.yyyy hh24:mi:ss')\"                                                   \n\n-- Display ASH Wait Chain Signatures script v0.2 BETA by Tanel Poder ( http:\/\/blog.tanelpoder.com )\n%This     SECONDS        AAS\n------ ---------- ----------\nWAIT_CHAIN\n--------------------------------------------------------------------------------\n  46%         146        2.4\n<span style=\"color: red;\">-&gt; (App.exe) log file sync  -&gt; (LGWR) control file parallel write<\/span>\n\n  19%          60          1\n-&gt; (LGWR) control file parallel write\n\n...<\/code><\/pre>\n<p>Basically, the user sessions were waiting on the LGWR, which, in turn, was mostly waiting on control file writes to complete. Also, the OS statistics confirmed sluggish control files writes. In this case, an OS bug have been causing slow writes on the ZFS data file pool during the peak load periods. It&#8217;s worth noting that the IO operations on the other pools were fast during that time. Understandably, the control file that was placed in the data file pool was affected by this problem too. After separating it from the data files, we predictably haven&#8217;t suffered any significant <i>log file sync<\/i> wait events anymore, even when the data file writes were significantly slowing down.<\/p>\n<p>But what information is the LGWR writing into the control files? And when does that happen? I mean, when a session issues a commit, the LGWR normally writes only into the redo logs, like described in <a href=\"https:\/\/fritshoogland.wordpress.com\/2018\/02\/27\/a-look-into-oracle-redo-part-5-the-log-writer-writing\/\">[Hoogland 2018]<\/a>.<\/p>\n<h1><i>control file parallel write<\/i><\/h1>\n<p>I captured the LGWR call stacks during control files writes to figure out what&#8217;s triggering them:<\/p>\n<pre><code>ps -ef | grep DMUR1 | grep lgwr\noracle  8098  7951   0 12:07:45 ?           0:37 ora_lgwr_DMUR1\n\nsudo -u root \/usr\/sbin\/dtrace -n '\npid$target::pwrite:entry \/ arg0 == 256 \/ { ustack(); }\n' -p 8098<\/code><\/pre>\n<p>256 is the control file descriptor which can be queried with pfiles:<\/p>\n<pre><code>pfiles 8098\n256: S_IFREG mode:0640 dev:275,69139 ino:10 uid:1000 gid:1000 size:25706496 (25MB)\n  O_RDWR|O_DSYNC|O_LARGEFILE FD_CLOEXEC\n  advisory write lock set by process 3626\n  \/u00\/oracle\/oradata01\/DMUR1\/ctl\/ctl1DMUR1.dbf\n  offset:0 \n257: S_IFREG mode:0640 dev:275,69168 ino:10 uid:1000 gid:1000 size:25706496 (25MB)\n  O_RDWR|O_DSYNC|O_LARGEFILE FD_CLOEXEC\n  advisory write lock set by process 3626\n  \/u00\/oracle\/oradata02\/DMUR1\/ctl\/ctl2DMUR1.dbf\n  offset:0 \n258: S_IFREG mode:0640 dev:275,69198 ino:10 uid:1000 gid:1000 size:25706496 (25MB)\n  O_RDWR|O_DSYNC|O_LARGEFILE FD_CLOEXEC\n  advisory write lock set by process 3626\n  \/u00\/oracle\/oradata03\/DMUR1\/ctl\/ctl3DMUR1.dbf\n  offset:0<\/code><\/pre>\n<p>The following simple loop was used to create activity on the database:<\/p>\n<pre><code>create table t ( c varchar2(4000) ) ;\n\nbegin\n  for i in 1..1e6\n  loop\n    insert into t values (lpad('A',4000)) ;\n\tcommit ;\n  end loop ;\nend ;\n\/<\/code><\/pre>\n<p>Here&#8217;s the captured stack:<\/p>\n<pre><code>libc.so.1`pwrite\noracle`skgfqio+0x5e5\noracle`ksfd_skgfqio+0x22c\noracle`ksfdgo+0x1a7\noracle`ksfd_sbio+0xe12\noracle`ksfdbio+0x109c\noracle`ksfdbio+0x12fa\noracle`kccwbp+0x466\noracle`kccrec_wdf+0x1ab\noracle`kccfhb+0x2b\noracle`kcccmt+0xdd\noracle`kcrfnl+0x3e6\noracle`kcrfwl+0x3b0\noracle`ksb_act_run_int+0x6a\noracle`ksb_act_run+0xad\noracle`ksbabs+0x3c9\noracle`ksbrdp+0xa77\noracle`opirip+0x2c4\noracle`opidrv+0x24b\noracle`sou2o+0x97<\/code><\/pre>\n<p><i>kcrfwl<\/i> is the most interesting function. Its annotation &#8220;kernel cache recovery file write\/broadcast SCN sWitch logs&#8221; (according to <a href=\"https:\/\/fritshoogland.wordpress.com\/about\/\">Frits Hoogland<\/a>&#8216;s <a href=\"http:\/\/orafun.info\/\">Oracle C functions annotations<\/a>) tells us that it&#8217;s invoked during a log switch. This information is sufficient to reproduce the behavior observed on the production database.<\/p>\n<h1><i>log file sync<\/i><\/h1>\n<p>First, I&#8217;ll attach with gdb to the LGWR and set a conditional breakpoint when the process writes to the control file:<\/p>\n<pre><code>attach 8098\nb *pwrite if $rdi==256\nc<\/code><\/pre>\n<p>Next, I&#8217;ll initiate a log switch:<\/p>\n<pre><code>alter system switch logfile ;<\/code><\/pre>\n<p>Finally, in another session, I&#8217;ll insert and commit a row:<\/p>\n<pre><code>insert into t values (1);\ncommit ;<\/code><\/pre>\n<p>Expectedly, the <i>commit<\/i> doesn&#8217;t come back, because it&#8217;s waiting on the LGWR to complete:<\/p>\n<pre><code>column sid format 999\ncolumn program format a30\ncolumn event format a30\ncolumn state format a10\n\nset linesize 200\n\nselect sid,program,event,state,seconds_in_wait from v$session \n  where sid in (37,97) ;\n\n SID PROGRAM                        EVENT                          STATE      SECONDS_IN_WAIT\n---- ------------------------------ ------------------------------ ---------- ---------------\n  37 sqlplus@svdbp01i (TNS V1-V3)   log file sync                  WAITING                138\n  97 oracle@svdbp01i (LGWR)         control file parallel write    WAITING                228<\/code><\/pre>\n<p>The LGWR, in turn, is waiting on the &#8220;slow&#8221; control file write to finish. Of course, that &#8220;slow&#8221; write is simulated with the breakpoint, and it won&#8217;t finish until I resume the execution.<\/p>\n<p>Also, <a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ash\/ash_wait_chains.sql\">ash_wait_chains.sql<\/a> confirms the fingerprint of the production issue:<\/p>\n<pre><code>@ash_wait_chains program2||event2 session_id=37 sysdate-400 sysdate\n\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  60%         418          0\n<span style=\"color: red;\">-&gt; (sqlplus) log file sync  -&gt; (LGWR) control file parallel write<\/span>\n2019-09-05 15:29:09 2019-09-05 15:36:06<\/code><\/pre>\n<h1>Conclusion<\/h1>\n<p>Frankly, it wasn&#8217;t my first thought that slower control file writes might impair <i>commit<\/i> performance. In fact, control files placement isn&#8217;t even considered in the white paper <a href=\"https:\/\/www.oracle.com\/technetwork\/server-storage\/solaris10\/config-solaris-zfs-wp-167894.pdf\">Configuring Oracle Solaris ZFS for an Oracle Database<\/a>. This document recommends to separate data and redo file in separate pools for performance, but it doesn&#8217;t even mention control files. Of course, after having had understood the impact, we separated control files from data files.<\/p>\n<p>Further, this case study reminded me that the underlying issue might not be obvious by observing only the affected session. Therefore, we shouldn&#8217;t rush into implementing &#8220;solutions&#8221; before having really understood the problem. Thanks to <a href=\"https:\/\/blog.tanelpoder.com\/about\/\">Tanel<\/a> we have <a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ash\/ash_wait_chains.sql\">ash_wait_chains.sql<\/a> &#8211; a superb tool for identifying the main blocker who is sometimes hidden in a remote link of the wait chain.<\/p>\n<p>Last but not least, once we&#8217;ve understood the dependencies, we can even go a step further and reproduce the problem with debugger, which is surely a great way of studying the internals and understanding undocumented subtleties of a proprietary software.<\/p>\n<h1>References<\/h1>\n<p><a href=\"https:\/\/fritshoogland.wordpress.com\/2018\/02\/27\/a-look-into-oracle-redo-part-5-the-log-writer-writing\/\">[Hoogland 2018]<\/a> <a href=\"https:\/\/fritshoogland.wordpress.com\/about\/\">Frits Hoogland<\/a>. (February 27, 2018). A look into Oracle redo, part 5: the log writer writing<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace <a href=\"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/\" 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":[27,5],"tags":[],"class_list":["post-2918","post","type-post","status-publish","format-standard","hentry","category-gdb","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bad commit Performance due to Slow Control File Writes - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace\" \/>\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\/bad-commit-performance-control-file-writes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bad commit Performance due to Slow Control File Writes - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-08T15:22:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-08T15:22:24+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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Bad commit Performance due to Slow Control File Writes\",\"datePublished\":\"2019-09-08T15:22:22+00:00\",\"dateModified\":\"2019-09-08T15:22:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/\"},\"wordCount\":649,\"commentCount\":8,\"articleSection\":[\"gdb\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/\",\"name\":\"Bad commit Performance due to Slow Control File Writes - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2019-09-08T15:22:22+00:00\",\"dateModified\":\"2019-09-08T15:22:24+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/bad-commit-performance-control-file-writes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bad commit Performance due to Slow Control File Writes\"}]},{\"@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":"Bad commit Performance due to Slow Control File Writes - All-round Database Topics","description":"Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace","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\/bad-commit-performance-control-file-writes\/","og_locale":"en_US","og_type":"article","og_title":"Bad commit Performance due to Slow Control File Writes - All-round Database Topics","og_description":"Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace","og_url":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/","og_site_name":"All-round Database Topics","article_published_time":"2019-09-08T15:22:22+00:00","article_modified_time":"2019-09-08T15:22:24+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Bad commit Performance due to Slow Control File Writes","datePublished":"2019-09-08T15:22:22+00:00","dateModified":"2019-09-08T15:22:24+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/"},"wordCount":649,"commentCount":8,"articleSection":["gdb","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/","url":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/","name":"Bad commit Performance due to Slow Control File Writes - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2019-09-08T15:22:22+00:00","dateModified":"2019-09-08T15:22:24+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Analyzing slow commits with ash_wait_chains.sql, gdb and DTrace","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/bad-commit-performance-control-file-writes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bad commit Performance due to Slow Control File Writes"}]},{"@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\/2918","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=2918"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/2918\/revisions"}],"predecessor-version":[{"id":2942,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/2918\/revisions\/2942"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=2918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=2918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=2918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}