2013-07-31 6 views
15

Иногда наш сайт замедляется, а использование ОЗУ растет очень высоко. Затем пул приложений останавливается, и я должен перезапустить его. Тогда это нормально в течение нескольких дней, прежде чем ОЗУ внезапно всплескивает снова, и пул приложений скоро остановится. Процессор невелик.foreach загадочно зависает на первом элементе ResourceSet

Перед остановкой в ​​приложении, я заметил, что одна из наших страниц всегда зависает. Линия она висит на это Еогеасп на ResourceSet:

var englishLocations = Lang.Countries.ResourceManager.GetResourceSet(new CultureInfo("en-GB"),true,true); 
foreach(DictionaryEntry entry2 in englishLocations) // THIS LINE HANGS 

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

Плохой коробки

  • Окно Server 2008 R2 Стандартный SP 1
  • IIS 7.5.7600.16385
  • .NET 4.5
  • 24 ГБ RAM

Хорошо поле

  • Window Server SP 2008 Сервер 2
  • IIS 7.0.6000.16386 SP 2
  • .NET 4.0
  • 24ГБ RAM

Я пытался добавить UploadReadAheadSize = "0" в web.config, как описано здесь:

http://rionscode.wordpress.com/2013/03/11/resolving-controller-blocking-within-net-4-5-and-asp-net-mvc/

Что не сработало.

Зачем нужно было искать? Он висит на самом первом предмете, фактически на foreach.

Спасибо.

+0

Уверены ли вы в этом? Потому что размер файла ресурсов будет иметь большое значение. Если размер файла ресурсов большой, то существует вероятность того, что заполнение var значениями файла ресурсов может быть реальной проблемой. Попробуйте дать var datatype –

+0

Я уверен, отлаживал его в течение нескольких недель. Файл ресурсов содержит 250 записей. У меня есть много других файлов ресурсов, чтобы охватить различные элементы сайта. –

+0

Возможно, проблема с резервными ресурсами. Вы пытались вызвать его без загрузки резервных копий, например «GetResourceSet» (новая версия CultureInfo («en-GB»), true, FALSE); – developer10214

ответ

1

На основании другого ответа, чтобы дать вам некоторое представление о том, как использовать модель try catch? Возможно, он висит, потому что ресурс разве доступные/заблокированные /..permissions т.д.

var englishLocations = Lang.Countries.ResourceManager.GetResourceSet(new CultureInfo("en-GB"),true,true); 
foreach(DictionaryEntry entry2 in englishLocations) // THIS LINE HANGS 



ResourceManager CultureResourceManager = new ResourceManager("My.Language.Assembly", System.Reflection.Assembly.GetExecutingAssembly()); 
ResourceSet resourceSet = CultureResourceManager.GetResourceSet("sv-SE", true, true); 
try { resourceSet.GetString("my_language_resource");} 
catch (exception ex) { // from here log your error ex to wherever you like with some code } 
2

я испытал очень подобную проблему.

Время от времени IIS зависает, и я вижу, что количество запросов просто сидит там. Все они находились в состоянии ExecuteRequestHandler и с именем модуля ManagedPipelineHandler.

После исследования с помощью проводника процессов я мог видеть, что все они сидели в mscorlib.dll!ResourceEnumerator.get_Entry, дополнительная трассировка стека предложила некоторое действие NGen, а затем ntdll.dll!WaitForMultipleObjects.

Моя рабочая гипотеза заключается в том, что, когда несколько потоков начинают перечислять эти ресурсы, мы можем зайти в тупик (возможно, при генерации некоторого собственного кода), а все последующие потоки alll просто продолжаем накапливаться.

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

private static readonly object ResourceLock = new object(); 

public static MvcHtmlString SerializeGlobalResources(this HtmlHelper helper) 
{ 
    lock (ResourceLock) 
    { 
     // Existing code goes here .... 
    } 
} 
8

Я знаю, что это старый пост, но тем не менее ... Существует потенциал тупика при переборе по ResourceSet и в то же время получения какой-либо другой объект через из одних и тех же ресурсов.

Проблема заключается в том, что при использовании ResourceSet итератор вынимает замки на внутреннем кэше ресурсного ResourceReader http://referencesource.microsoft.com/#mscorlib/system/resources/resourcereader.cs,1389, а затем в методе AllocateStringNameForIndex вынимает замок на самом читателе: http://referencesource.microsoft.com/#mscorlib/system/resources/resourcereader.cs,447

lock (_reader._resCache) { 
    key = _reader.AllocateStringForNameIndex(_currentName, out _dataPosition); // locks the reader 

Getting объект вынимает те же замки Int обратного порядка:

http://referencesource.microsoft.com/#mscorlib/system/resources/runtimeresourceset.cs,300 и http://referencesource.microsoft.com/#mscorlib/system/resources/runtimeresourceset.cs,335

lock(Reader) { 
    .... 
    lock(_resCache) { 
     _resCache[key] = resLocation; 
    } 
} 

Это может привести к тупику. Недавно у нас был этот точный вопрос.

+3

Получил тупик точно такой же парой методов несколько лет назад. MS открыл исходный код coreclr, поэтому я сделал исправление - https://github.com/dotnet/coreclr/pull/75. Это уже сделано. Надеюсь, он будет включен в следующий выпуск CLR для настольных ПК. – PashaPash

+1

Кто-нибудь знает, исправлено ли исправление в релизе? Версия Release не управляется в репозитории GitHub. –

+0

Просмотрели источники по адресу http://referencesource.microsoft.com/download.html. Проблема была исправлена ​​в 4.6, что-то более старое выйдет в тупик. – plmaheu

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