最近公司的MES系统出现了点状况,已经很长一段时间了,不知道如何查找分析,还请各位大侠能够帮助。现象是这样的:公司有一台WebService服务器和一台SqlServer数据库服务器,客户端程序在通过WebService访问SqlServer存储过程时,偶有超时的现象,通过纪录WebService日志提示:"超时时间已到。在操作完成之前超时时间已过或服务器未响应。",通过计数器查看WebServeice的用户连接数量发现异常,如下图所示:请点开链接http://pan.baidu.com/s/1iPV4L,同时查看SqlServer数据库的用户连接数在这一时间段也发现异常,如下图所示:请点开链接http://pan.baidu.com/s/1cevpi
目前的问题是,能够通过WebService和SqlServer的用户连接数据看到超时时间段的异常曲线图,但不知道如何查看到底是那些客户端的那个程序造成的异常访问,也就找不到具体异常连接忽然升高的原因。
还请大家帮忙看一下,我需要通过什么工具或方法来分析到异常连接产生的原因,到底是程序存在问题,还是硬件有瓶颈,还请各位帮忙分析,谢谢!小弟分少,还望大家不要嫌弃。WebService超时SqlServer连接超时系统计数器超时时间已到服务器未响应
目前的问题是,能够通过WebService和SqlServer的用户连接数据看到超时时间段的异常曲线图,但不知道如何查看到底是那些客户端的那个程序造成的异常访问,也就找不到具体异常连接忽然升高的原因。
还请大家帮忙看一下,我需要通过什么工具或方法来分析到异常连接产生的原因,到底是程序存在问题,还是硬件有瓶颈,还请各位帮忙分析,谢谢!小弟分少,还望大家不要嫌弃。WebService超时SqlServer连接超时系统计数器超时时间已到服务器未响应
1、某些查询运行时间过久,已经达到超时水平。
2、有阻塞。
可以查查:
SELECT TOP 5 * FROM sys.dm_os_waiting_tasks ORDER BY wait_duration_ms DESCSELECT TOP 5 * FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC
感谢你这么快速的回复,我也考虑过可能是查询耗时过长的问题,但一般这个时间都比较短,几秒钟到几分钟,而且隔几天出现一次。现在我就是想查出这个耗时过长的查询是那一个,以便做优化,有没有好的工具可以做统计和分析的,通过你给你SQL查出的内容我看不太懂,还请进一步指教,谢谢!waiting_task_address session_id exec_context_id wait_duration_ms wait_type resource_address blocking_task_address blocking_session_id blocking_exec_context_id resource_description
0x00000000090EC508 27 0 2592189560 BROKER_TRANSMITTER NULL NULL NULL NULL NULL
0x0000000005240508 26 0 2592189559 BROKER_TRANSMITTER NULL NULL NULL NULL NULL
0x0000000009084508 15 0 2592189558 FSAGENT NULL NULL NULL NULL NULL
0x000000000908E508 17 0 2592189558 FSAGENT NULL NULL NULL NULL NULL
0x00000000098AE508 19 0 2592189558 FSAGENT NULL NULL NULL NULL NULLwait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
CXPACKET 3930341175 29971041582 980399 1192287228
LATCH_EX 2236527143 28197232519 19021 475837919
LAZYWRITER_SLEEP 103170281 10360138315 50333957 11003558
CLR_AUTO_EVENT 2572 5228479728 309990168 1822
DISPATCHER_QUEUE_SEMAPHORE 25661648 2683127786 10796983 6658486
1、过多并发,OLTP系统不需要太多并发,不过这个通常需要优化脚本
2、LATCH_EX,意味着有可能索引不合理,或者丢失索引,我下面给脚本你
3、外部程序是否没有合理地关闭?这个需要你自己检查了。
重点还是优化脚本先吧
SELECT s2.dbid ,
DB_NAME(s2.dbid) AS [数据库名] ,
--s1.sql_handle ,
( SELECT TOP 1
SUBSTRING(s2.text, statement_start_offset / 2 + 1,
( ( CASE WHEN statement_end_offset = -1
THEN ( LEN(CONVERT(NVARCHAR(MAX), s2.text))
* 2 )
ELSE statement_end_offset
END ) - statement_start_offset ) / 2 + 1)
) AS [语句] ,
execution_count AS [执行次数] ,
last_execution_time AS [上次开始执行计划的时间] ,
total_worker_time AS [自编译以来执行所用的 CPU 时间总量(微秒)] ,
last_worker_time AS [上次执行计划所用的 CPU 时间(微秒)] ,
min_worker_time AS [单次执行期间曾占用的最小 CPU 时间(微秒)] ,
max_worker_time AS [单次执行期间曾占用的最大 CPU 时间(微秒)] ,
total_logical_reads AS [总逻辑读] ,
last_logical_reads AS [上次逻辑读] ,
min_logical_reads AS [最少逻辑读] ,
max_logical_reads AS [最大逻辑读] ,
total_logical_writes AS [总逻辑写] ,
last_logical_writes AS [上次逻辑写] ,
min_logical_writes AS [最小逻辑写] ,
max_logical_writes AS [最大逻辑写]
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
WHERE s2.objectid IS NULL
ORDER BY last_worker_time DESC
丢失索引:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 30
ROUND(s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
+ s.user_scans ),
0) AS [Total Cost] ,
s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
+ s.user_scans ) AS Improvement_Measure ,
DB_NAME() AS DatabaseName ,
d.[statement] AS [Table Name] ,
equality_columns ,
inequality_columns ,
included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
WHERE s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
+ s.user_scans ) > 10
ORDER BY [Total Cost] DESC ,
s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
+ s.user_scans ) DESC
能不能给我个邮箱,我把我查询到的内容发给你,帮忙看一下,目前对于查到的结果我们看不出问题所在。想请你帮忙给分析一下。非常感谢!