最近公司的MES系统出现了点状况,已经很长一段时间了,不知道如何查找分析,还请各位大侠能够帮助。现象是这样的:公司有一台WebService服务器和一台SqlServer数据库服务器,客户端程序在通过WebService访问SqlServer存储过程时,偶有超时的现象,通过纪录WebService日志提示:"超时时间已到。在操作完成之前超时时间已过或服务器未响应。",通过计数器查看WebServeice的用户连接数量发现异常,如下图所示:请点开链接http://pan.baidu.com/s/1iPV4L,同时查看SqlServer数据库的用户连接数在这一时间段也发现异常,如下图所示:请点开链接http://pan.baidu.com/s/1cevpi
目前的问题是,能够通过WebService和SqlServer的用户连接数据看到超时时间段的异常曲线图,但不知道如何查看到底是那些客户端的那个程序造成的异常访问,也就找不到具体异常连接忽然升高的原因。
还请大家帮忙看一下,我需要通过什么工具或方法来分析到异常连接产生的原因,到底是程序存在问题,还是硬件有瓶颈,还请各位帮忙分析,谢谢!小弟分少,还望大家不要嫌弃。WebService超时SqlServer连接超时系统计数器超时时间已到服务器未响应

解决方案 »

  1.   

    根据我个人经验:
    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
      

  2.   


    感谢你这么快速的回复,我也考虑过可能是查询耗时过长的问题,但一般这个时间都比较短,几秒钟到几分钟,而且隔几天出现一次。现在我就是想查出这个耗时过长的查询是那一个,以便做优化,有没有好的工具可以做统计和分析的,通过你给你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
      

  3.   

    从数据来看,可能情况有:
    1、过多并发,OLTP系统不需要太多并发,不过这个通常需要优化脚本
    2、LATCH_EX,意味着有可能索引不合理,或者丢失索引,我下面给脚本你
    3、外部程序是否没有合理地关闭?这个需要你自己检查了。
    重点还是优化脚本先吧
      

  4.   

    查找目前SQL Server所执行的SQL语法,并展示资源情况:
    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
      

  5.   

    DBA_Huangzj:
    能不能给我个邮箱,我把我查询到的内容发给你,帮忙看一下,目前对于查到的结果我们看不出问题所在。想请你帮忙给分析一下。非常感谢!
      

  6.   

    数据库优化的问题真是很难,虽然我这个问题没有得到彻底解决,但还是非常感谢DBA_Huangzj的耐心帮助。