Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает. Заявление было прекращено

У меня много пользователей на моем веб-сайте (20000-60000 в день), который является сайтом загрузки для мобильных файлов. У меня есть удаленный доступ к моему серверу (сервер Windows 2008 R2).
Я уже получал ошибки" Сервер недоступен", но теперь вижу ошибку тайм-аута соединения.
Я не знаком с этим - почему это происходит и как я могу это исправить?

Полная ошибка ниже:

Ошибка сервера в приложении "/". Время ожидания истекло. Период ожидания прошедшее до завершения операции или на сервере, не отвечать на запросы. Заявление было прекращено. Описание: необработанное исключение произошло во время выполнения текущей сети запрос. Просмотрите трассировку стека для получения дополнительной информации о и где он возник в коде.

Сведения об исключении: System.Data.SqlClient.SqlException: таймаут истекший. Период ожидания истекает до завершения или сервер не отвечает. Заявление было прекращается.

Ошибка источника:

Необработанное исключение было создано во время выполнения текущий веб-запрос. Информация о происхождении и местонахождении исключение может быть идентифицировано с использованием трассы стека исключений ниже.

Трассировка стека:

[SqlException (0x80131904): время ожидания истекло. Период ожидания прошедшее до завершения операции или на сервере, не отвечать на запросы. Заявление было прекращено.]
System.Data.SqlClient.SqlConnection.OnError(исключение SqlException, Boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6387741
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String метод, результат DbAsyncResult) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +327
NovinMedia.Data.DbObject.RunProcedure(String storedProcName, Параметры IDataParameter [], Int32 & rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (отправитель объекта, EventArgs e) +163

[HttpException (0x80004005): время ожидания истекло. Период ожидания прошедшее до завершения операции или на сервере, не отвечать на запросы. Заявление было прекращено.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext контекст, приложение HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, контекст HttpContext, обработчики MethodInfo []) +191
System.Web.HttpApplication.InitSpecial(состояние HttpApplicationState, Обработчики MethodInfo [], IntPtr appContext, контекст HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr контекст приложения, контекст HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): время ожидания истекло. Период ожидания прошедшее до завершения операции или на сервере, не отвечать на запросы. Заявление было прекращено.]
System.Web.HttpRuntime.FirstRequestInit(контекст HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit(контекст HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, контекст HttpContext) +4863749


ИЗМЕНИТЬ ПОСЛЕ ОТВЕТОВ:
my Application_Start в Global.asax выглядит следующим образом:

protected void Application_Start(object sender, EventArgs e)
{
    Application["OnlineUsers"] = 0;

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

Вызывается хранимая процедура:

ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online]
    @Session_End datetime,
    @Online bit
As
Begin
    Update OnlineUsers
    SET
        [Session_End] = @Session_End,
        [Online] = @Online

End

У меня есть два метода для онлайн-пользователей:

  • используя Application["OnlineUsers"] = 0;
  • другой, использующий базу данных

Итак, для метода # 2 я reset все интернет-пользователи в Application_Start. В этой таблице содержится более 482 751 записей.

Ответ 1

Похоже, у вас есть запрос, который занимает больше времени, чем нужно. Из вашей трассировки стека и кода вы сможете точно определить, что такое запрос.

Этот тип таймаута может иметь три причины;

  • Там где-то тупик
  • Ошибки базы данных и/или панели запросов неверны.
  • Запрос слишком сложный и нуждается в настройке

Тупик может быть трудно исправить, но легко определить, так ли это. Подключитесь к своей базе данных с помощью Sql Server Management Studio. В левой панели щелкните правой кнопкой мыши на сервере node и выберите Activity Monitor. Взгляните на запущенные процессы. Обычно большинство из них будут бездействовать или работать. Когда проблема возникает, вы можете идентифицировать любой заблокированный процесс по состоянию процесса. Если вы щелкните правой кнопкой мыши процесс и выберите детали, он покажет вам последний запрос, выполняемый процессом.

Вторая проблема заставит базу данных использовать неоптимальный план запроса. Это можно устранить, очистив статистику:

exec sp_updatestats

Если это не работает, вы также можете попробовать

dbcc freeproccache

Вам не следует делать это, когда ваш сервер находится под большой нагрузкой, потому что он временно наносит большой удар производительности, поскольку все сохраненные procs и запросы перекомпилируются при первом запуске. Однако, поскольку вы указываете, что проблема возникает иногда, а трассировка стека указывает на запуск вашего приложения, я думаю, что вы выполняете запрос, который выполняется только иногда. Возможно, вам будет лучше, если SQL Server не будет повторно использовать предыдущий план запроса. Подробнее о том, как это сделать, см. этот ответ.

Я уже затронул третью проблему, но вы можете легко определить, нуждается ли запрос в настройке, выполнив запрос вручную, например, используя Sql Server Management Studio. Если запрос занимает слишком много времени, даже после сброса статистики вам, вероятно, потребуется настроить его. Для получения справки, вы должны отправить точный запрос в новый вопрос.

Ответ 2

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

SqlCommand c = new SqlCommand(...)
//...

Добавьте такую ​​строку кода:

c.CommandTimeout = 0;

Это будет ждать столько времени, сколько потребуется для завершения операции.

Ответ 3

Вы можете установить свойство CommandTimeout команды SQL, чтобы разрешить длительную транзакцию SQL.

Вам также может потребоваться просмотреть SQL-запрос, вызывающий таймаут.

Ответ 4

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

Microsoft подтвердила эту проблему и исправила ее в 2011 году для поддерживаемых операционных систем, поэтому, если вы получаете трассировку стека, например:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)

