@ -35,6 +35,7 @@
# include "access/clog.h"
# include "access/slru.h"
# include "access/transam.h"
# include "miscadmin.h"
# include "pg_trace.h"
/*
@ -409,6 +410,34 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
return status ;
}
/*
* Number of shared CLOG buffers .
*
* Testing during the PostgreSQL 9.2 development cycle revealed that on a
* large multi - processor system , it was possible to have more CLOG page
* requests in flight at one time than the numebr of CLOG buffers which existed
* at that time , which was hardcoded to 8. Further testing revealed that
* performance dropped off with more than 32 CLOG buffers , possibly because
* the linear buffer search algorithm doesn ' t scale well .
*
* Unconditionally increasing the number of CLOG buffers to 32 did not seem
* like a good idea , because it would increase the minimum amount of shared
* memory required to start , which could be a problem for people running very
* small configurations . The following formula seems to represent a reasonable
* compromise : people with very low values for shared_buffers will get fewer
* CLOG buffers as well , and everyone else will get 32.
*
* It is likely that some further work will be needed here in future releases ;
* for example , on a 64 - core server , the maximum number of CLOG requests that
* can be simultaneously in flight will be even larger . But that will
* apparently require more than just changing the formula , so for now we take
* the easy way out .
*/
Size
CLOGShmemBuffers ( void )
{
return Min ( 32 , Max ( 4 , NBuffers / 512 ) ) ;
}
/*
* Initialization of shared memory for CLOG
@ -416,14 +445,14 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
Size
CLOGShmemSize ( void )
{
return SimpleLruShmemSize ( NUM_CLOG_BUFFERS , CLOG_LSNS_PER_PAGE ) ;
return SimpleLruShmemSize ( CLOGShmemBuffers ( ) , CLOG_LSNS_PER_PAGE ) ;
}
void
CLOGShmemInit ( void )
{
ClogCtl - > PagePrecedes = CLOGPagePrecedes ;
SimpleLruInit ( ClogCtl , " CLOG Ctl " , NUM_CLOG_BUFFERS , CLOG_LSNS_PER_PAGE ,
SimpleLruInit ( ClogCtl , " CLOG Ctl " , CLOGShmemBuffers ( ) , CLOG_LSNS_PER_PAGE ,
CLogControlLock , " pg_clog " ) ;
}