2014-02-17 3 views
2

Я работаю на очень большом веб-сайте электронной торговли с высоким трафиком. Мы переносим наш сайт с ColdFusion на .NET. Мы недавно столкнулись с проблемой во время этого преобразования, о котором я надеялся немного помочь. Наш текущий сайт составляет около 1/3 .net сейчас и 2/3 ColdFusion.. Сбой веб-сайта .NET

Одна из проблем заключается в том, что при выпуске нашего последнего проекта, который представляет собой проект для преобразования раздела «Моя учетная запись», все отлично, но в любом месте от 3 до 24 часов сайт просто падает. Чтобы восстановить его, нам необходимо перезапустить IIS, а иногда ColdFusion. Когда я говорю о сбоях, я имею в виду, что он просто висит, сидит там и вращается навсегда.

У нас действительно хороший мониторинг серверов, но когда мы смотрим на память служб, ничего необычного не наблюдается, за исключением количества подключений к SQL. По какой-то причине довольно быстро, прежде чем крах SQL застревает в количестве подключений, он идет примерно из 24 подключений примерно до 100, просто сидит там, и сайт идет вниз, пока мы не перезапустим службы.

В настоящее время мы используем SQL Server 2005, инфраструктуру Entity как наш метод доступа к данным, и мы находимся на IIS 7.5. Наш веб-сервер является виртуальным, но наша база данных является физической.

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

Это пример нашего текущего доступа к данным объекта:

/// <summary> 
    /// Get Products by their Primary Category ID. Default Category ID is 0: Top Level Categories. 
    /// </summary> 
    /// <param name="languageCode">Two character language code of Categories being searched. Defined in dbo.Languages, LanguageCode field.</param> 
    /// <param name="primaryCategoryId">int - Primary Category ID</param> 
    /// <returns>List&lt;Product%gt;</returns> 
    public List<Products.Product> GetProducts(string languageCode, int primaryCategoryId = 0) 
    { 
     CatalogEntity context = null; 
     EntityConnection conn = null; 

     try 
     { 
      conn = this.GetConnection(); 
      context = new CatalogEntity(conn); 

      List<I_Products> Products = context.GetProductsByPrimaryCatId(primaryCategoryId, languageCode).Distinct().ToList(); 
      return Products.Select(Product => new Products.Product(Product)).Distinct().ToList(); 
     } 
     catch (System.Exception ex) 
     { 
      string message = "Error occurred while calling GetProducts."; 
      throw new Exception.CatalogDataException(message, CodeLibrary.Core.Helpers.ProcessHelper.GetProcessName(this), ex); 
     } 
     finally 
     { 
      if (conn != null && conn.State == ConnectionState.Open) conn.Close(); 
      if (context != null) context.Dispose(); 
      conn.Dispose(); 
     } 
    } 

Опять же, это только один пример одного из наших методов доступа к данным в C#. Не видишь никаких проблем с этим? Опять же, мы используем этот формат по всем направлениям. Мы это подтвердили.

С новым проектом .net мы используем провайдер членства .net. Мы используем CLR для шифрования паролей пользователей с хешем, чтобы мы могли использовать один и тот же метод хеширования в CF. Не уверен, что это проблема, но подумал, что стоит упомянуть.

Любые идеи?

+2

Тот факт, что количество сбоев SQL-пакетов падает до сбоев, указывает на проблему с базой данных. Может быть, это тупик или тайм-аут в SQL Server? – recursive

+0

Наверное, выясните, что делает каждое из этих новых подключений SQL (какие запросы выполняются), которые могут пролить свет на то, почему они создаются. –

+0

Мы пропустили профайлер SQL до и во время одной из этих сбоев и не видели ничего, что выглядело бы из нормы. – user3320043

ответ

0

Здесь есть список возможностей. Например, когда вызов SQL-сервера не возвращает данные в CF, CF может висеть на потоке. Это становится своего рода «фантомной нитью». Затем CF создает новые соединения с сервером БД и добавляет их в пул соединений - в результате появляется много дополнительных подключений, которые вы видите. Он учитывается в настройках «одновременных запросов» в CF-администрировании. Когда их достаточно, чтобы «подвешивать» вашу очередь запросов, и ваш сервер блокируется, даже если он не появляется, что-то происходит. Вы можете увидеть это поведение, включив показатели, используя монитор сервера (если на корпоративной версии) или используя fusionreactor (отличный и недорогой сторонний интроспективный монитор для вашего сервера CF/Java).

Конечно, это , что происходит. Вы должны найти , почему это происходит. Среди возможных возможностей:

  • Сеть - иногда автосинхронные по портам коммутаторы могут перехватывать соединения и приводить к зависанию «фантомных» потоков. См. Этот пост на Hanging jrun and networking.
  • Блокировка базы данных - это может вызвать проблемы, подобные этому, и может произойти, даже если вы считаете, что не видите его. Иногда сложно поймать.Одной из проблем с блокировкой, которая может быть проблематичной, является «max degree of parallelism», что может привести к довольно простаивающим соединениям DB, которые тем не менее висят.

Возможно, вам понадобится получить дополнительную информацию о стороне CF, чтобы точно знать, что здесь происходит.


Последующие действия ... Я предоставляю некоторые возможности со стороны CF, хотя ваш вопрос был на стороне .NET. Я предполагаю, что CF может быть в игре, поскольку перезагрузка CF иногда исправляет проблему.

Смежные вопросы