postgres на AWS, прерывистое зависание на простом sql

#postgresql #amazon-web-services

#postgresql #amazon-веб-сервисы

Вопрос:

Это должен быть очень простой sql для небольшой таблицы с небольшим трафиком и всего 4 столбцами. Я работаю на AWS EC2 с RDS (postgres), на котором запущен узел EC2. Я вызываю rest API, который выполняет приведенный ниже sql. В рассматриваемой таблице может быть 200 строк.

Определение таблицы

 tableid:  integer  (PK) (not null)
playerid:  text    (PK) (not null)
seatpos:  integer  (not null)
prefs:   json
 

Итак, мне нужно выполнить upsert (вставить / обновить) проигрывателя. Сначала я сделал
select *, где playerid = x и tableid = y;
основываясь на результате, я бы сделал вставку или обновление. То, что я обнаружил, просматривая журналы
, заключалось в том, что иногда выбор никогда не возвращался. Это кажется очень странным, поскольку это просто простое чтение
на ПК.

Поэтому я изменил его на upsert sql

 INSERT INTO seating(tableid, playerid, seatpos, userPrefs)
VALUES($1,$2,$3,$4)
ON CONFLICT ON CONSTRAINT seating_pkey DO update set seatpos=$3, userprefs=$4;
 

$1,$2,$3,$4 заменяется соответствующими значениями.

Казалось, что это работает лучше, но нет … снова возникает та же проблема. Я не смог снова отследить журналы, так как мне нужна постоянная повторяемость, чтобы действительно отладить его, но у меня нет оснований думать, что это не будет в том же месте.

Как я могу это отладить? что может привести к зависанию postgres. Может быть, какая-то неявная блокировка? на что я могу посмотреть в pgadmin или через AWS. Я не администратор базы данных, огляделся столько, сколько мог, и ничего не увидел.

Я предполагаю, что PK также создает индекс. Я не создал явный индекс.

Глядя на похожие проблемы в Интернете, и кто-то сказал посмотреть на состояния ожидания, и я вижу следующее. Я запускаю запрос, чтобы получить это несколько раз, и он остается неизменным. Это не выглядит здоровым

         state      wait_event_type     wait_event
1       null          Activity           LogicalLaunchMain
2       null          Activity           AutoVacuumMain
3       idle          Client             ClientRead
4       idle          Client             ClientRead
5       idle          Client             ClientRead
6       idle          Client             ClientRead
7       idle          Client             ClientRead
8       idle          Client             ClientRead
9       idle          Client             ClientRead
10      active         null                null
11      null          Activity           BgWriteMain
12      null          Activity           CheckpointerMain
13      null          Activity           WalWriterMain 
 

У меня есть AWS, создающий резервные копии БД каждые 2-3 дня, но это единственное, о чем я могу думать, и, конечно, мне нужно делать резервные копии.

Комментарии:

1. «То, что я обнаружил при просмотре журналов, заключалось в том, что иногда выбор никогда не возвращался» Какие журналы и что конкретно вы видите в них, что, по вашему мнению, указывает на это?

2. Ваш pg_stat_activity указывает, что одно соединение что-то делает на процессоре (мы не знаем, что), а 7 других ожидают, пока клиент отправит им работу для выполнения. В этом нет ничего плохого, возможно, у вас есть пул подключений, который любит зависать на незанятых соединениях на случай, если спрос скоро возрастет. Но отлаживать все может быть проще, если вы отключите эту функцию или полностью отключите пул подключений.

3. под журналами я подразумеваю журналы моих приложений с сервера узла. Я только что перезагрузил экземпляр RDS, и теперь, похоже, никакие запросы не работают с моего сервера узлов, хотя я могу запускать их из pgadmin. Я получаю доступ через однопоточный узел и использую модуль pg NPM. Я не думаю, что я использую пул соединений, если он не включен по умолчанию. У меня есть задание, которое выполняется каждую минуту, чтобы получать уведомления. но это единственное фоновое задание, которое выполняется

4. Как вы думаете, почему одно соединение что-то делает с процессором? все записи клиента простаивают. единственный активный элемент — «null», «null»

5. Да, именно так выглядит загрузка процессора.