Исключение тайм-аута Npgsql для моно

Мы получаем следующее исключение, которое выглядит так, как будто оно исходит из файла Npgsql.dll.

Мы используем это DLL в нашем ASP.Net C# приложении, размещенном на Ubuntu 14.04 сервере под Apache mod_mono. Этот DLL отвечает за разговор с Postgresql Server. На сервере установлена ​​последняя версия Postgresql.

Эта ошибка возникает случайным образом, а затем приводит к сбою сервера.

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> Npgsql.NpgsqlException:
Failed to establish a connection to 'localhost'.
  at Npgsql.NpgsqlClosedState.Open (Npgsql.NpgsqlConnector context, Int32 timeout) [0x00000] in <filename unknown>:0
  at Npgsql.NpgsqlConnector.Open () [0x00000] in <filename unknown>:0
  at Npgsql.NpgsqlConnectorPool.GetPooledConnector (Npgsql.NpgsqlConnection Connection) [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at System.Web.UI.Page.ProcessException (System.Exception e) [0x00000] in <filename unknown>:0
  at System.Web.UI.Page.ProcessRequest (System.Web.HttpContext context) [0x00000] in <filename unknown>:0
  at ASP.default_aspx.ProcessRequest (System.Web.HttpContext context) [0x00000] in <filename unknown>:0
  at System.Web.HttpApplication+<Pipeline>c__Iterator1.MoveNext () [0x00000] in <filename unknown>:0
  at System.Web.HttpApplication.Tick () [0x00000] in <filename unknown>:0

System.TimeoutException: Dns hostname lookup timeout. Increase Timeout value in ConnectionString.
  at Npgsql.NpgsqlClosedState.Open (Npgsql.NpgsqlConnector context, Int32 timeout) [0x00000] in <filename unknown>:0 

Любая помощь в выяснении причин этой ошибки будет высоко оценена.


person Shane van Wyk    schedule 22.04.2015    source источник
comment
Похоже, что время поиска DNS-имени хоста для localhost истекло. Возможно, вместо использования DNS используйте петлевой IP-адрес 127.0.0.1 в строке подключения.   -  person Ron Beyer    schedule 22.04.2015
comment
Спасибо @RonBeyer - если вы опубликуете это как ответ, я могу принять его, если он работает.   -  person Shane van Wyk    schedule 22.04.2015
comment
Сделанный! Дайте нам знать, если это сработает.   -  person Ron Beyer    schedule 22.04.2015
comment
@ShaneVanWyk, ты нашел решение?   -  person Owen Pauling    schedule 19.08.2015
comment
Нет, само исправилось. Npgsql иногда может быть сомнительным. Убедитесь, что mono.security находится в вашей корзине, если вы используете моно   -  person Shane van Wyk    schedule 19.08.2015


Ответы (2)


Похоже, что время поиска DNS-имени хоста для «localhost» истекло. Возможно, вместо использования DNS используйте петлевой IP-адрес 127.0.0.1 в строке подключения.

person Ron Beyer    schedule 22.04.2015
comment
Изменил на 127.0.0.1, но ничего не изменилось, теперь пишет Failed to establish a connection to '127.0.0.1' - person Shane van Wyk; 22.04.2015

Вы должны запустить свое приложение следующим образом

MONO_THREADS_PER_CPU=50 mono MyApp.exe

Причина в использовании ThreadPool в npgsql версии 2.2.7, а также в том, что сокет также использует ThreadPool. Npgsql использует метод GetHostEntryAsync для разрешения имен хостов при открытии соединения, использующего ThreadPool. Даже если вы укажете ip явно в строке подключения, npgsql вызовет метод сокета BeginConnect, который является асинхронным и будет использовать ThreadPool. В моно по умолчанию количество потоков в пуле на ядро ​​ЦП равно 1. А в .net другой алгоритм. В результате потоки в пуле начинают заканчиваться и среда mono начинает их медленно выдавать.

Когда потоков на ядро ​​мало, пул не выдает существующие готовые потоки и создает новый, а создание занимает много времени. Параметром MONO_THREADS_PER_CPU мы сообщаем среде выполнения mono, чтобы она поддерживала готовность в пуле N * (количество ядер) потоков.

person user1790613    schedule 18.02.2021