Тайм-аут истек. Время ожидания истекло до завершения операции или сервер не отвечает. Выполнение данной инструкции было прервано


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

полный текст сообщения об ошибке ниже:

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

Сведения Об Исключении: System.Данные.SqlClient.SqlException: Тайм-Аут истeкший. Время ожидания истекло до завершения этот операции или сервер не отвечает. Заявление было сделано завершенный.

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

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

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

[SqlException (0x80131904): тайм-аут истек. Таймаут прошло до завершения операции или сервер не отвечать на запросы. Заявление было прекращено.]
Система.Данные.SqlClient.Объект sqlconnection.OnError (исключение SqlException, Boolean breakConnection) +404
Система.Данные.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
Система.Данные.SqlClient.TdsParser.Run(RunBehavior runBehavior, CmdHandler команда sqlcommand, sqldatareader выполняет данных, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
Система.Данные.SqlClient.Свойство sqlcommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6387741
Система.Данные.SqlClient.Свойство sqlcommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean асинхронный) +6389442
Система.Данные.SqlClient.Свойство sqlcommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String метод, DbAsyncResult результат) +538
Система.Данные.SqlClient.Свойство sqlcommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +689
Система.Данные.SqlClient.Свойство sqlcommand.ExecuteNonQuery () +327
NovinMedia.Данные.Объектов базы данных.RunProcedure(строка storedProcName, IDataParameter [] параметры, Int32 & rowsAffected) +209
Уровень данных.OnlineUsers.Update_SessionEnd_And_Online(Объект Session_End, Логические Онлайн) +440
NiceFileExplorer.Глобальный.Событий Application_Start(объект отправителя, EventArgs e) +163

[HttpException (0x80004005): тайм-аут истек. Таймаут истекло до завершения операции или сервер не отвечать на запросы. Заявление было прекращено.]
Система.Сеть.HttpApplicationFactory.EnsureAppStartCalledForIntegratedmode(Объект HttpContext контекст, приложение HttpApplication) +4052053
Система.Сеть.HttpApplication.RegisterEventSubscriptionsWithIIs(Указателя IntPtr класс appcontext, свойство HttpContext контекст, объект methodinfo[] обработчики) +191
Система.Сеть.HttpApplication.InitSpecial (состояние HttpApplicationState, Обработчики MethodInfo [], IntPtr appContext, HttpContext context) +352
Система.Сеть.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
Система.Сеть.Размещающий.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): тайм-аут истек. Таймаут истекло до завершения операции или сервер не отвечать на запросы. Заявление было прекращено.]
Система.Сеть.Строки httpruntime.FirstRequestInit (HttpContext context) +11686928 Система.Сеть.Строки httpruntime.EnsureFirstRequestInit (контекст HttpContext) Система +141.Сеть.Строки httpruntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest WR, HttpContext context) +4863749


РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТОВ:
мой 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

у меня есть два метода для получения пользователей в интернете:

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

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

11 235

11 ответов:

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

этот тип ожидания может иметь три причины;

  1. там где-то тупик
  2. статистика базы данных и / или кэш плана запроса неверны
  3. запрос слишком сложный и требует настройки

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

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

exec sp_updatestats

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

dbcc freeproccache

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

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

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

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

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

c.CommandTimeout = 0;

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

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

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

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

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 не является завершено до истечения времени ожидания.

см. КБ 2605597 для подробности

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

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

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

cmd.CommandTimeout = 50

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

вы должны установить атрибут 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; }
}

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

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

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

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

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

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

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

У меня проблема с большими вычислениями в 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;
    }

попробовать

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

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