Другой postgres не запускается: «не удалось сопоставить анонимную общую память»

#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:

Хорошо, я нашел кое-что странное:

  1. Я полностью удалил postgresql из системы
  2. Я переустановил postgresql
  3. Запустил кластер, и все прошло хорошо
  4. Остановил кластер и отредактировал файл конфигурации с нужными мне настройками
  5. Попытался снова запустить кластер, но получил ту же ошибку
  6. Вернулся к файлу конфигурации по умолчанию, но по-прежнему получаю ту же ошибку. Почему это происходит?

В системе 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. Еще раз спасибо за ваше время. Я отредактировал сообщение, потому что обнаружил, что происходит что-то странное. Я думаю, что я что-то упускаю.