{"id":13969,"date":"2020-05-01T16:05:32","date_gmt":"2020-05-01T14:05:32","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/"},"modified":"2020-05-01T16:05:32","modified_gmt":"2020-05-01T14:05:32","slug":"aws-aurora-xactsync-batch-commit","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/","title":{"rendered":"AWS Aurora IO:XactSync is not a PostgreSQL wait event"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nIn AWS RDS you can run two flavors of the PostgreSQL managed service: the real PostgreSQL engine, compiled from the community sources, and running on EBS storage mounted by the database EC2 instance, and the Aurora which is proprietary and AWS Cloud only, where the upper layer has been taken from the community PostgreSQL. The storage layer in Aurora is completely different.<\/p>\n<p>In <a href=\"https:\/\/www.postgresql.org\/docs\/current\/wal-configuration.html\" rel=\"noopener noreferrer\" target=\"_blank\">PostgreSQL<\/a>, as in most RDBMS except for exclusive fast load operations, the user session backend process writes to shared memory buffers. The write to disk, by the session process or a background writer process, is asynchronous. Because the buffer writes are usually random, they would add latency that would slow the response time if synced immediately. By doing them asynchronously, the user doesn&#8217;t wait on them. And doing them at regular intervals (checkpoints), they can be re-ordered to reduce the seek time and avoid writing the same buffer multiple times. As you don&#8217;t want to lose your committed changes or see the uncommitted ones in case of instance failure, the memory buffer changes are protected by the WAL (Write-Ahead Logging). Even when the session process is performing the write, there&#8217;s no need to sync that to the storage until the end of the transaction. The only place where the end-user must wait for a physical write sync is at commit because we must ensure that the WAL went to durable storage before acknowledging the commit. But those writes being sequential, this log-at-commit should be fast. A well-designed application should not have more than one commit per user interaction and then a few milliseconds is not perceptible. That&#8217;s the idea: write to memory only, without high latency system calls (visible through wait events), and it is only at commit that we can wait for the latency of a physical write, usually on local storage because the goal is to protect from memory loss only, and fast disks because the capacity is under control (only the WAL between two checkpoints is required).<\/p>\n<p><a href=\"https:\/\/www.allthingsdistributed.com\/files\/p1041-verbitski.pdf\" rel=\"noopener noreferrer\" target=\"_blank\">Aurora<\/a> is completely different. For High Availability reasons, the storage is not local but distributed to multiple data centers (3 Availability Zones in the database cluster region). And in order to stay in HA even in case of a full AZ failure, the blocks are mirrored in each AZ. This means that each buffer write is actually written to <a href=\"https:\/\/aws.amazon.com\/blogs\/database\/amazon-aurora-under-the-hood-quorum-and-correlated-failure\/\" rel=\"noopener noreferrer\" target=\"_blank\">6 copies<\/a> on remote storage. That would make the backend, and the writer, too busy to complete the checkpoints. And for this reason, AWS decided to offload this work to the Aurora storage instances. The database instances ships only the WAL (redo log). They apply it locally to maintain their shared buffer, but that stays in memory. All checkpoint and recovery is done by the storage instances (which contains some PostgreSQL code for that). In addition to High Availability, Aurora can expose the storage to some read replicas for performance reasons (scale out the reads). And in order to reduce the time to recover, an instance can be immediately opened even when there&#8217;s still some redo to apply to recover to the point of failure. As the Aurora storage tier is autonomous for this, the redo is applied on the flow when a block is read.<\/p>\n<p>For my Oracle readers, here is how I summarized this once:<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">I need to write more precisely about it but if I had to describe <a href=\"https:\/\/twitter.com\/awscloud?ref_src=twsrc%5Etfw\">@awscloud<\/a> Aurora storage architecture to an <a href=\"https:\/\/twitter.com\/OracleDatabase?ref_src=twsrc%5Etfw\">@OracleDatabase<\/a> DBA, in a Friday tweet, I would say:<\/p>\n<p>You read as if your storage is another RAC node, you write as your storage is a Data Guard standby.<\/p>\n<p>&mdash; Franck Pachot (@FranckPachot) <a href=\"https:\/\/twitter.com\/FranckPachot\/status\/1230916566386126850?ref_src=twsrc%5Etfw\">February 21, 2020<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>A consequence of this Aurora design is the session backend process sending directly the changes (WAL) and wait for sync acknowledge on COMMIT. This obviously adds more latency because all goes on the network, a trade-off between performance and availability. In this blog I&#8217;m showing an example of row-by-row insert running in RDS PostgreSQL and in Aurora PostgreSQL. And new design for writes means new wait event: the XactSync is not a PostgreSQL wait event but an Aurora-only one when synching at commit.<\/p>\n<p>It is usually a bad idea to design an application with too frequent commits. When we have lot of rows to change, better do it in one transaction, or several transactions with intermediate commits, rather than commit each row. The recommendation is even more important in Aurora (and that&#8217;s the main goal of this post). I&#8217;ll run my example with different size of intermediate commit.<\/p>\n<h3>Aurora instance<\/h3>\n<p>I have created an Aurora PostgreSQL 11.6 database running on db.r5large in my lab account. From the default configuration here are the settings I changed: I made it publicly accessible (that&#8217;s a temporary lab), I disabled automatic backups, encryption, performance insights, enhanced monitoring, and deletion protection as I don&#8217;t need them here. A few screenshots from that:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg-1.png\" alt=\"\" width=\"1024\" height=\"436\" class=\"aligncenter size-large wp-image-39062\" \/><\/a><br \/>\nI have created a &#8216;demo&#8217; database and set an easy master password.<\/p>\n<h3>Create table<\/h3>\n<p>I&#8217;ll create a demo table and a my_insert procedure where the first parameter is the number of rows to insert and the second parameter is the commit count (I commit only after this number of rows is inserted):<\/p>\n<pre><code>\ncat &gt; \/tmp\/cre.sql&lt;&lt;&#039;SQL&#039;\ndrop table if exists demo;\ncreate table demo (id int primary key,n int);\ncreate or replace procedure my_insert(rows_per_call int,rows_per_xact int) as $$\ndeclare\n row_counter int :=0;\nbegin for i in 1..rows_per_call loop\n   insert into demo values (i,i);\n   row_counter:=row_counter+1;\n   if row_counter&gt;=rows_per_xact then commit; row_counter:=0; end if;\n end loop; commit; end;\n$$ language plpgsql;\n\\timing on\ntruncate table demo;\n\\x\nselect * from pg_stat_database where datname=&#039;demo&#039;;\nselect * from pg_stat_database where datname=&#039;demo&#039; \\gset\ncall my_insert(1e6::int,1000);\nselect *,tup_inserted-:tup_inserted&quot;+ tup_inserted&quot;,xact_commit-:xact_commit&quot;+ xact_commit&quot; from pg_stat_database where datname=&#039;demo&#039;;\nselect * from pg_stat_database where datname=&#039;demo&#039;;\nselect * from pg_stat_wal_receiver;\nselect * from pg_stat_bgwriter;\ncreate extension pg_stat_statements;\nselect version();\nSQL\n<\/code><\/pre>\n<p>I saved that into  \/tmp\/cre.sql and run it:<\/p>\n<pre><code>\ndb=aur-pg.cluster-crtkf6muowez.us-east-1.rds.amazonaws.com\nPGPASSWORD=FranckPachot psql -p 5432 -h $db -U postgres demo -e &lt; \/tmp\/cre.sql\n<\/code><\/pre>\n<p>Here is the result:<\/p>\n<pre><code>\nselect * from pg_stat_database where datname='demo';\n-[ RECORD 1 ]--+------------------------------\ndatid          | 16400\ndatname        | demo\nnumbackends    | 1\nxact_commit    | 4\nxact_rollback  | 0\nblks_read      | 184\nblks_hit       | 1295\ntup_returned   | 773\ntup_fetched    | 697\ntup_inserted   | 23\ntup_updated    | 0\ntup_deleted    | 0\nconflicts      | 0\ntemp_files     | 0\ntemp_bytes     | 0\ndeadlocks      | 0\nblk_read_time  | 270.854\nblk_write_time | 0\nstats_reset    | 2020-04-26 15:03:30.796362+00\n\nTime: 176.913 ms\nselect * from pg_stat_database where datname='demo'\nTime: 110.739 ms\ncall my_insert(1e6::int,1000);\nCALL\nTime: 17780.118 ms (00:17.780)\nselect *,tup_inserted-23\"+ tup_inserted\",xact_commit-4\"+ xact_commit\" from pg_stat_database where datname='demo';\n-[ RECORD 1 ]--+------------------------------\ndatid          | 16400\ndatname        | demo\nnumbackends    | 1\nxact_commit    | 1017\nxact_rollback  | 0\nblks_read      | 7394\nblks_hit       | 2173956\ntup_returned   | 5123\ntup_fetched    | 839\ntup_inserted   | 1000023\ntup_updated    | 2\ntup_deleted    | 0\nconflicts      | 0\ntemp_files     | 0\ntemp_bytes     | 0\ndeadlocks      | 0\nblk_read_time  | 317.762\nblk_write_time | 0\nstats_reset    | 2020-04-26 15:03:30.796362+00\n+ tup_inserted | 1000000\n+ xact_commit  | 1013\n<\/code><\/pre>\n<p>That validates the statistics I gather: one million insert with a commit every 1000. And the important point: 17.7 seconds to insert those 1000000 rows on Aurora.<\/p>\n<h3>Run on RDS Aurora<\/h3>\n<p>Ok, 17 seconds is not enough for me. In the following tests I&#8217;ll insert 10 million rows. And let&#8217;s start doing that in one big transaction:<\/p>\n<pre><code>\ncat &gt; \/tmp\/run.sql &lt;&lt;&#039;SQL&#039;\ntruncate table demo;\nvacuum demo;\n\\x\nselect * from pg_stat_database where datname=&#039;demo&#039; \\gset\n\\timing on\ncall my_insert(1e7::int,10000000);\n\\timing off\nselect tup_inserted-:tup_inserted&quot;+ tup_inserted&quot;,xact_commit-:xact_commit&quot;+ xact_commit&quot; from pg_stat_database where datname=&#039;demo&#039;;\nSQL\n<\/code><\/pre>\n<p>I run this on my Aurora instance.<\/p>\n<pre><code>\n[opc@b aws]$ PGPASSWORD=FranckPachot psql -p 5432 -h $db -U postgres demo -e &lt; \/tmp\/run.sql\ntruncate table demo;\nTRUNCATE TABLE\nvacuum demo;\nVACUUM\nExpanded display is on.\nselect * from pg_stat_database where datname=&#039;demo&#039;\nTiming is on.\ncall my_insert(1e7::int,10000000);\nCALL\nTime: 133366.305 ms (02:13.366)\nTiming is off.\nselect tup_inserted-35098070&quot;+ tup_inserted&quot;,xact_commit-28249&quot;+ xact_commit&quot; from pg_stat_database where datname=&#039;demo&#039;;\n-[ RECORD 1 ]--+---------\n+ tup_inserted | 10000000\n+ xact_commit  | 62\n<\/code><\/pre>\n<p>This runs the call with 10 million rows with commit every 10 million, which means all in one transaction. The database stats show very few commits (there may be some irrelevant background jobs at the same time). Elapsed time for the inserts: 2:13 minutes.<\/p>\n<p>I did not enable Performance Insight so I&#8217;ll run a dirty active sessions sampling:<\/p>\n<pre><code>\nwhile true ; do echo \"select pg_sleep(0.1);select state,to_char(clock_timestamp(),'hh24:mi:ss'),coalesce(wait_event_type,'-null-'),wait_event,query from pg_stat_activity where application_name='psql' and pid != pg_backend_pid();\" ; done | PGPASSWORD=FranckPachot psql -p 5432 -h $db -U postgres demo | awk -F \"|\" '\/^ *active\/{print &gt; \"\/tmp\/ash.txt\";$2=\"\";c[$0]=c[$0]+1}END{for (i in c){printf \"%8d %s\\n\", c[i],i}}' | sort -n &amp; PGPASSWORD=FranckPachot psql -p 5432 -h $db -U postgres demo -e &lt; \/tmp\/run.sql ; pkill psql\n<\/code><\/pre>\n<p>This runs in the background a query on PG_STAT_ACTIVITY piped to an AWK script to get the number of samples per wait even. No wait event means not waiting (probably ON CPU) and I label it as &#8216;-null-&#8216;.<\/p>\n<p>Here is the result for the same run. 2:15 which proves that there&#8217;s no overhead with my sampling running in another session with plenty of CPU available:<\/p>\n<pre><code>\nExpanded display is on.\nselect * from pg_stat_database where datname='demo'\nTiming is on.\ncall my_insert(1e7::int,10000000);\nCALL\nTime: 135397.016 ms (02:15.397)\nTiming is off.\nselect tup_inserted-45098070\"+ tup_inserted\",xact_commit-28338\"+ xact_commit\" from pg_stat_database where datname='demo';\n-[ RECORD 1 ]--+----\n+ tup_inserted | 0\n+ xact_commit  | 819\n\n[opc@b aws]$\n       1  active    IO         XactSync     call my_insert(1e7::int,10000000);\n      30  active    IO         WALWrite     call my_insert(1e7::int,10000000);\n     352  active    -null-                  call my_insert(1e7::int,10000000);\n[opc@b aws]$\n<\/code><\/pre>\n<p>Most of the time (92% of pg_stat_activity samples) my session is not on a wait event, which means running in CPU. 8% of the samples are &#8220;WALWrite&#8221; and only one sample &#8220;XactSync&#8221;.<\/p>\n<p>This &#8220;XactSync&#8221; is something that you cannot find in <a href=\"https:\/\/www.postgresql.org\/docs\/current\/monitoring-stats.html\" rel=\"noopener noreferrer\" target=\"_blank\">PostgreSQL documentation<\/a> but in <a href=\"https:\/\/docs.aws.amazon.com\/AmazonRDS\/latest\/AuroraUserGuide\/AuroraPostgreSQL.Reference.html\" rel=\"noopener noreferrer\" target=\"_blank\">Aurora documentation<\/a>:<br \/>\n<em>IO:XactSync &#8211; In this wait event, a session is issuing a COMMIT or ROLLBACK, requiring the current transaction\u2019s changes to be persisted. Aurora is waiting for Aurora storage to acknowledge persistence.<\/em><\/p>\n<p>The WALWrite is the session process sending the WAL but not waiting for acknowledge (this is my guess from the small wait samples as I&#8217;ve not seen this internal Aurora behaviour documented).<\/p>\n<p>I&#8217;ll now run with different commit size, starting from the maximum (all in one transaction) down to commit every 100 rows. I&#8217;m copying only the interesting parts: the elapsed time and the wait event sample count:<\/p>\n<pre><code>\ncall my_insert(1e7::int,1e7::int);\nCALL\nTime: 135868.757 ms (02:15.869)\n\n       1  active    -null-                  vacuum demo;\n      44  active    IO         WALWrite     call my_insert(1e7::int,1e7::int);\n     346  active    -null-                  call my_insert(1e7::int,1e7::int);\n\ncall my_insert(1e7::int,1e6::int);\nCALL\nTime: 136080.102 ms (02:16.080)\n\n       3  active    IO         XactSync     call my_insert(1e7::int,1e6::int);\n      38  active    IO         WALWrite     call my_insert(1e7::int,1e6::int);\n     349  active    -null-                  call my_insert(1e7::int,1e6::int);\n\ncall my_insert(1e7::int,1e5::int);\nCALL\nTime: 133373.694 ms (02:13.374)\n\n\n      30  active    IO         XactSync     call my_insert(1e7::int,1e5::int);\n      35  active    IO         WALWrite     call my_insert(1e7::int,1e5::int);\n     315  active    -null-                  call my_insert(1e7::int,1e5::int);\n\ncall my_insert(1e7::int,1e4::int);\nCALL\nTime: 141820.013 ms (02:21.820)\n\n      32  active    IO         WALWrite     call my_insert(1e7::int,1e4::int);\n      91  active    IO         XactSync     call my_insert(1e7::int,1e4::int);\n     283  active    -null-                  call my_insert(1e7::int,1e4::int);\n\ncall my_insert(1e7::int,1e3::int);\nCALL\nTime: 177596.155 ms (02:57.596)\n\n       1  active    -null-                  select tup_inserted-95098070\"+ tup_inserted\",xact_commit-33758\"+ xact_commit\" from pg_stat_database where datname='demo';\n      32  active    IO         WALWrite     call my_insert(1e7::int,1e3::int);\n     250  active    IO         XactSync     call my_insert(1e7::int,1e3::int);\n     252  active    -null-                  call my_insert(1e7::int,1e3::int);\n\ncall my_insert(1e7::int,1e2::int);\nCALL\nTime: 373504.413 ms (06:13.504)\n\n      24  active    IO         WALWrite     call my_insert(1e7::int,1e2::int);\n     249  active    -null-                  call my_insert(1e7::int,1e2::int);\n     776  active    IO         XactSync     call my_insert(1e7::int,1e2::int);\n\n<\/code><\/pre>\n<p>Even if the frequency of XactSync is increasing with the number of commits, the elapsed is nearly the same when the commit size is higher than ten thousand rows. Then it quickly increases and committing every 100 rows only brings the elapsed time to 6 minutes with 74% of the time waiting on XactSync.<\/p>\n<p>This wait event being specific to the way Aurora foreground process sends the redo to the storage, through the network, I&#8217;ll run the same with a normal PostgreSQL (RDS) running on mounted block storage (EBS).<\/p>\n<p>I&#8217;m adding here some CloudWatch metrics during those runs, starting at 11:30 with large commit size down to row-by-row commit still running at 12:00<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CloudWatch-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CloudWatch-1.png\" alt=\"\" width=\"1024\" height=\"790\" class=\"aligncenter size-large wp-image-39240\" \/><\/a>.<\/p>\n<p>As you can see I&#8217;ve added the ones for the next test with RDS PostgreSQL running the same between 12:15 and 12:30 which is detailed in the next post:  <a href=\"https:\/\/dev.to\/aws-heroes\/aws-aurora-vs-rds-postgresql-on-frequent-commits-27c6\">https:\/\/www.dbi-services.com\/blog\/aws-aurora-vs-rds-postgresql\/<\/a>. Interpreting those results is beyond the scope of this blog post. We have seen that in the frequent commit run most of the time is on IO:XactSync wait event. However, CloudWatch shows 50% CPU utilization which means, for r5.large, one thread always in CPU. This is not exactly what I expect with a wait event. But, quoting Kevin Closson, everything is a CPU problem, isn&#8217;t it?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . In AWS RDS you can run two flavors of the PostgreSQL managed service: the real PostgreSQL engine, compiled from the community sources, and running on EBS storage mounted by the database EC2 instance, and the Aurora which is proprietary and AWS Cloud only, where the upper layer has been taken from [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":13972,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1865,83],"tags":[1871,133,1914,570,77,1915],"type_dbi":[],"class_list":["post-13969","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws","category-postgresql","tag-aurora","tag-aws","tag-ioxactsync","tag-postgres","tag-postgresql","tag-walwrite"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>AWS Aurora IO:XactSync is not a PostgreSQL wait event - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS Aurora IO:XactSync is not a PostgreSQL wait event\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . In AWS RDS you can run two flavors of the PostgreSQL managed service: the real PostgreSQL engine, compiled from the community sources, and running on EBS storage mounted by the database EC2 instance, and the Aurora which is proprietary and AWS Cloud only, where the upper layer has been taken from [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-01T14:05:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1366\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Open source Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Open source Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\"},\"author\":{\"name\":\"Open source Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b\"},\"headline\":\"AWS Aurora IO:XactSync is not a PostgreSQL wait event\",\"datePublished\":\"2020-05-01T14:05:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\"},\"wordCount\":1398,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png\",\"keywords\":[\"Aurora\",\"AWS\",\"IO:XactSync\",\"postgres\",\"PostgreSQL\",\"WALWrite\"],\"articleSection\":[\"AWS\",\"PostgreSQL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\",\"name\":\"AWS Aurora IO:XactSync is not a PostgreSQL wait event - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png\",\"datePublished\":\"2020-05-01T14:05:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png\",\"width\":2048,\"height\":1366},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS Aurora IO:XactSync is not a PostgreSQL wait event\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b\",\"name\":\"Open source Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"caption\":\"Open source Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"AWS Aurora IO:XactSync is not a PostgreSQL wait event - dbi Blog","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:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/","og_locale":"en_US","og_type":"article","og_title":"AWS Aurora IO:XactSync is not a PostgreSQL wait event","og_description":"By Franck Pachot . In AWS RDS you can run two flavors of the PostgreSQL managed service: the real PostgreSQL engine, compiled from the community sources, and running on EBS storage mounted by the database EC2 instance, and the Aurora which is proprietary and AWS Cloud only, where the upper layer has been taken from [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/","og_site_name":"dbi Blog","article_published_time":"2020-05-01T14:05:32+00:00","og_image":[{"width":2048,"height":1366,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png","type":"image\/png"}],"author":"Open source Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Open source Team","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/"},"author":{"name":"Open source Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b"},"headline":"AWS Aurora IO:XactSync is not a PostgreSQL wait event","datePublished":"2020-05-01T14:05:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/"},"wordCount":1398,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png","keywords":["Aurora","AWS","IO:XactSync","postgres","PostgreSQL","WALWrite"],"articleSection":["AWS","PostgreSQL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/","url":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/","name":"AWS Aurora IO:XactSync is not a PostgreSQL wait event - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png","datePublished":"2020-05-01T14:05:32+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aur-pg.png","width":2048,"height":1366},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/aws-aurora-xactsync-batch-commit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AWS Aurora IO:XactSync is not a PostgreSQL wait event"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b","name":"Open source Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","caption":"Open source Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=13969"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13969\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/13972"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13969"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}