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

у меня много пользователей на моем веб-сайте (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, SqlCommand cmdHandler, sqldatareader поток данных, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
Система.Данные.В sqlclient.Свойство sqlcommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, строка resetOptionsString) +6387741
Система.Данные.В sqlclient.Свойство sqlcommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
Система.Данные.В sqlclient.Свойство sqlcommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический обратный поток, строка метод, результат 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, Boolean Online) +440
NiceFileExplorer.Глобальный.Событий Application_Start(объект отправителя, EventArgs в электронной) +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 ответов


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

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

  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

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