新应用服务器,数据库服务器,间歇性半秒延迟

New App Server ,DB server , intermittent Half second delay

我在新的生产环境中遇到间歇性性能问题。我们已经转移到数据中心并拥有一个新的数据库服务器和一个新的应用程序服务器。当问题开始时,我的一些查询开始 运行ning 几乎正好慢了半秒。我所有的查询都使用存储过程。并非所有人都受到此问题的影响,但它始终是相同的子集。重置我的 IIS 应用程序后,此问题往往会消失。通过同一数据层的所有查询 运行。 我已经使用 perfmon 监视了应用程序服务器上的应用程序池,它没有显示任何故障。 我已经检查了数据库上的 sys.dm_exec_query_stats,它显示过程为 运行ning 快速(数十毫秒)。 这是 运行 所有查询的代码。

  Public Function ExecStoredProcCmd(ByVal SQLCmd As SqlCommand) As DataSet

    Dim daAdapter As New SqlDataAdapter(SQLCmd)
    Dim dsReturn As New DataSet
    Dim start As Date
    Try
        Dim c = GetOpenConnection()
        Using c
            Using SQLCmd
                SQLCmd.Connection = c
                SQLCmd.CommandType = CommandType.StoredProcedure
                '    PGF.Logging.LogMessage("cDataAccess.ExecStoredProcCmd " & SQLCmd.Connection.ConnectionString)
                start = Date.Now
                daAdapter.Fill(dsReturn)
                Return dsReturn
            End Using
        End Using
    Catch ex As Exception
        HandleError(ex)
        Throw
    Finally
        Dim ts = Date.Now - start
        If ts.TotalMilliseconds > 250 Then
            PGF.Logging.LogPerformance("ExecStoredProcCmd:" & SQLCmd.CommandText, ts.TotalMilliseconds, 1)
        End If
    End Try

End Function

没有任何低于 490 毫秒(和超过 250 毫秒)的记录。

什么会导致通常 运行 在 10 到 20 毫秒内花费额外半秒的存储过程?

我应该在哪里查找此错误?

编辑 我一直在比较 sql 探查器跟踪。在测试环境中,慢进程有大约 40 次读取,零次写入。 在 prod 环境中,当问题发生时,proc 显示大约 8 次读取和零次写入,持续时间为零!最大的区别在于审计注销时间,prod 中的持续时间是 506,我想这是我的问题,因为在测试中显示为零。

这是慢进程。

    SELECT cr.[CustomerRevisionID]
      ,cr.[CustomerID]
      ,cr.[ClientProducerRevisionID]
      ,c.FirstName CustomerFirstName
      ,c.MiddleName CustomerMiddleName
      ,c.LastName CustomerLastName
      ,c.CompanyName CustomerCompanyName
      ,c.contact CustomerCareOf
      ,Null CustomerRef
      ,1 CustomerNameFormat
      ,Null Verification
  FROM [dbo].[PGFT_CustomerRevision] cr
  JOIN PGF_External.Customer.CustomerMaster c on c.emscustomerID = cr.customerID
  WHERE [CustomerRevisionID] = @CustomerRevisionID

编辑 2 我在 SQL 服务器跟踪中注意到,当它很快时,procs 都在同一个 SPID 上执行,当它很慢时,它们是不同的 SPIDs

编辑 3 当我查询 sys.sysprocesses 时它很慢,我看到为每个查询创建了新行。还是不知道怎么解决。

我在客户现场遇到了这些完全相同的症状。在与他们的基础架构团队多次相互指责后,问题原来是 VMWare 错误,该错误引入了半秒的网络延迟,详见 in this article。以下是 kb 文章(强调我的)的摘录:

症状

您注意到某些 client/servers 工作负载的性能下降。 数据包在应用程序中的预期到达时间最多有 0.5 秒的延迟。

在这些条件下观察到此问题:

  • 来宾操作系统是 Windows Server 2012,Windows 8 或更高版本。

  • 虚拟机与硬件版本 11/ESXi 6.0 兼容。

  • 虚拟网卡为vmxnet3,驱动版本为1.6.6.0及以上。

  • 接收方合并 (RSC) 功能在全局和 vmxnet3 适配器上启用。

  • 此问题在以下情况下更为普遍:

    • 运行 基于 Microsoft SQL/TDS 的工作负载
    • 使用巨型帧
    • 客户端和服务器在两个不同的主机上

原因

根据不同的物理 NIC 和工作负载特性(如芯片组、合并设置和数据包到达率),RSC 卸载的一些数据包可能会遇到额外的延迟。聚合多个数据包时,ESXi 只会保留推送标志(PSH 标志),前提是它已设置在要合并的第一个数据包上。如果第一个数据包没有设置 PSH 标志但后续数据包设置了 PSH 标志,则最终合并的数据包将不会设置它,因此可能不会立即传送到应用程序。

分辨率

此问题已在 ESXi 6.0 Update 2 中解决,可从 VMware Downloads 下载。