вам может потребоваться обновить сборки .NET.

Эта проблема возникает из-за ошибки в соединении-повторе алгоритм зеркальных баз данных.

Когда используется алгоритм повтора, поставщик данных ожидает сначала прочитайте (SniReadSync), чтобы закончить. Вызов отправляется на сервер, на котором запущен SQL Server, и время ожидания рассчитывается путем умножения значения тайм-аута соединения на 0,08. Однако поставщик данных неправильно устанавливает соединение с обреченным если ответ медленный, и если первый вызов SniReadSync не является завершено до истечения времени ожидания.

Подробнее см. KB 2605597

https://support.microsoft.com/kb/2605597

Ответ 5

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

Ответ 6

Я столкнулся с одной и той же проблемой, которая работала над ней около 3 дней. Я заметил, что количество наших записей не так много, наш старший разработчик хранит 2 изображения и Fingerprint в базе данных. Когда я пытаюсь извлечь эти шестнадцатеричные значения, это занимает много времени, я рассчитываю среднее время для выполнения моей процедуры около 38 секунд. По умолчанию время командной строки составляет 30 секунд, поэтому для выполнения моей хранимой процедуры требуется меньшее, чем среднее время. Я установил свой командный тайм-аут, как показано ниже

cmd.CommandTimeout = 50

и его работа отлично, но иногда, если ваш запрос занимает более 50 секунд, он выдает ту же ошибку.

Ответ 7

Вы должны установить атрибут CommandTimeout. Вы можете установить атрибут CommandTimeout в дочернем классе DbContext.

