Не удалось вставить хэш-таблицу. Коэффициент загрузки слишком высокий. - asp.NET 4.0 MVC3 - PullRequest
7 голосов
/ 02 февраля 2012

У нас есть приложение ASP.NET 4.0 MVC3, работающее на серверах F5 с балансировкой нагрузки.

Мы получили исключение ниже. Мы не занимаемся многопоточностью в нашем веб-приложении, но не знаем, могут ли серверы балансировки нагрузки F5 учесть это уравнение. Мы видим, где происходит исключение в более ранних версиях .NET (большинство других публикаций имеют дело с .NET 2.0 и 3.5). Кто-нибудь испытывал эту проблему с .NET 4.0?

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

Другие ссылки уже просмотрены:

2012-02-02 06: 01: 42,671 [26] FATAL System [(null)] - необработанный исключение произошло в приложении XYZ. System.InvalidOperationException: сбой вставки хэш-таблицы. Коэффициент нагрузки слишком высоко. Наиболее распространенной причиной является запись нескольких потоков в Hashtable одновременно. в System.Collections.Hashtable.Insert (ключ объекта, значение объекта, логическое значение добавить) в System.ComponentModel.TypeDescriptor.NodeFor (тип, Boolean createDelegator) в System.ComponentModel.TypeDescriptor.GetProvider (Type type) в System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider..ctor (Тип тип) в System.Web.Mvc.ModelBinderDictionary.GetBinder (Тип modelType, IModelBinder fallbackBinder) в System.Web.Mvc.ControllerActionInvoker.GetModelBinder (ParameterDescriptor параметр-дескриптор) в System.Web.Mvc.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContext, ParameterDescriptor параметрDescriptor) в System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) в System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) в System.Web.Mvc.Controller.ExecuteCore () в System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext)
в System.Web.Mvc.MvcHandler. <> C__DisplayClass6. <> C__DisplayClassb.b__5 () в System.Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass1.b__0 () в System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () на System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, Boolean и выполняется синхронно)

Как вы можете видеть из трассировки стека, она не указывает на конкретное место в нашем коде, затрудняющее отладку.

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

Ответы [ 2 ]

6 голосов
/ 11 июня 2012

Это необычная проблема, но она случается для многих людей (включая меня). Кажется, что он не связан с каким-либо определенным порогом нагрузки, он просто «случается», и если это происходит, он продолжает происходить чаще, независимо от нагрузки.
Решения:
Временно: перезагрузите IIS и скрестите пальцы, это больше не повторится
Постоянный: получите исправление от Microsoft, описанное в статье KB , или дождитесь следующей версии .Net, где оно будет исправлено (сообщается, что оно уже исправлено в бета-версии 4.5)

0 голосов
/ 03 мая 2012

Проверьте ответ Ким в этой теме: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/172f4f77-601e-4b4f-8d98-582f8f62a98e


Привет Мэтт,

В .NET 2.0 эта ошибка почти всегда вызвана тем, что несколько потоков одновременно изменяют Hashtable. Исправление заключается в вставке блокировок перед изменением Hashtable, поскольку Hashtable не поддерживает многопотоковую запись. Другим возможным решением является работа с синхронизированной оболочкой через Hashtable.Synchronized, однако мы рекомендуем первую для более точного управления.

Так что это исправление, если ваш код изменяет Hashtable. На основании предоставленной вами информации, я думаю, что это не так. Вы упомянули, что вы столкнулись с этой ошибкой на веб-сайте ASP 2.0, так что это может быть вызвано вызывающим абонентом Hashtable. Например, если стек вызовов выглядит примерно так, обратите внимание, что это ошибка, исправленная в последней версии.

Спасибо, Ким

Трассировка стека: в System.Collections.Hashtable.Insert (ключ объекта, значение объекта n, логическое добавление) в System.Collections.Hashtable.set_Item (ключ объекта, значение объекта) в System.ComponentModel.TypeDescriptor.CheckDefaultProvider (Type type) at System.ComponentModel.TypeDescriptor.NodeFor (тип, логический тип createDelegator) в System.ComponentModel.TypeDescriptor.GetDescriptor (Тип тип, String typeName) в System.ComponentModel.TypeDescriptor.GetAttributes (Type componentType) в System.Web.UI.ThemeableAttribute.IsTypeThemeable (Тип тип) на System.Web.UI.Control.ApplySkin (Страница страницы) в System.Web.UI.Control.InitRecursive (элемент управления namingContainer) в System.Web.UI.Control.InitRecursive (элемент управления namingContainer) в System.Web.UI.Control.InitRecursive (элемент управления namingContainer) в System.Web.UI.Control.InitRecursive (элемент управления namingContainer) в System.Web.UI.Control.InitRecursive (элемент управления namingContainer) в System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint)

...