Re: [HACKERS] WAL logging problem in 9.4.3?
Noah Misch <noah@leadboat.com>
Attachments
- wal-optimize-noah-tests-v3.patch (text/x-diff) patch v3
[Casual readers with opinions on GUC naming: consider skipping to the end.] MarkBufferDirtyHint() writes WAL even when rd_firstRelfilenodeSubid or rd_createSubid is set; see attached test case. It needs to skip WAL whenever RelationNeedsWAL() returns false. On Tue, Aug 27, 2019 at 03:49:32PM +0900, Kyotaro Horiguchi wrote: > At Sun, 25 Aug 2019 22:08:43 -0700, Noah Misch <noah@leadboat.com> wrote in <20190826050843.GB3153606@rfd.leadboat.com> > > Consider a one-page relfilenode. Doing all the things you list for a single > > page may be cheaper than locking millions of buffer headers. > > If I understand you correctly, I would say that *all* buffers > that don't belong to in-transaction-created files are skipped > before taking locks. No lock conflict happens with other > backends. > > FlushRelationBuffers uses double-checked-locking as follows: I had misread the code; you're right. > > This should be GUC-controlled, especially since this is back-patch material. > > Is this size of patch back-patchable? Its size is not an obstacle. It's not ideal to back-patch such a user-visible performance change, but it would be worse to leave back branches able to corrupt data during recovery. On Wed, Aug 28, 2019 at 03:42:10PM +0900, Kyotaro Horiguchi wrote: > - Use log_newpage instead of fsync for small tables. > I'm trying to measure performance difference on WAL/fsync. I would measure it with simultaneous pgbench instances: 1. DDL pgbench instance repeatedly creates and drops a table of X kilobytes, using --rate to make this happen a fixed number of times per second. 2. Regular pgbench instance runs the built-in script at maximum qps. For each X, try one test run with effective_io_block_size = X-1 and one with effective_io_block_size = X. If the regular pgbench instance gets materially higher qps with effective_io_block_size = X-1, the ideal default is <X. Otherwise, the ideal default is >=X. > + <varlistentry id="guc-effective-io-block-size" xreflabel="effective_io_block_size"> > + <term><varname>effective_io_block_size</varname> (<type>integer</type>) > + <indexterm> > + <primary><varname>effective_io_block_size</varname> configuration parameter</primary> > + </indexterm> > + </term> > + <listitem> > + <para> > + Specifies the expected maximum size of a file for which <function>fsync</function> returns in the minimum required duration. It is approximately the size of a track or sylinder for magnetic disks. > + The value is specified in kilobytes and the default is <literal>64</literal> kilobytes. > + </para> > + <para> > + When <xref linkend="guc-wal-level"/> is <literal>minimal</literal>, > + WAL-logging is skipped for tables created in-trasaction. If a table > + is smaller than that size at commit, it is WAL-logged instead of > + issueing <function>fsync</function> on it. > + > + </para> > + </listitem> > + </varlistentry> Cylinder and track sizes are obsolete as user-visible concepts. (They're not constant for a given drive, and I think modern disks provide no way to read the relevant parameters.) I like the name "wal_skip_threshold", and my second choice would be "wal_skip_min_size". Possibly documented as follows: When wal_level is minimal and a transaction commits after creating or rewriting a permanent table, materialized view, or index, this setting determines how to persist the new data. If the data is smaller than this setting, write it to the WAL log; otherwise, use an fsync of the data file. Depending on the properties of your storage, raising or lowering this value might help if such commits are slowing concurrent transactions. The default is 64 kilobytes (64kB). Any other opinions on the GUC name?
Commits
-
Add perl2host call missing from a new test file.
- 70de4e950c3b 13.0 landed
-
Skip WAL for new relfilenodes, under wal_level=minimal.
- c6b92041d385 13.0 landed
- 9db4b9da2801 9.5.22 landed
- a653bd8aa76e 9.6.18 landed
- 9d6215205e5a 10.13 landed
- 03b89f1949a9 11.8 landed
- e4b0a02ef8c8 12.3 landed
- cb2fd7eac285 13.0 landed
-
Revert "Skip WAL for new relfilenodes, under wal_level=minimal."
- b31e96ba420f 9.5.22 landed
- 348f15e22e94 9.6.18 landed
- 0a6c9c66da26 10.13 landed
- 63631ee64f84 12.3 landed
- 2fbdebc248ec 11.8 landed
- de9396326edc 13.0 landed
-
Back-patch log_newpage_range().
- e0dd086414f7 9.5.22 landed
- 14d2bb4941e6 9.6.18 landed
- 43434ed94d80 10.13 landed
- ae86e46c3b7b 11.8 landed
-
During heap rebuild, lock any TOAST index until end of transaction.
- a8f754aea014 9.6.18 landed
- 978da2a95597 9.5.22 landed
- 78a34c68920a 10.13 landed
- 88b3a6cd2623 12.3 landed
- 4433c6e8c0a5 11.8 landed
- e629a01f6973 13.0 landed
-
In log_newpage_range(), heed forkNum and page_std arguments.
- a5abec521c5d 12.3 landed
- d3e572855be1 13.0 landed
-
Back-patch src/test/recovery and PostgresNode from 9.6 to 9.5.
- 12034da6cc39 9.5.22 landed
-
Reduce pg_ctl's reaction time when waiting for postmaster start/stop.
- c61559ec3a41 10.0 cited
-
Accelerate end-of-transaction dropping of relations
- 279628a0a7cf 9.3.0 cited
-
Redesign the planner's handling of index-descent cost estimation.
- 31f38f28b00c 9.3.0 cited
-
Make TRUNCATE do truncate-in-place when processing a relation that was created
- cab9a0656c36 9.0.0 cited