падение рабочего процесса IIS-а
От: MadHuman Россия  
Дата: 28.04.16 14:17
Оценка:
Добрый день, коллеги!

Недавно на продакш машине, рабочий процесс ИИС-а упал с такой ошибкой:

Приложение: w3wp.exe
Версия платформы: v4.0.30319
Описание. Процесс был завершен из-за необработанного исключения.
Сведения об исключении: System.AccessViolationException
Стек:
в System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr, Boolean, Boolean ByRef)
в System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr, Boolean, Boolean ByRef)
в System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
в System.Web.HttpResponse.Flush(Boolean, Boolean)
в System.Web.HttpResponseWrapper.Flush()
в SkyBaseWebFront.Controllers.NotifController._sendNotif(System.Web.HttpResponseBase, System.Object, System.String)
в SkyBaseWebFront.Controllers.NotifController.sendNotifToUser(SkyBaseCore.AppId, SkyBaseCore.SBSystem.SBUserInfo, System.String, System.Object, Int32)
в SkyBaseCore.UserApp.Notifications+<>c__DisplayClass14.<NotifyAboutNewslineCreatedAsync>b__13()
в System.Threading.Tasks.Task.Execute()
в System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
в System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
в System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
в System.Threading.Tasks.Task.ExecuteEntry(Boolean)
в System.Threading.ThreadPoolWorkQueue.Dispatch()

эпизодически (раз в не делю) такое случается. не мэнаджед кода (который мог бы попортить память) в процессе нет, падает именно при Flush вызванном из асинхронного метода контролера.
гугление результатов никаких не дало... Кто нибудь с таким сталкивался?
Re: падение рабочего процесса IIS-а
От: #John Европа https://github.com/ichensky
Дата: 28.04.16 18:53
Оценка:
Здравствуйте, MadHuman, Вы писали:


MH> в System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr, Boolean, Boolean ByRef)


Похоже на это
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[2]: падение рабочего процесса IIS-а
От: MadHuman Россия  
Дата: 29.04.16 06:49
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте, MadHuman, Вы писали:



MH>> в System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr, Boolean, Boolean ByRef)


J>Похоже на это


Не, не оно. Там ИИС сознательно абортит трэд с исключением ThreadAbortedException, дело заканчивается только убиением одного потока.
В нашем случае возникает System.AccessViolationException — и падает весь процесс.
Re[3]: падение рабочего процесса IIS-а
От: #John Европа https://github.com/ichensky
Дата: 29.04.16 12:52
Оценка:
Здравствуйте, MadHuman, Вы писали:

>>System.AccessViolationException — и падает весь процесс.

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

возможно Flush вызывается асинхронно несколько раз(это можно проверить логгированием),
или вызывается какой-то другой asp.net метод который может освободить нужную память(это надо смотреть как написан сам метод).
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: падение рабочего процесса IIS-а
От: VladCore  
Дата: 30.04.16 06:46
Оценка:
Здравствуйте, MadHuman, Вы писали:

IIS имеет право рестартануть приложение когда ему вздумается. какие при этом иксепшены выскакивают зависит от версии.

использование памяти смотрели?

ну и перепроверьте что нет unmanaged-кода. создавать managed сборки c unmanaged кодом никто не запрещал
Отредактировано 30.04.2016 6:58 VladCore . Предыдущая версия . Еще …
Отредактировано 30.04.2016 6:53 VladCore . Предыдущая версия .
Re[2]: падение рабочего процесса IIS-а
От: MadHuman Россия  
Дата: 30.04.16 12:53
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>IIS имеет право рестартануть приложение когда ему вздумается. какие при этом иксепшены выскакивают зависит от версии.

де нет, это не рестарт. это крах процесса по AccessViolation, причем из нативного кода ИИС-а, похоже бага в ИИС-е

VC>использование памяти смотрели?

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

стало падать почти раз в день. коррелирует с ростом нагрузки.
думаю это бага ИИС-а,других вариантов нет, может микрософту баг-репорт написать? где это можно сделать?..
или как-то придумать способ как обойти... но хз с чем связано... может ИИС не любит конкурентные Flush-ы в один Response?..
Re[4]: падение рабочего процесса IIS-а
От: MadHuman Россия  
Дата: 17.05.16 06:51
Оценка:
Здравствуйте, #John, Вы писали:


J>похоже что в момент когда Flush получает данные из памяти для отправки на клиент эта память уже освобождена.


J>возможно Flush вызывается асинхронно несколько раз(это можно проверить логгированием),

J>или вызывается какой-то другой asp.net метод который может освободить нужную память(это надо смотреть как написан сам метод).

похоже дело было в этом. Flush на одном и том же HttpResponse мог вызываться разными потоками и соотвественно возможно есть вероятность что были паралельные вызовы из разных потоков в один момент времени. отключил использование буферизации и добавил сериализацию записи (через lock) в HttpResponse — падения прекратились.
Видимо нельзя вызывать Flush на одном HttpResponse из разных потоков, странно что в доке об этом ничего не сказано.
Re[5]: падение рабочего процесса IIS-а
От: Neco  
Дата: 23.05.16 16:57
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>Видимо нельзя вызывать Flush на одном HttpResponse из разных потоков, странно что в доке об этом ничего не сказано.

а это разве не дефолтное поведение для большинства классов дотнета?
https://msdn.microsoft.com/en-us/library/system.web.httpresponse(v=vs.110).aspx

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

всю ночь не ем, весь день не сплю — устаю
Re[6]: падение рабочего процесса IIS-а
От: MadHuman Россия  
Дата: 23.05.16 18:20
Оценка:
Здравствуйте, Neco, Вы писали:

N>Здравствуйте, MadHuman, Вы писали:


MH>>Видимо нельзя вызывать Flush на одном HttpResponse из разных потоков, странно что в доке об этом ничего не сказано.

N>а это разве не дефолтное поведение для большинства классов дотнета?
N>https://msdn.microsoft.com/en-us/library/system.web.httpresponse(v=vs.110).aspx
N>

N>Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

да, действительно сказано. спасибо за наводку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.