У нас есть простое веб-приложение ASP.NET (ASP.NET 2.0) на производстве с 2 веб-серверами, и каждый веб-сервер имеет 64 ГБ ОЗУ и 32 ядра. Производственный сайт иногда внезапно увеличивает загрузку ЦП до 90–100% на обоих серверах (за исключением w3wp.exe). Кроме того, мы обнаружили, что файл pagefile.sys также стал слишком большим (когда-то он составлял 70 ГБ +). Мы взяли несколько дампов процесса w3wp.exe и обнаружили интересные результаты. Например, мы обнаружили поток, которому на выполнение требуется 22 минуты,
Thread 2840
General Operation Info
Type Unknown Operation
Dumps present All dumps
Elapsed Time (unknown)
Thread Info
Entry point mscorwks!Thread::intermediateThreadProc
System ID 2840 (0xB18)
Create time 21/01/2018 10:55:34
All functions in this operation (excludes boiler-plate functions)
System.Security.CodeAccessSecurityEngine.Assert(System.Security.CodeAccessPermission, System.Threading.StackCrawlMark ByRef)
System.Security.CodeAccessPermission.Assert()
System.Security.PermissionToken.FindToken(System.Type)
System.Security.PermissionSet.RemovePermission(System.Type)
System.Security.PermissionSet.CopyWithNoIdentityPermissions()
System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32, System.Security.PermissionSet, System.Threading.CompressedStack)
System.Security.CodeAccessSecurityEngine.Assert(System.Security.CodeAccessPermission, System.Threading.StackCrawlMark ByRef)
System.Security.CodeAccessPermission.Assert()
System.Security.PermissionToken.FindToken(System.Type)
System.Security.PermissionSet.RemovePermission(System.Type)
System.Security.PermissionSet.CopyWithNoIdentityPermissions()
System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32, System.Security.PermissionSet, System.Threading.CompressedStack)
User Time 00:22:42.359
Kernel time 00:01:59.765
Мой вопрос в том, почему CodeAccessSecurityEngine выполняется 22 минуты?
Мы обнаружили в дампах не менее 48 потоков, которые используют CodeAccessSecurityEngine и занимают много времени. Еще несколько примеров,
Thread 8092
General Operation Info
Type Unknown Operation
Dumps present All dumps
Elapsed Time (unknown)
Thread Info
Entry point mscorwks!Thread::intermediateThreadProc
System ID 8092 (0x1F9C)
Create time 21/01/2018 10:25:40
System.String.InternalSubString(Int32, Int32, Boolean)
System.RuntimeType.SplitName(System.String, System.String ByRef, System.String ByRef)
System.RuntimeType.GetInterface(System.String, Boolean)
System.Security.PermissionToken.FindToken(System.Type)
System.Security.PermissionSet.RemovePermission(System.Type)
System.Security.PermissionSet.CopyWithNoIdentityPermissions()
System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32, System.Security.PermissionSet, System.Threading.CompressedStack)
User Time 00:26:49.734
Kernel time 00:02:38.296
-------------------------------------------------------------------------------
Thread 2360
General Operation Info
Type Unknown Operation
Dumps present All dumps
Elapsed Time (unknown)
Thread Info
Entry point mscorwks!Thread::intermediateThreadProc
System ID 2360 (0x938)
Create time 21/01/2018 10:47:53
System.Collections.Generic.List`1[[System.__Canon, mscorlib]].set_Capacity(Int32)
System.Collections.Generic.List`1[[System.__Canon, mscorlib]].EnsureCapacity(Int32)
System.Collections.Generic.List`1[[System.__Canon, mscorlib]].Add(System.__Canon)
System.RuntimeType.GetMethodCandidates(System.String, System.Reflection.BindingFlags, System.Reflection.CallingConventions, System.Type[], Boolean)
System.RuntimeType.GetMethodImpl(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Reflection.CallingConventions, System.Type[], System.Reflection.ParameterModifier[])
System.Security.PermissionToken.FindToken(System.Type)
System.Security.PermissionSet.RemovePermission(System.Type)
System.Security.PermissionSet.CopyWithNoIdentityPermissions()
System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32, System.Security.PermissionSet, System.Threading.CompressedStack)
User Time 00:25:37.671
Kernel time 00:02:29.953
-------------------------------------------------------------------------------
Thread 7008
General Operation Info
Type Unknown Operation
Dumps present All dumps
Elapsed Time (unknown)
Thread Info
Entry point mscorwks!Thread::intermediateThreadProc
System ID 7008 (0x1B60)
Create time 21/01/2018 10:54:20
System.Reflection.MethodBase.CheckArguments(System.Object[], System.Reflection.Binder, System.Reflection.BindingFlags, System.Globalization.CultureInfo, System.Signature)
System.Reflection.RuntimeConstructorInfo.Invoke(System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
System.RuntimeType.CreateInstanceImpl(System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo, System.Object[])
System.Security.PermissionSet.AddPermission(System.Security.IPermission)
System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32, System.Security.PermissionSet, System.Threading.CompressedStack)
User Time 00:23:01.656
Kernel time 00:02:04.625
-------------------------------------------------------------------------------
Thread 5584
General Operation Info
Type Unknown Operation
Dumps present All dumps
Elapsed Time (unknown)
Thread Info
Entry point mscorwks!Thread::intermediateThreadProc
System ID 5584 (0x15D0)
Create time 21/01/2018 10:53:13
System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32, System.Security.PermissionSet, System.Threading.CompressedStack)
User Time 00:23:40.421
Kernel time 00:02:08.296
Дампы были получены и проанализированы с помощью диагностики отладки, как показано здесь. https://docs.microsoft.com/en-us/iis/troubleshoot/performance-issues/troubleshooting-high-cpu-in-an-iis-7x-application-pool
CodeAccessSecurityEngine действительно виноват или что-то еще?