#linux #postgresql #amazon-ec2 #shared-memory #postgresql-10
Вопрос:
Я заметил, что есть несколько вопросов о том, что Postgres (10) не может загрузиться из-за общей памяти; несмотря на это, я не смог заставить его работать. Теперь каждый раз, когда я пытаюсь запустить кластер, я продолжаю получать эту ошибку:
2021-10-24 10:13:43.269 UTC [11253] FATAL: could not map anonymous shared memory: Cannot allocate memory
2021-10-24 10:13:43.269 UTC [11253] HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 5507432448 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
Я попытался проверить и изменить параметр ядра shmall, но ничего не вышло.
~$ cat /proc/sys/kernel/shmall
18446744073692774399
~$ cat /proc/sys/kernel/shmmax
18446744073692774399
Я не могу уменьшить объем памяти в файле конфигурации, потому что это настройки, которые я должен использовать, хотя я все равно пытался, но безуспешно (я даже использовал минимальные значения).
Спасибо за помощь!
ПРАВКА 1:
Хорошо, я нашел кое-что странное:
- Я полностью удалил postgresql из системы
- Я переустановил postgresql
- Запустил кластер, и все прошло хорошо
- Остановил кластер и отредактировал файл конфигурации с нужными мне настройками
- Попытался снова запустить кластер, но получил ту же ошибку
- Вернулся к файлу конфигурации по умолчанию, но по-прежнему получаю ту же ошибку. Почему это происходит?
В системе 16 ГБ оперативной памяти.
РЕДАКТИРОВАНИЕ 2: ДОБАВЛЕНИЕ ДЕТАЛЕЙ
Хорошо, поэтому в основном мне пришлось перенести базу данных postgresql, переместив каталог данных. Это единственное, что можно было сделать. После полного перемещения папки с данными возникает ошибка. Я заметил, что не было памяти подкачки, поэтому я создал ее, но все та же ошибка.
Общая память и сегмент между двумя серверами в основном идентичны. Когда я запускаю кластер, он сразу же завершается сбоем, так что, возможно, это может быть подсказкой для вас. Конечный сервер — это компьютер EC2.
Я не знаю, что еще я могу сделать..
РЕДАКТИРОВАТЬ 3: ДРУГИЕ ПОДРОБНОСТИ
Это то, что показывает команда lsipc:
RESOURCE DESCRIPTION LIMIT USED USE%
MSGMNI Number of message queues 32000 0 0.00%
MSGMAX Max size of message (bytes) 8192 - -
MSGMNB Default max size of queue (bytes) 16384 - -
SHMMNI Shared memory segments 4096 0 0.00%
SHMALL Shared memory pages 18446744073692774399 0 0.00%
SHMMAX Max size of shared memory segment (bytes) 18446744073692774399 - -
SHMMIN Min size of shared memory segment (bytes) 1 - -
SEMMNI Number of semaphore identifiers 32000 0 0.00%
SEMMNS Total number of semaphores 1024000000 0 0.00%
SEMMSL Max semaphores per semaphore set. 32000 - -
SEMOPM Max number of operations per semop(2) 500 - -
SEMVMX Semaphore max value 32767 - -
Эти значения совпадают с исходным компьютером, который я пытаюсь перенести. Каталог данных идентичен исходному, но каждый раз, когда я использую эту команду:
sudo pg_ctlcluster 10 main start
Я получаю ту же ошибку. Мне действительно нужна помощь!
Комментарии:
1. По крайней мере, он должен работать с файлом конфигурации по умолчанию.
2. Спасибо за помощь. Я заменил свой конфигурационный файл на исходный, но все равно получаю ту же ошибку.
3. Изменяется ли сообщенный номер 5507432448 при изменении настроек памяти? Если нет, то файл конфигурации, который вы изменяете, неверен.
4. Да, в файле конфигурации по умолчанию это значение меньше.
5. Что
ipcs -a
показывает?
Ответ №1:
Как говорится в документации:
По умолчанию PostgreSQL выделяет очень небольшой объем разделяемой памяти System V, а также гораздо больший объем анонимной
mmap
общей памяти.
Поэтому, если вы не изменили shared_memory_type
sysv
, ваши настройки не имеют значения. Ошибка вызвана тем, что в ядре недостаточно доступной памяти для удовлетворения запроса. Это может быть shared_buffers
связано с тем, что значение слишком велико, или потому, что другие процессы используют слишком много памяти, или потому, что уже есть много общей памяти, отображенной для других целей.
Комментарии:
1. Хорошо, спасибо за ответ; На данный момент shared_buffers имеет значение 128 МБ, а dynamic_shared_memory_type — sysv . Все еще получаю ту же ошибку.
2. Вы можете изменить настройку обратно на значение по умолчанию
mmap
. Тогда вам не нужно возиться с настройками разделяемой памяти Systam V.3. Он был установлен на POSIX раньше, но все та же проблема.
4. Тогда у вас нет необходимой памяти на вашем компьютере. Возможно, вы находитесь в ограниченной среде.
5. Еще раз спасибо за ваше время. Я отредактировал сообщение, потому что обнаружил, что происходит что-то странное. Я думаю, что я что-то упускаю.