PostgresSQL vs super pages

Mark Johnston markj at freebsd.org
Sun Oct 14 22:33:59 UTC 2018


On Sun, Oct 14, 2018 at 02:45:44PM +0300, Konstantin Belousov wrote:
> On Sun, Oct 14, 2018 at 10:58:08PM +1300, Thomas Munro wrote:
> > On Sun, 14 Oct 2018 at 12:50, Konstantin Belousov <kostikbel at gmail.com> wrote:
> > > On Thu, Oct 11, 2018 at 02:01:20PM +1300, Thomas Munro wrote:
> > > > On Thu, 11 Oct 2018 at 13:20, Konstantin Belousov <kostikbel at gmail.com> wrote:
> > > > > On Thu, Oct 11, 2018 at 12:59:41PM +1300, Thomas Munro wrote:
> > > > > > shm_open("/PostgreSQL.1721888107",O_RDWR|O_CREAT|O_EXCL,0600) = 46 (0x2e)
> > > > > > ftruncate(46,0x400000)                           = 0 (0x0)
> > > > > Try to write zeroes instead of truncating.
> > > > > This should activate the fast path in the fault handler, and if the
> > > > > pages allocated for backing store of the shm object were from reservation,
> > > > > you should get superpage mapping on the first fault without promotion.
> > > >
> > > > If you just write() to a newly shm_open()'d fd you get a return code
> > > > of 0 so I assume that doesn't work.  If you ftruncate() to the desired
> > > > size first, then loop writing 8192 bytes of zeroes at a time, it
> > > > works.  But still no super pages.  I tried also with a write buffer of
> > > > 2MB of zeroes, but still no super pages.  I tried abandoning
> > > > shm_open() and instead using a mapped file, and still no super pages.
> > >
> > > I did not quite scientific experiment, but you would need to try to find
> > > the differences between what I did and what you observe.  Below is the
> > > naive test program that directly implements my suggestion, and the
> > > output from the procstat -v for it after all things were set up.
> > >
> > ...
> > > 98579        0x800e00000        0x801200000 rw- 1024 1030   3   0 --S- df
> > 
> > Huh.  Your program doesn't result in an S mapping on my laptop, but I
> > tried on an EC2 t2.2xlarge machine and there it promotes to S, even if
> > I comment out the write() loop (the loop that assigned to every byte
> > is enough).  The difference might be the amount of memory on the
> > system: on my 4GB laptop, it is very reluctant to use super pages (but
> > I have seen it do it, so I know it can).  On a 32GB system, it does it
> > immediately, and it works nicely for PostgreSQL too.  So perhaps my
> > problem is testing on a small RAM system, though I don't understand
> > why.
> How many free memory does your system have ? Free as reported by top. If
> the free memory is low and fragmented, and I suppose it is on 4G laptop
> which you use with X, browser and other memory-consuming applications,
> system would have troubles filling the reverve, i.e reserving 2M of
> 2M-aligned physical pages.

BTW, this can be explicitly verified with the sysctl vm.phys_free
sysctl.  Superpage promotion requires free 2MB chunks from freelist 0,
pool 0.

> 
> You can try the test programs right after booting into single user mode.


More information about the freebsd-hackers mailing list