Публичное пространство
Оптимизация коннектов к базе данных на SetCentrum
https://crystals.atlassian.net/browse/SRTE-3147
Перед большими праздниками могут массово прогрузить новые рекламные акции в систему, так и другие данные, но кассы могут в этот момент быть не в сети - например, была отключена на ночь. Из-за этого могут скопиться большие очереди из данных и сервер может быть перегружен.
1. Убедитесь в наличии больших очередей в таблицах.
Скрипт для проверки количества заданий | Назначение |
|---|---|
| Количество сообщений (части товарного справочника) для отправки в Товарный техпроцесс (GoodsCatalogERI). |
| Количество событий, создаваемых модулем SET-Cash (новая касса, касса удалена, касса обновлена, и.т.п.), которые могут быть обработаны другими модулями, подписанными на события SET-Cash в реестре модулей. |
| Количество файлов - каталогов карт, которые могут быть считаны кассами (AdvertiseActionForCashesEntity). |
| Количество файлов с рекламными акциями, переданными из центрального офиса в магазин (AdvertiseActionForShopEntity). |
| Количество ссылок на файлы - части товарного справочника для отправки на кассы (ProductForCashesEntity) |
| Количество ссылок на файлы - части товарного справочника для отправки на магазины (ProductForShopEntity) |
| Количество заданий на передачу данных типа FILE_TRANSFER_CASHIER_DATA_TYPE |
| Количество заданий на передачу данных типа FILE_TRANSFER_CASH_FILES. |
2. Следующим этапом проверьте количество коннектов.
Общее количество коннектов всего
SELECT
sum(numbackends)
FROM
pg_stat_database;Распределение коннектов по базам данных на сервере
SELECT
datname, numbackends
FROM
pg_stat_database
order by
numbackends desc;Посмотреть актуальные выполняющиеся транзакции
SELECT *
FROM
pg_stat_activity
where
state <> 'idle'
order by
datname, xact_start;Проверить idle-соединения
SELECT *
FROM
pg_stat_activity
where
state = 'idle'
and application_name = 'Set10'
order by
datname;Проверка общего состояния подключений к БД
SELECT *
FROM
pg_stat_activity
order by
application_name, datname;3. Проверьте количество выделенных коннектов для баз данных: set, set_loyal, set_operday в настройках конфигурационного файла WildFly:
Linux: /var/lib/jboss/standalone/configuration/standalone.xml
Windows: {Disk}:\{Папка сервера SetRetail}\standalone\configuration\standalone.xml
Количество коннектов для каждой базы данных указано в параметре <max-pool-size>...</max-pool-size>.
4. Посчитайте общую сумму коннектов к базам данных.
В нашем примере:
set = 60
set_loyal = 20
set_operday = 20
Итого = 100.
5. C помощью запросов из пункта 2, проверьте доступные коннекты.
Например, можно увидеть, что большое количество коннектов с статусе idle = 1533шт.
6. Следующий шаг, проверьте количество СУБД PostgreSQL.
Windows: {Диск}:\{Папка с данными СУБД}\data\postgresql.conf
Linux: \var\lib\pgsql\{папка с текущей версией PostgreSQL}\data\postgresql.conf
Проверьте коннекты в параметрах:
max_connections
max_prepared_transactions
Количество доступных коннектов в параметре max_connections и max_prepared_transactions в postgresql.conf относительно standalone.xml не должно быть совокупно количеству больше, чем выделено в postgresql.conf, +20 коннектов дополнительно для технических нужд. То есть количество коннектов в СУБД не должно превышать количество коннектов на сервере WildFly
В данном случае видно, что количества = 110 явно недостаточно для обработки такого количества запросов.
7. Резюме:
Для установки нормального количества коннектов нужно изменить следующие параметры
Значение max_prepared_transactions всегда должно быть практически равно значению max_connections.
postgresql.conf
max_connections= 2030max_prepared_transactions= 2030
В standalone.conf:
max-pool-size:
set = 1000
set_loyal = 500
set_operday = 500
Итого: 2000шт.
Количество коннектов для http-полкючения в параметре
max-connectionsпонизить на 10-20% ниже общей суммы вmax-pool-size.