Re: Enabling Checksums

Heikki Linnakangas <hlinnakangas@vmware.com>

From: Heikki Linnakangas <hlinnakangas@vmware.com>
To: Kevin Grittner <kgrittn@ymail.com>, Simon Riggs <simon@2ndquadrant.com>
Cc: Jeff Davis <pgsql@j-davis.com>, Ants Aasma <ants@cybertec.at>, Bruce Momjian <bruce@momjian.us>, Greg Smith <greg@2ndquadrant.com>, PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2013-04-06T07:40:55Z
Lists: pgsql-hackers
On 05.04.2013 23:25, Kevin Grittner wrote:
> Jeff Davis<pgsql@j-davis.com>  wrote:
>> Also, the first version doesn't necessarily need to perform well;
>> we can leave optimization as future work.
>
> +1, as long as we don't slow down instances not using the feature,
> and we don't paint ourselves into a corner.

Speaking of which: I did some profiling yesterday of a test case that's 
heavy on WAL insertions, without checksums. I saw BufferGetLSNAtomic 
consuming 1.57% of the CPU time. That's not much, but it's clearly 
additional overhead caused by the checksums patch:

Events: 6K cycles 

+  26,60%  postmaster  postgres           [.] XLogInsert
+   6,15%  postmaster  postgres           [.] LWLockAcquire
+   4,74%  postmaster  postgres           [.] LWLockRelease
+   2,47%  postmaster  postgres           [.] PageAddItem
+   2,19%  postmaster  postgres           [.] ReadBuffer_common
+   2,18%  postmaster  postgres           [.] heap_fill_tuple
+   1,95%  postmaster  postgres           [.] ExecNestLoop
+   1,89%  postmaster  postgres           [.] ExecModifyTable
+   1,85%  postmaster  postgres           [.] heap_insert
+   1,82%  postmaster  postgres           [.] heap_prepare_insert
+   1,79%  postmaster  postgres           [.] heap_form_tuple
+   1,76%  postmaster  postgres           [.] RelationGetBufferForTuple
+   1,75%  postmaster  libc-2.13.so       [.] __memcpy_ssse3
+   1,73%  postmaster  postgres           [.] PinBuffer
+   1,67%  postmaster  postgres           [.] hash_any
+   1,64%  postmaster  postgres           [.] ExecProcNode
+   1,63%  postmaster  postgres           [.] RelationPutHeapTuple
+   1,57%  postmaster  postgres           [.] BufferGetLSNAtomic
+   1,51%  postmaster  postgres           [.] ExecProject
+   1,42%  postmaster  postgres           [.] hash_search_with_hash_value
+   1,34%  postmaster  postgres           [.] AllocSetAlloc
+   1,21%  postmaster  postgres           [.] UnpinBuffer
+   1,19%  postmaster  [kernel.kallsyms]  [k] copy_user_generic_string
+   1,13%  postmaster  postgres           [.] MarkBufferDirty
+   1,07%  postmaster  postgres           [.] ExecScan
+   1,00%  postmaster  postgres           [.] ExecMaterializeSlot

AFAICS that could be easily avoided by doing a simple PageGetLSN() like 
we used to, if checksums are not enabled. In XLogCheckBuffer:

> 	/*
> 	 * XXX We assume page LSN is first data on *every* page that can be passed
> 	 * to XLogInsert, whether it otherwise has the standard page layout or
> 	 * not. We don't need the buffer header lock for PageGetLSN because we
> 	 * have exclusive lock on the page and/or the relation.
> 	 */
> 	*lsn = BufferGetLSNAtomic(rdata->buffer);

Also, the second sentence in the above comment is completely bogus now.

- Heikki