Está en la página 1de 4

Ok, basado en un comienzo en lo visto en:

https://www.sqlshack.com/sql-server-monitoring-tools-for-disk-i-o-performance/

Se observa que, a mi entendimiento, no existen problemas de IO.

Stats:

IO bajo uso normal, Sábado 18hs a Domingo 9hs.

IO bajo test de stress.

Para referencia, IO bajo test de stress, en una copia del mismo server pero sobre discos
mecánicos.
Asumiendo, entonces, que no existen problemas de acceso a storage, continuo con consumo
de CPU.

Lo primero que se observa, desde el monitor de actividad del SSMS, son altos valores de
“Latch”. Luego de estudiar al respecto acá:

https://learn.microsoft.com/en-us/sql/relational-databases/diagnose-resolve-latch-
contention?view=sql-server-ver16

Lo cual me llevó acá:

https://www.sqlshack.com/troubleshooting-the-cxpacket-wait-type-in-sql-server/

Se reconfiguró los valores de procesamiento en paralelo del SQL Server.

Original: Nuevos valores:

Obteniendo los siguientes resultados.


Lamentablemente, esto no ocasiono ninguna mejora en los tiempos promedio…

Lo siguiente que se observa son los tiempos de demora en determinadas operaciones, con
tiempos promedio superiores a 7 segundos por consulta…

Las cuales, usualmente, las veo relacionadas a consultas originadas por el IVR?

Consultas obtenidas de:

https://learn.microsoft.com/en-us/troubleshoot/sql/performance/troubleshoot-high-cpu-
usage-issues

https://www.dbblogger.com/post/steps-to-troubleshoot-high-cpu-utilization-in-sql-server
Por lo pronto, sigo investigando al respecto… No soy un Microsoft DBA pero bueno, voy viendo
de hacer lo que pueda.

Me gustaría, de ser posible, si me pueden pasar información del server de PasoCar, para
comparar. Por un lado, en lo que respecta a las configuraciones del SQL, y por otro, que
devuelven las últimas consultas que pegué acá, que hacen referencia a los tiempos promedio y
a donde están los cuellos de botella.

Consulta de tiempos promedio de operaciones con mayor costo de CPU:


SELECT TOP 10 st.text AS batch_text,
SUBSTRING(st.TEXT, (qs.statement_start_offset / 2) + 1, ((CASE
qs.statement_end_offset WHEN - 1 THEN DATALENGTH(st.TEXT) ELSE
qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS
statement_text,
(qs.total_worker_time / 1000) / qs.execution_count AS avg_cpu_time_ms,
(qs.total_elapsed_time / 1000) / qs.execution_count AS avg_elapsed_time_ms,
qs.total_logical_reads / qs.execution_count AS avg_logical_reads,
(qs.total_worker_time / 1000) AS cumulative_cpu_time_all_executions_ms,
(qs.total_elapsed_time / 1000) AS cumulative_elapsed_time_all_executions_ms
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
ORDER BY(qs.total_worker_time / qs.execution_count) DESC

Detalle sobre las consultas de mayor tiempo (y origen de las mismas)


SELECT TOP 10 s.session_id,
r.status,
r.cpu_time,
r.logical_reads,
r.reads,
r.writes,
r.total_elapsed_time / (1000 * 60) 'Elaps M',
SUBSTRING(st.TEXT, (r.statement_start_offset / 2) + 1,
((CASE r.statement_end_offset
WHEN -1 THEN DATALENGTH(st.TEXT)
ELSE r.statement_end_offset
END - r.statement_start_offset) / 2) + 1) AS statement_text,
COALESCE(QUOTENAME(DB_NAME(st.dbid)) + N'.' +
QUOTENAME(OBJECT_SCHEMA_NAME(st.objectid, st.dbid))
+ N'.' + QUOTENAME(OBJECT_NAME(st.objectid, st.dbid)), '') AS
command_text,
r.command,
s.login_name,
s.host_name,
s.program_name,
s.last_request_end_time,
s.login_time,
r.open_transaction_count
FROM sys.dm_exec_sessions AS s
JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id CROSS APPLY
sys.Dm_exec_sql_text(r.sql_handle) AS st
WHERE r.session_id != @@SPID
ORDER BY r.cpu_time DESC

También podría gustarte