Мое приложение работает на Windows Server 2106 с 24 ЦП и 16 ГБ ОЗУ, используя PostgreSql 11.2 в качестве базы данных на отдельном сервере CentOS 7.Приложение написано на C # 4.7.1 с использованием Npgsql 4.0.6.
Обычно (при 100-200 одновременных соединениях) все работает нормально.Однако во время более высокой нагрузки (400-500 одновременных подключений) произошли некоторые «зависания» - сервер прекратил обрабатывать новые запросы, завис на несколько секунд, а затем продолжил работать в обычном режиме.
После нескольких конфигураций мы увеличили ЦПна сервере БД от 8 до 16. Замораживания устранялись до тех пор, пока не было около 700 одновременных подключений.Итак, мое внимание сосредоточилось (наряду с несколькими другими идеями) на работе с базой данных.
Я установил счетчики производительности Npgsql, как описано в Npgsql docs , и изменил ConnectionString следующим образом:
<appSettings>
<add key="DatabaseConnectionString" value="Server=dbserver;Port=5432;Database=mydb;User Id=postgres;Password=mypass;CommandTimeout=30;Use Perf Counters=true" />
</appSettings>
В документации указано, что Npgsql по умолчанию использует пулы . Однако Performance Monitor показывает, что значения счетчиков NumberOfNonPooledConnections и NumberOfPooledConnections все время одинаковы и равны 24 - числоядра на сервере приложений.Счетчик NumberOfActiveConnectionPools равен 1, все остальные счетчики - 0.
Означает ли это, что для моих 700 одновременных запросов существует только 24 соединения без пула?Это ожидаемое поведение?Я что-то упустил?
Заранее спасибо за ваши ответы и предложения