Re: Changing shared_buffers without restart - Mailing list pgsql-hackers
From | Ashutosh Bapat |
---|---|
Subject | Re: Changing shared_buffers without restart |
Date | |
Msg-id | CAExHW5uGozdiDm_BefS7jpQzaisCs4_nLTMF0+S_Pds49pRG_w@mail.gmail.com Whole thread Raw |
In response to | Re: Changing shared_buffers without restart (Dmitry Dolgov <9erthalion6@gmail.com>) |
Responses |
Re: Changing shared_buffers without restart
Re: Changing shared_buffers without restart |
List | pgsql-hackers |
Hi Dmitry, On Mon, Apr 14, 2025 at 12:50 PM Dmitry Dolgov <9erthalion6@gmail.com> wrote: > > > On Mon, Apr 14, 2025 at 10:40:28AM GMT, Ashutosh Bapat wrote: > > > > However, when we put back the patches to shrink buffers, we will evict > > the extra buffers, and shrink - if all the processes haven't > > participated in the barrier by then, some of them may try to access > > those buffers - re-installing them and then bad things can happen. > > As I've mentioned above, I don't see how a process could try to access a > buffer, if it's on the path between receiving the ProcSignalBarrier and > attaching to the global shmem Barrier, even if we shrink buffers. > AFAICT interrupt handles should not touch buffers, and otherwise the > process doesn't have any point withing this window where it might do > this. Do you have some particular scenario in mind? > > > I might have not noticed it, but are we putting two mappings one > > reserved and one allocated in the same address space, so that when the > > allocated mapping shrinks or expands, the reserved mapping continues > > to prohibit any other mapping from appearing there? I looked at some > > of the previous emails, but didn't find anything that describes how > > the reserved mapped space is managed. > > I though so, but this turns out to be incorrect. Just have done a small > experiment -- looks like when reserving some space, mapping and > unmapping a small segment from it leaves a non-mapped gap. That would > mean for shrinking the new available space has to be reserved again. In an offlist chat Thomas Munro mentioned that just ftruncate() would be enough to resize the shared memory without touching address maps using mmap and munmap(). ftruncate man page seems to concur with him If the effect of ftruncate() is to decrease the size of a memory mapped file or a shared memory object and whole pages beyond the new end were previously mapped, then the whole pages beyond the new end shall be discarded. References to discarded pages shall result in the generation of a SIGBUS signal. If the effect of ftruncate() is to increase the size of a memory object, it is unspecified whether the contents of any mapped pages between the old end-of-file and the new are flushed to the underlying object. ftruncate() when shrinking memory will release the extra pages and also would cause segmentation fault when memory outside the size of file is accessed even if the actual address map is larger than the mapped file. The expanded memory is allocated as it is written to, and those pages also become visible in the underlying object. I played with the attached small program under debugger observing pmap and /proc/<pid>/status after every memory operation. The address map always shows that it's as long as 300K memory. 00007fffd2200000 307200K rw-s- memfd:mmap_fd_exp (deleted) Immediately after mmap() RssShmem: 0 kB after first memset RssShmem: 307200 kB after ftruncate to 100MB (we don't need to wait for memset() to see the effect on RssShmem) RssShmem: 102400 kB after ftruncate to 200MB (requires memset to see effect on RssShmem) RssShmem: 102400 kB after memsetting upto 200MB RssShmem: 204800 kB All the observations concur with the man page. [1] https://man7.org/linux/man-pages/man3/ftruncate.3p.html#:~:text=If%20the%20effect%20of%20ftruncate,generation%20of%20a%20SIGBUS%20signal. -- Best Wishes, Ashutosh Bapat
pgsql-hackers by date: