Оптимизация коннектов к базе данных на SetCentrum

Публичное пространство

Оптимизация коннектов к базе данных на SetCentrum

https://crystals.atlassian.net/browse/SRTE-3147

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

1. Убедитесь в наличии больших очередей в таблицах.

Скрипт для проверки количества заданий

Назначение

Скрипт для проверки количества заданий

Назначение

select count(id) from erpi_goodscatalog;

Количество сообщений (части товарного справочника) для отправки в Товарный техпроцесс (GoodsCatalogERI).

select count(*) from cash_cash_event;

Количество событий, создаваемых модулем SET-Cash (новая касса, касса удалена, касса обновлена, и.т.п.), которые могут быть обработаны другими модулями, подписанными на события SET-Cash в реестре модулей.

select count(*) from discounts_file_for_cashes;

Количество файлов - каталогов карт, которые могут быть считаны кассами (AdvertiseActionForCashesEntity).

select count(*) from discounts_file_for_shop;

Количество файлов с рекламными акциями, переданными из центрального офиса в магазин (AdvertiseActionForShopEntity).

select count(*) from un_cg_product_file_for_cashes;

Количество ссылок на файлы - части товарного справочника для отправки на кассы (ProductForCashesEntity)

select count(*) from un_cg_product_file_for_shops;

Количество ссылок на файлы - части товарного справочника для отправки на магазины (ProductForShopEntity)

select count(*) from file_transfer_cashier_data_type;

Количество заданий на передачу данных типа FILE_TRANSFER_CASHIER_DATA_TYPE

select count(*) from file_transfer_properties;

Количество заданий на передачу данных типа 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 = 2030

    • max_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.