Назад | Перейти на главную страницу

PostgreSQL не запускается, потому что «не может выделить память»

Я использую PostgreSQL 8.4.5 на Ubuntu 10.04. Я запускаю экземпляр EC2 с несколькими сайтами, работающими на nginx. Большинство этих сайтов работают на Django и подключаются к этому экземпляру Postgres.

По какой-то причине сегодня в 20:45 Постгрес упал. Я вошел в систему и вижу это сообщение об ошибке:

 * Starting PostgreSQL 8.4 database server
 * The PostgreSQL server failed to start. Please check the log output:
2011-04-17 04:46:49 UTC FATAL:  could not create shared memory segment: Cannot allocate memory
2011-04-17 04:46:49 UTC DETAIL:  Failed system call was shmget(key=5432001, size=16211968, 03600).
2011-04-17 04:46:49 UTC HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory or swap space. To reduce the request size (currently 16211968 bytes), reduce PostgreSQL's shared_buffers parameter (currently 1792) and/or its max_connections parameter (currently 53).
        The PostgreSQL documentation contains more information about shared memory configuration.
   ...fail!

Первым делом я изменил распределение разделяемой памяти Linux.

sysctl -w kernel.shmmax=367108864>
sysctl -p /etc/sysctl.conf

Это не помогло. Итак, я отредактировал /etc/postgresql/8.4/main/postgresql.conf и снизил max_connections стоимость. Это сработало ... минут 10.

Теперь я получаю ту же ошибку, как бы низко она ни была max_connections является. Мне нужно установить как минимум 9 (поскольку это количество проектов Django, которым нужен доступ к этому серверу Postgres).

Есть мысли о том, как я могу это исправить?

Вы можете использовать команду 'ipcs', чтобы вывести список всех сегментов SHM. Если программа выйдет из строя, не удалив их, они могут валяться, потребляя память; вы можете удалить их вручную с помощью команды ipcrm.

Можете ли вы показать более подробный журнал кластера? Postmaster падает произвольно? Какой код возвращается в ОС? Сколько у вас кластеров PostgreSQL, всего 8.4 на основной?

А как насчет ваших kernel.shmall и kernel.shmmni? Попробуйте использовать ipcs -ml, ipcs -m и проверьте использование вашей памяти (свободной, верхней, системного монитора). Попробуйте успокоить OOM killer:

vm.overcommit_memory = 2
vm.overcommit_ratio = 50

Насколько мне известно sysctl -w не меняет параметры навсегда (только до следующей перезагрузки ОС), и вам нужно добавить kernel.shmmax=367108864 в /etc/sysctl.conf.

Если возможно, обновите свой PostgreSQL до 8.4.8, как предложено в Политика управления версиями:

Мы всегда рекомендуем всем пользователям запускать последнюю доступную дополнительную версию для любой основной версии, которая используется.

Я думаю, что это, вероятно, проблема с убийцей OOM, потому что он убивает почтмейстера с сигналом SIGKILL и без освобождение разделяемой памяти. смотреть на документация:

Важно: Лучше не использовать SIGKILL для выключения сервера. Это предотвратит выпуск сервера Общая память и семафоры, которые затем, возможно, придется делать вручную перед запуском нового сервера. Кроме того, SIGKILL убивает процесс postgres, не позволяя ему ретранслировать сигнал своим подпроцессам, поэтому также необходимо вручную убить отдельные подпроцессы.

и Вот:

n Linux 2.4 и новее поведение виртуальной памяти по умолчанию не оптимально для PostgreSQL. Из-за способа, которым ядро ​​реализует избыточное выделение памяти, ядро ​​может завершить работу сервера PostgreSQL (процесс главного сервера), если из-за требований к памяти другого процесса в системе закончится виртуальная память.

Кстати, max_connections "дешевые". Скорее уменьшите shared_buffers.

Некоторые поисковые запросы указывают, что вам следует уменьшить postgres shared_buffers и max_connections номеров. вы еще что-нибудь сделали с shared_buffers?

Вы просмотрели документация по разделяемой памяти postgresql? Там много деталей о том, как настроить параметры разделяемой памяти на Linux-машине.