Я использую 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-машине.