pg.ddx.io  pgsql-admin@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Chris Lajoie <chris@etriptrader.com>
To: Kevin Grittner <kgrittn@gmail.com>
Cc: pgsql-admin@postgresql.org <pgsql-admin@postgresql.org>
Subject: Re: Getting OOM errors from PostgreSQL
Date: Mon, 7 Mar 2016 11:30:35 -0700
Message-ID: <56DDC8CB.8050204@etriptrader.com> (raw)
In-Reply-To: <CACjxUsNYmhsMXfNfEFh7qNTr7fOYPVfxsXLWnQ4Axcjjrqn9OA@mail.gmail.com>
References: <77b989891467460b9e1dede8fedd25f1@etriptrader.com>
	<CACjxUsNYmhsMXfNfEFh7qNTr7fOYPVfxsXLWnQ4Axcjjrqn9OA@mail.gmail.com>
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-admin>

On 03/05/2016 09:12 AM, Kevin Grittner wrote:
> On Fri, Mar 4, 2016 at 3:23 PM, Chris Lajoie <chris@etriptrader.com> wrote:
>> In my log I have been getting errors that look like this:
>> LOG:  could not fork new process for connection: Cannot allocate memory
>>
>> This seems to only happen during periods of high activity.
>> Shortly after the last one occurred I checked the free mem and got
>> this:
>> # free -h
>>                total        used        free      shared    buff/cache   available
>> Mem:           9.4G        737M        283M        2.1G          8.4G        6.3G
>> Swap:          2.0G        8.3M        2.0G
>>
>>  From this I see the vast majority of the 10GB of memory is being
>> used by the OS cache. If I understand how it works correctly, this
>> means it is basically free memory because if an application needs
>> it the kernel will free some of it for use... is my understanding
>> correct?
> That depends.  In general, this report is light on useful detail;
> you might want to review this page and fill in some of the missing
> info, like OS version:
>
> https://wiki.postgresql.org/wiki/Guide_to_reporting_problems
Appologies for not providing more useful info. I will endeavor to do so 
in the future.
> The most important missing information can be captured by running
> these shell statements:
>
> cat /proc/sys/vm/overcommit_memory
> cat /proc/sys/vm/overcommit_ratio
>
> If overcommit_memory is 2, you will get "out of memory" when an
> allocation would push allocated memory past swap space (2GB in your
> case) plus the percentage of machine RAM indicated by
> overcommit_ratio.  Effectively, the difference between
> overcommit_ratio and 100 is the percentage of RAM you are reserving
> for the OS to keep things memory-resident (like buffers and cache).
> A value of 20, for example, would mean that an allocation that
> would reduce OS memory-resident pages below 80% of machine RAM will
> trigger an "out of memory" error; so when you set
> vm.overcommit_memory = 2 (which is generally a very good thing to
> do when running PostgreSQL on the machine) you should raise
> vm.overcommit_ratio = 80 or 90.  You don't want to totally blow
> away OS cache, but you probably want to survive other demands on
> RAM that bring it down quite a bit.
Despite not having provided more information you seem to have gotten to 
the crux of my problem anyway. As I was a little desperate to resolve 
the problem, I ended up changing various things in an attempt to just 
"make it go away" for now. I set overcommit_memory back to 0 and 
shared_buffers = 500MB. I believe this has the effect of just allowing 
the OS to cache things as it sees fit, and only reserving 500MB for 
postgres to explicitly cache whatever it wants. But I did not have any 
more OOM errors over the weekend.

Your explanation of how overcommit_ratio affects what the OS will allow 
when overcommit_memory=2 is enlightening, but I am still not clear on 
some specifics. For example I thought postgres allocates the shared 
buffers on startup. If this is the case, why did I get OOM errors on 
connections? Was that particular connection simply pushing the memory 
past the amount established by the overcommit_ratio? overcommit_ratio 
was at its default (which is apparently 50 looking at 
/proc/sys/vm/overcommit_ratio).

At this point I am not sure if I should change anything... I have seen 
conflicting advice at various places on the internet. Some suggest 
(assuming this is a dedicated database system) to use up a large chunk 
of RAM with shared_buffers, leaving enough for work_mem*max_connections 
+ some extra. Others suggest allowing the OS to cache what it wants and 
set shared_buffers to a smaller amount, allowing postgres to permanently 
cache only the most frequently accessed smaller tables.

I would greatly appreciate your advice on this.
I am running PostgreSQL 9.4.6 on Linux kernel 3.10 (CentOS 7).

Thank you,
Chris





-- 
Sent via pgsql-admin mailing list (pgsql-admin@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-admin



view thread (5+ messages)  latest in thread

Message-ID: <56DDC8CB.8050204@etriptrader.com>
Permalink:  ../56DDC8CB.8050204@etriptrader.com/
Also on:    postgresql.org/message-id/56DDC8CB.8050204@etriptrader.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-admin@postgresql.org
  Cc: chris@etriptrader.com, kgrittn@gmail.com
  Subject: Re: Getting OOM errors from PostgreSQL
  In-Reply-To: <56DDC8CB.8050204@etriptrader.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox