NPgsql пул соединений и счетчики производительности - PullRequest
0 голосов
/ 28 июня 2018

Сначала немного предыстории: 1. Понять, как COnnection Pooling используется NPGSQL в ASP.NET REST API

Окружающая среда: - У нас есть контроллер REST API, который сначала запрашивает список элементов (в RDS), а затем для каждого элемента в этом списке нам нужно получить некоторые дополнительные значения, поэтому мы используем оператор Parallel.ForEach

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

Процесс:

Я следовал http://www.npgsql.org/doc/performance.html#performance-counters, чтобы проверить, как NPGSQL обрабатывает соединения, также добавил следующее в строку соединения: "CommandTimeout = 50000; TIMEOUT = 1024; POOLING = True; MINPOOLSIZE = 1; MAXPOOLSIZE = 100; Использовать счетчики Perf = true;"

но я нашел странный результат:

NumberOfNonPooledConnections и NumberOfPooledConnections всегда одинаковы, в моем случае (56) мы используем Parallel.ForEach для запроса нескольких элементов.

Значение для NumberOfActiveConnectionPools равно 1.

Сначала я не мог понять, как это работает, действительно ли он использовал пул соединений?

Затем я прекращаю процесс удаления "; POOLING = True;" из строки подключения и у меня тот же результат.

Наконец я установил "; POOLING = false;" и выполните снова, теперь NumberOfPooledConnections поднялся на крышу, достигнув 2378, и затем он начал рассчитывать время открытия новых соединений. В метриках производительности RDS я также отметил, что количество соединений никогда не превышало 110 соединений.

Так что вопросы будут такими: Какими будут критерии для установки параметра MaxPoolSize? 100 кажется обычным.

В ASP.NET пул соединений обрабатывается экземпляром? Таким образом, все подключения, сделанные из одного пула приложений в IIS, будут использоваться повторно или будут выполняться?.

1 Ответ

0 голосов
/ 28 июня 2018

Во-первых, ASP.NET (веб-сторона) абсолютно не влияет на пул соединений Npgsql или на ADO.NET в целом, поэтому лучше рассуждать о Npgsql и ADO.NET, не задумываясь о сети.

Во-вторых, вы не говорите, какую версию Npgsql вы используете.

Помимо этого, перед тем, как посмотреть на счетчики производительности, с какой именно проблемой вы сталкиваетесь? Вы видите слишком много подключений на стороне PostgreSQL? Вы можете проверить это , запросив pg_stat_activity.

Если пул Npgsql включен (Pooling=true в строке подключения, это также значение по умолчанию), то при вызове NpgsqlConnection.Open() физическое соединение будет взято из пула, если оно доступно. Когда вы закроете или утилизируете этот NpgsqlConnection, он будет возвращен в пул для последующего повторного использования. Если вы видите, что физические соединения слишком сильно нарастают на стороне PostgreSQL, это вероятный признак того, что вы забыли закрыть / удалить соединение в вашем коде, и у вас есть утечка.

Функция счетчиков производительности может быть полезна для понимания происходящего, но, к сожалению, она недостаточно проверена и может содержать ошибки. Поэтому, пожалуйста, убедитесь, что существует реальная проблема, прежде чем начать ее рассматривать (и, по крайней мере, сообщите о версии Npgsql, которую вы используете).

...