Ayer recibí una llamada de un cliente que se quejaba del uso elevado de la CPU en su SQL Server. Estamos utilizando SQL Server 2012 64 bit SE. El servidor ejecuta Windows Server 2008 R2 Standard, 2.20 GHz Intel Xeon (4 núcleos), 16 GB de RAM.
Después de asegurarme de que el culpable era de hecho SQL Server, eché un vistazo a las esperas superiores para la instancia usando la consulta DMV aquí . Las dos esperas principales fueron: (1) PREEMPTIVE_OS_DELETESECURITYCONTEXT
y (2) SOS_SCHEDULER_YIELD
.
EDITAR : Aquí están los resultados de la "consulta de espera superior" (aunque alguien reinició el servidor esta mañana en contra de mis deseos):
Hacemos muchos cálculos / conversiones intensas, así que puedo entender SOS_SCHEDULER_YIELD
. Sin embargo, tengo mucha curiosidad sobre el PREEMPTIVE_OS_DELETESECURITYCONTEXT
tipo de espera y por qué podría ser el más alto.
La mejor descripción / discusión que puedo encontrar sobre este tipo de espera se puede encontrar aquí . Menciona:
Los tipos de espera PREEMPTIVE_OS_ son llamadas que abandonaron el motor de la base de datos, generalmente a una API Win32, y realizan código fuera de SQL Server para diversas tareas. En este caso, está eliminando un contexto de seguridad utilizado anteriormente para el acceso a recursos remotos. La API relacionada en realidad se llama DeleteSecurityContext ()
Que yo sepa, no tenemos recursos externos como servidores vinculados o tablas de archivos. Y no hacemos ninguna suplantación, etc. ¿Podría una copia de seguridad haber causado que esto aumentara o tal vez un controlador de dominio defectuoso?
¿Qué diablos podría hacer que este sea el tipo de espera dominante? ¿Cómo puedo seguir este tipo de espera?
Edición 2: Revisé el contenido del Registro de seguridad de Windows. Veo algunas entradas que pueden ser de interés, pero no estoy seguro de si son normales:
Special privileges assigned to new logon.
Subject:
Security ID: NT SERVICE\MSSQLServerOLAPService
Account Name: MSSQLServerOLAPService
Account Domain: NT Service
Logon ID: 0x3143c
Privileges: SeImpersonatePrivilege
Special privileges assigned to new logon.
Subject:
Security ID: NT SERVICE\MSSQLSERVER
Account Name: MSSQLSERVER
Account Domain: NT Service
Logon ID: 0x2f872
Privileges: SeAssignPrimaryTokenPrivilege
SeImpersonatePrivilege
Edición 3 : @Jon Seigel, como solicitó, aquí están los resultados de su consulta. Un poco diferente al de Paul:
Edición 4: Lo admito, soy el primer usuario de Extended Events. Agregué este tipo de espera al evento wait_info_external y vi cientos de entradas. No hay texto sql o identificador de plan, solo una pila de llamadas. ¿Cómo puedo seguir rastreando la fuente?
fuente
Respuestas:
Sé que esta pregunta, basada en el Título, se refiere principalmente al tipo de espera PREEMPTIVE_OS_DELETESECURITYCONTEXT, pero creo que es una mala dirección del verdadero problema que es " un cliente que se quejaba de un alto uso de CPU en su servidor SQL ".
La razón por la que creo que centrarse en este tipo de espera específico es una búsqueda inútil es porque aumenta con cada conexión realizada. Estoy ejecutando la siguiente consulta en mi computadora portátil (lo que significa que soy el único usuario):
Y luego hago lo siguiente y vuelvo a ejecutar esta consulta:
SQLCMD -E -Q "select 1"
Ahora, sabemos que la CPU es alta, por lo que debemos ver qué se está ejecutando para ver qué sesiones tienen una CPU alta:
Normalmente ejecuto la consulta anterior tal como está, pero también podría cambiar qué cláusula ORDER BY se comenta para ver si eso da resultados más interesantes / útiles.
Alternativamente, puede ejecutar lo siguiente, basado en dm_exec_query_stats, para encontrar las consultas de mayor costo. La primera consulta a continuación le mostrará consultas individuales (incluso si tienen varios planes) y está ordenada por Tiempo promedio de CPU, pero puede cambiarla fácilmente para que sea Lecturas lógicas promedio. Una vez que encuentre una consulta que parece que está tomando muchos recursos, copie el "sql_handle" y el "Statement_start_offset" en la condición WHERE de la segunda consulta a continuación para ver los planes individuales (puede ser más de 1). Desplácese hacia el extremo derecho y suponiendo que haya un plan XML, se mostrará como un enlace (en modo de cuadrícula) que lo llevará al visor del plan si hace clic en él.
Consulta # 1: Obtener información de consulta
Consulta # 2: Obtener información del plan
fuente
SecurityContext es utilizado por el servidor sql en varios lugares. Un ejemplo que ha nombrado son los servidores vinculados y las tablas de archivos. ¿Quizás estás usando cmdexec? ¿Trabajos del Agente SQL Server con cuentas proxy? ¿Llamar a un servicio web? Los recursos remotos pueden ser muchas cosas divertidas.
Los eventos de suplantación pueden registrarse en el evento de seguridad de Windows. Podría ser que estás encontrando una pista allí. Además, es posible que desee comprobar la grabadora de blackbox, también conocida como eventos extendidos.
¿Ha verificado si estos tipos de espera son nuevos (y en conexión con la CPU alta) o si son normales para su servidor?
fuente