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

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

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 в настройках конфигурационного файла JBoss:

  • 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 коннектов дополнительно для технических нужд. То есть количество коннектов в СУБД не должно превышать количество коннектов на сервере JBoss

В данном случае видно, что количества = 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.

© 1994-2023, ООО «Кристалл Сервис Интеграция».
Все права защищены..

Политика обработки персональных данных