Re: Memory Leak executing small queries without closing the connection - FreeBSD - Mailing list pgsql-general

From Gerhard Wiesinger
Subject Re: Memory Leak executing small queries without closing the connection - FreeBSD
Date
Msg-id 566D902C.3000504@wiesinger.com
Whole thread Raw
In response to Re: Memory Leak executing small queries without closing the connection - FreeBSD  (Bill Moran <wmoran@potentialtech.com>)
Responses Re: Memory Leak executing small queries without closing the connection - FreeBSD  (Bill Moran <wmoran@potentialtech.com>)
Re: Memory Leak executing small queries without closing the connection - FreeBSD  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
Hello Bill,

Thank you for your response, comments inline:

On 13.12.2015 16:05, Bill Moran wrote:
> On Sun, 13 Dec 2015 09:57:21 +0100
> Gerhard Wiesinger <lists@wiesinger.com> wrote:
>> some further details from the original FreeBSD 10.1 machine:
>>
>> Mem: 7814M Active, 20G Inact, 2982M Wired, 232M Cache, 1661M Buf, 30M Free
>> Swap: 512M Total, 506M Used, 6620K Free, 98% Inuse
>>
>>     PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME WCPU COMMAND
>> 77941 pgsql         5  20    0  7925M  7296M usem    2 352:34 6.98%
>> postgres: username dbnamee 127.0.0.1(43367)  (postgres)
> <snip>
>
> I see no evidence of an actual leak here. Each process is basically using
> the 7G of shared_buffers you have allocated in the config (which is only
> 7G _total_ for all processes, since it's shared memory)

OK, but why do we then get: kernel: swap_pager_getswapspace(4): failed?

>> Out of memory:
>> kernel: swap_pager_getswapspace(4): failed
>> kernel: swap_pager_getswapspace(8): failed
>> kernel: swap_pager_getswapspace(3): failed
>>
>> Main issue is IHMO (as far as I understood the FreeBSD Memory system)
>> that 20G are INACTIVE. When I subtract the shared memory, even ~13GB
>> should be available, but they are still allocated but inactive
>> (INACTIVE). INACTIVE memory might be clean or dirty. As we get into out
>> of memory situations it is likely that the memory is dirty (otherwise it
>> would have been reused).
> Not quite correct. Inactive memory is _always_ available for re-use.

Are you sure that's true?

Monitoring inactive memory:
cat vm_stat.sh
#!/usr/bin/env bash

while [ 1 ]; do
   date +%Y.%m.%d.%H.%M.%S
   sysctl -a | grep vm.stats.vm.
   sleep 1
done

And even we get out of memory with swap_pager_getswapspace Inactive
Memory (from the log file) is around 20GB (doesn't go down or up)
vm.stats.vm.v_inactive_count: 5193530 (*4k pages is around 20GB)

Then we have 20GB inactive memory, but we still get out of memory with
kernel: swap_pager_getswapspace(4): failed. Any ideas why?

>
>> Config:
>> Memory: 32GB, Swap: 512MB
> Probably not the cause of this problem, but this is a non-optimal layout.
> If you're going to use swap at all, it should generally be 2x the size of
> your RAM for optimal performance under memory pressure.

Yes, we will try to disable it totally. Nevertheless why do we get out
of memory/Swap?

>
>> maintenance_work_mem = 512MB
>> effective_cache_size = 10GB
>> work_mem = 892MB
> I expect that this value is the cause of the problem. The scenario you
> describe below is sorting a large table on an unindexed column, meaning
> it will have to use all that work_mem. I'd be interested to see the
> output of:
>
> EXPLAIN ANALYZE SELECT * FROM t_random ORDER BY md5 LIMIT 100000;

That was only a test query, has nothing to do with production based
query. They are mostly SELECT/INSERTS/UPDATES on primary keys.

> But even without that information, I'd recommend you reduce work_mem
> to about 16M or so.

Why so low? E.g. sorting on reporting or some long running queries are
then done on disk and not in memory.

>> wal_buffers = 8MB
>> checkpoint_segments = 16
>> shared_buffers = 7080MB
>> max_connections = 80
>> autovacuum_max_workers = 3
> [snip]
>
>>> We are running PostgreSQL 9.4.5 on FreeBSD 10.1 and have multiple
>>> worker processes connected via persistent connections to PostgreSQL,
>>> they perform just simple queries with SELECT on primary keys and
>>> simple INSERTS/UPDATES.
> That's not at all the test scenario you show below. The scenario below
> is a large sort operation on a non-indexed column, which is vastly
> different than a single-row fetch based on an index.

Yes, that non indexed select was just for testing purporeses.

>
>>> Normally nearly all the workers are idle but
>>> they still consume the maximum configured work mem on the PostgreSQL
>>> server and the memory is also resident.
> I see no evidence of that in your top output. Each process has a
> reference to the 7G of shared_buffers you allocated, which is memory
> shared by all processes, and is expected. I'm not as familiar with
> Linux top, but the results appear to be the same.

Yes, might be the case, but if it is n times 7G shared memory then we
have ~20GB Inactive Memory available, so plenty of memory. And why are
we getting: kernel: swap_pager_getswapspace(4): failed?

Thnx.

Ciao,
Gerhard



pgsql-general by date:

Previous
From: Bill Moran
Date:
Subject: Re: Memory Leak executing small queries without closing the connection - FreeBSD
Next
From: Bill Moran
Date:
Subject: Re: Memory Leak executing small queries without closing the connection - FreeBSD