Nano Hash - криптовалюты, майнинг, программирование

Как несколько запросов ASP.NET с одним и тем же сеансом могут выполняться одновременно по умолчанию?

Приложение ASP.NET MVC 4.0 время от времени зависает в нашей производственной среде. Пытаясь проанализировать проблему с помощью Windbg (+ SOS, SOSEX, NETEXT & MEX) и двух дампов памяти производственного процесса, я заметил, что проблема всегда возникает, когда два запроса обрабатываются одновременно (выполняется бизнес-код .NET) для ЖЕ сеанс. Из того, что я думал, я знал, это невозможно без настройки поведения сеанса (с использованием конфигурации, атрибутов или ControllerFactory). Сеансы используются в этом приложении (чрезмерно), и поведение сеанса не было настроено. Единственная настройка, которую я могу найти (controllers/code/config), это в web.config:

<sessionState timeout="720" />

Вот результаты моего сеанса Windbg, если кто-то может помочь мне понять этот случай.

!whttp

HttpContext    Thread Time Out Running  Status Verb     Url
0000002d0c7754b0   26 00:01:50 00:36:55    200 POST     /Ctrl/Action
0000002e06a2e7e8   27 00:01:50 00:41:45    200 POST     /Ctrl/Action
[...]

Эти два HTTP-запроса выполняются вечно.

!DumpAspNetSession -ctx 0000002d0c7754b0

System.Web.SessionState.HttpSessionStateContainer: 0x0000002d0c7a9a38
Key                              Value
================================ ======================================================
VarSession                       0000002e06587000 (App.VarSession)

!DumpAspNetSession -ctx 0000002e06a2e7e8

System.Web.SessionState.HttpSessionStateContainer: 0x0000002e06a3a810
Key                              Value
================================ ======================================================
VarSession                       0000002e06587000 (App.VarSession)

Сеансы, соответствующие приведенному выше HttpContext, содержат одни и те же данные (тип App.VarSession).

!wcookie

0000002d0c7754b0 /Ctrl/Action (200 NULL) Running (00:36:55)
======================================================================================
ASP.NET_SessionId=im3clvnd0auw0te3nkzzq1p0

======================================================================================
0000002e06a2e7e8 /Ctrl/Action (200 NULL) Running (00:41:45)
======================================================================================
ASP.NET_SessionId=im3clvnd0auw0te3nkzzq1p0

Эта последняя команда показывает, что два запроса действительно связаны с одним и тем же сеансом.

~26s

0:026› !CLRStack

OS Thread Id: 0x122c (26)
        Child SP               IP Call Site
0000002f2de47750 00007ff91a2042db System.Linq.Enumerable+d__14`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext()
0000002f2de477b0 00007ff91a2095b7 System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1, System.Func`2)
0000002f2de47810 00007ff8be3ce1fe App.DALApp.GetData(...)

~27s

0:027› !CLRStack

OS Thread Id: 0x313c (27)
        Child SP               IP Call Site
0000002f2f976f20 00007ff8be5022ef App.DALApp.b__257(...) 
0000002f2f976f60 00007ff91a2042ab System.Linq.Enumerable+d__14`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext()
0000002f2f976fc0 00007ff91a2095b7 System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1, System.Func`2)
0000002f2f977020 00007ff8be501038 App.DALApp.GetSomeData(...) 

Оба запроса выполняют пользовательский код (на самом деле они используют 100% ЦП и никогда не заканчиваются...)

