Назад | Перейти на главную страницу

Внезапно высокий ЦП в Windows Server 2012 R2

У нас есть простое веб-приложение 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 действительно виноват или что-то еще?