public partial class StudentDatabaseEntities : DbContext
{
    public StudentDatabaseEntities()
        : base("name=StudentDatabaseEntities")
    {
        this.Database.CommandTimeout = 180;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<StudentDbTable> StudentDbTables { get; set; }
}

Ответ 8

Недавно я столкнулся с этой ошибкой и после некоторого краткого исследования обнаружил, что причина в том, что у нас закончилось свободное место на диске, содержащем базу данных (менее 1 ГБ).

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

Еще одна вещь, которую нужно исследовать при попытке решить эту ошибку, - это размер файлов журнала базы данных. Возможно, ваши файлы журналов могут быть сокращены.

Ответ 9

У меня проблема с большими вычислениями в sp_foo, которые занимают много времени, поэтому я исправил с этим небольшим кодом

public partial class FooEntities : DbContext
{
   public FooEntities()
         : base("name=FooEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // Sets the command timeout for all the commands
        objectContext.CommandTimeout = 380;
    }

Ответ 10

@SilverLight.. Это явно проблема с объектом базы данных. Это может быть плохо написанный запрос или отсутствующие индексы. Но на данный момент я не буду предлагать вам увеличить тайм-аут, не исследуя проблему с вашими объектами базы данных.

NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209

Поместите контрольную точку в этой строке кода, чтобы узнать имя процедуры, а затем оптимизируйте процедуру, просмотрев ее план выполнения.

Я не могу помочь вам больше, пока вы не опубликуете подробности о хранимой процедуре.

Ответ 11

попробовать

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

то перестройте свой индекс

Ответ 12

Время ожидания по умолчанию составляет 15 секунд, чтобы изменить его, 0 не ограничено, любое другое число - это количество секунд.

В коде

using (SqlCommand sqlCmd = new SqlCommand(sqlQueryString, sqlConnection))
   {
      sqlCmd.CommandTimeout = 0; // 0 = give it as much time as it needs to complete
      ...
    }

В вашем Web.Config "Тайм-аут команды = 0;" не превышать время ожидания или менее 1 часа (3600 секунд)

  <add name="ConnectionString" connectionString="Data Source=ServerName;User ID=UserName;Password=Password;Command Timeout=3600;" providerName="System.Data.SqlClient" />

Ответ 13

Время ожидания истекло, поскольку запрос sql занимает больше времени, чем указано в свойстве sqlCommand.CommandTimeout.

Очевидно, что вы можете увеличить CommandTimeout для решения этой проблемы, но перед этим вы должны оптимизировать свой запрос, добавив индекс. Если вы выполняете запрос в Sql Server Management Studio, включая фактический план выполнения, то Sql Server Management Studio предложит вам соответствующий индекс. В большинстве случаев вы избавитесь от проблемы тайм-аута, если сможете оптимизировать свой запрос.

Ответ 14

TL;DR:

  1. Перезагрузка серверов приложений и БД - это самое быстрое решение, когда объем данных, настройки сети и код не изменились. Мы всегда делаем это как правило
  2. Может быть индикатор сбоя жесткого диска, который требует замены - проверьте системные уведомления

Я часто сталкивался с этой ошибкой по разным причинам и имел различные решения, в том числе:

  1. рефакторинг моего кода для использования SqlBulkCopy
  2. увеличение значений тайм-аута, как указано в различных ответах или проверка основных причин (может быть не связана с данными)
  3. Тайм-аут соединения (по умолчанию 15 с) - Время ожидания установления соединения с сервером SQL перед завершением - связано с TCP/PORT - может пройти контрольный список для устранения неполадок (очень удобная статья MSDN)
  4. Тайм-аут команды (по умолчанию 30 с) - Сколько времени занимает ожидание выполнения запроса - Выполнение запроса/связанный с сетевым трафиком - также имеет процесс устранения неполадок (еще одна очень удобная статья MSDN)
  5. Перезагрузка сервера (ов) - как приложения, так и сервера БД (если они отдельно) - там, где код и данные не изменились, среда должна была измениться - первое, что вы должны сделать. Обычно вызвано исправлениями (исправления или обновления операционной системы,.Net Framework или SQL Server). В частности, если исключение тайм-аута выглядит так, как показано ниже (даже если мы не используем Azure):
    • System.Data.Entity.Core.EntityException: Возникло исключение, которое, вероятно, связано с временным сбоем. Если вы подключаетесь к базе данных SQL Azure, рассмотрите возможность использования SqlAzureExecutionStrategy. ---> System.Data.Entity.Core.EntityCommandExecutionException: произошла ошибка при выполнении определения команды. Смотрите внутреннее исключение для деталей. ---> System.Data.SqlClient.SqlException: при получении результатов с сервера произошла ошибка транспортного уровня. (поставщик: поставщик TCP, ошибка: 0 - истекло время ожидания семафора.) ---> System.ComponentModel.Win32Exception: истекло время ожидания семафора