Должен ли этот случай быть возможен? Если да, то при каких условиях и что я неправильно понял в отношении поведения блокировки состояния сеанса? (https://docs.microsoft.com/en-us/dotnet/api/system.web.sessionstate.sessionstatebehavior?view=netframework-4.0) Может ли это странное поведение быть причиной зависания приложения?

Спасибо.

РЕДАКТИРОВАТЬ: прочитав некоторый код ASP.NET, я сбросил два HttpContext, и это подтверждает странное поведение (два запроса с требуемым поведением состояния сеанса и одним и тем же сеансом сразу) . Я что-то неправильно понял? Я не могу поверить, что такая ошибка может существовать без ведома (я не могу найти подобную проблему в Интернете):

!вдо 0000002E06A2E7E8

Address: 0000002e06a2e7e8
Method Table/Token: 00007ff919304a98/20003a304 
Class Name: System.Web.HttpContext
...
00007ff919346278         System.Web.SessionState.SessionStateBeha +0164    _SessionStateBehavior_k__BackingField 0 (0n0) Default
00007ff91bb9f370                                   System.Boolean +0175         _requiresSessionStateFromHandler 1 (True)
00007ff91bb9f370                                   System.Boolean +0176         _readOnlySessionStateFromHandler 0 (False)
00007ff91bb9f370                                   System.Boolean +0177                          InAspCompatMode 0 (False)
00007ff91bb9f370                                   System.Boolean +0179            _FirstRequest_k__BackingField 0 (False)
00007ff91bbb7af8                                  System.DateTime +0180                            _utcTimestamp -mt 00007FF91BBB7AF8 0000002E06A2E970 28/02/2020 08:16:37

!вдо 0000002D0C7754B0

Address: 0000002d0c7754b0
Method Table/Token: 00007ff919304a98/20003a304 
Class Name: System.Web.HttpContext
...
00007ff919346278         System.Web.SessionState.SessionStateBeha +0164    _SessionStateBehavior_k__BackingField 0 (0n0) Default
00007ff91bb9f370                                   System.Boolean +0175         _requiresSessionStateFromHandler 1 (True)
00007ff91bb9f370                                   System.Boolean +0176         _readOnlySessionStateFromHandler 0 (False)
00007ff91bb9f370                                   System.Boolean +0177                          InAspCompatMode 0 (False)
00007ff91bb9f370                                   System.Boolean +0179            _FirstRequest_k__BackingField 0 (False)
00007ff91bbb7af8                                  System.DateTime +0180                            _utcTimestamp -mt 00007FF91BBB7AF8 0000002D0C775638 28/02/2020 08:21:27

РЕДАКТИРОВАТЬ 2: Также задан вопрос на форумах ASP.NET MVC: 20same%20session%20possible%20без%20specific%20setting%20" rel="nofollow noreferrer">https://forums.asp.net/t/2169038.aspx?Multiple+concurrent+ASP+NET+MVC+4+запросы +для+того же+сеанса+возможно+без+специфических+настроек+


  • Может ли ваш App.DALApp возвращать кэшированную коллекцию, не являющуюся потокобезопасной, которую обрабатывают оба потока? Может быть, это вызывает бесконечный цикл? 10.07.2020
  • Спасибо за совет. Я уже проверил это и не могу найти способ, которым на эти коллекции можно было бы ссылаться несколькими потоками. Они воссоздаются из БД при вызове каждого потока. Я все равно проверю дважды. Я все еще удивлен тем, что оба потока выполняются одновременно для одного и того же сеанса... 11.07.2020
  • На самом деле, я думаю, вы были правы. Некоторый код повторяется следующим образом: collection.SelectMany(c => things).SelectMany(t => things2).SelectMany(t2 => things3) (внутри методов GetData()). Я обнаружил, что t2.Things3 всегда являются разными экземплярами List‹› в разных потоках, НО иногда они содержат одну и ту же ссылку на массив _items. Я не уверен, как это возможно (?), но я думаю, что я на правильном пути. 11.07.2020
  • Общий экземпляр List‹T›._items, о котором я говорил, на самом деле является закрытым синглтоном List‹T› (статическим) emptyArray... Моя проблема где-то в другом месте. 15.07.2020
  • Что касается зависания, я проверил перечисляемые ссылки на объекты (все они от корня до текущего элемента) и не могу найти ни одной общей ссылки между обоими потоками. (Трассировка стека потока 27 дает текущий элемент) 15.07.2020
  • По поводу зависания приложения. Проверка деталей процесса показывает, что он манипулирует МНОЖЕСТВОМ данных, ведущих к вложенным циклам/Linq с кумулятивным количеством итераций, превышающим 50 миллиардов... Так что это не зависание, а ДЕЙСТВИТЕЛЬНО слишком тяжелый процесс. 16.07.2020

Ответы:


1

Я только что нашел ответ на свой вопрос. Параметр HttpRuntime executeTimeout (по умолчанию 110 секунд для ASP.NET 2+) управляет максимальной продолжительностью потока запроса И продолжительностью блокировки состояния сеанса. Таким образом, после 110 секунд обработки возможен другой запрос из того же сеанса, так как блокировка сеанса была снята. В моем случае, как указано @user2116910 в ссылке SO ниже, первый поток обработки запросов никогда не уничтожается (возможно, из-за того, что приложение было развернуто с использованием конфигурации отладки! :-/)

Использованная литература:

16.07.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..