mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Add some simple support and documentation for using process-specific oom_adj
settings to prevent the postmaster from being OOM-killed on Linux systems. Alex Hunsaker and Tom Lane
This commit is contained in:
@ -7,12 +7,14 @@
|
||||
* Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/fork_process.c,v 1.10 2010/01/02 16:57:50 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/fork_process.c,v 1.11 2010/01/11 18:39:32 tgl Exp $
|
||||
*/
|
||||
#include "postgres.h"
|
||||
#include "postmaster/fork_process.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -60,6 +62,38 @@ fork_process(void)
|
||||
setitimer(ITIMER_PROF, &prof_itimer, NULL);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* By default, Linux tends to kill the postmaster in out-of-memory
|
||||
* situations, because it blames the postmaster for the sum of child
|
||||
* process sizes *including shared memory*. (This is unbelievably
|
||||
* stupid, but the kernel hackers seem uninterested in improving it.)
|
||||
* Therefore it's often a good idea to protect the postmaster by
|
||||
* setting its oom_adj value negative (which has to be done in a
|
||||
* root-owned startup script). If you just do that much, all child
|
||||
* processes will also be protected against OOM kill, which might not
|
||||
* be desirable. You can then choose to build with LINUX_OOM_ADJ
|
||||
* #defined to 0, or some other value that you want child processes
|
||||
* to adopt here.
|
||||
*/
|
||||
#ifdef LINUX_OOM_ADJ
|
||||
{
|
||||
/*
|
||||
* Use open() not stdio, to ensure we control the open flags.
|
||||
* Some Linux security environments reject anything but O_WRONLY.
|
||||
*/
|
||||
int fd = open("/proc/self/oom_adj", O_WRONLY, 0);
|
||||
|
||||
/* We ignore all errors */
|
||||
if (fd >= 0)
|
||||
{
|
||||
char buf[16];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%d\n", LINUX_OOM_ADJ);
|
||||
(void) write(fd, buf, strlen(buf));
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
#endif /* LINUX_OOM_ADJ */
|
||||
}
|
||||
|
||||
return result;
|
||||
|
Reference in New Issue
Block a user