新的App Server,DB服务器,间歇性半秒延迟

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新的App Server,DB服务器,间歇性半秒延迟相关的知识,希望对你有一定的参考价值。

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

  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 profiler跟踪。在测试环境中,慢进程有大约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上执行,当它很慢时它们是不同的SPID

编辑3当我查询sys.sysprocesses时它很慢,我看到为每个查询创建了新行。仍然不知道如何解决它。

答案

我在客户现场有这些完全相同的症状。在与他们的基础设施团队进行了多次指责之后,问题变成了VMWare错误,它引入了半秒网络延迟作为详细的in this article。以下是kb文章的摘录(强调我的):

症状

您注意到某些客户端/服务器工作负载的性能下降。数据包与应用程序的预期到达时间相差最多0.5秒。

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

  • 客户机操作系统是Windows Server 2012,Windows 8或更高版本。
  • 虚拟机与硬件版本11 / ESXi 6.0兼容。
  • 虚拟网卡为vmxnet3,驱动程序版本为1.6.6.0及更高版本。
  • 全局和vmxnet3适配器上启用了接收端合并(RSC)功能。
  • 在以下情况下,此问题更为普遍: 运行基于Microsoft SQL / TDS的工作负载 使用巨型帧 客户端和服务器位于两个不同的主机上

原因

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

解析度

此问题已在VMware下载中提供的ESXi 6.0 Update 2中得到解决。

以上是关于新的App Server,DB服务器,间歇性半秒延迟的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud 调用接口间歇性返回http 500 - Internal Server Error的错误

在 2008 SQL Server DB 和 Android App 之间进行通信

Nginx反向代理后端多节点下故障节点的排除思路

我可以通过 BizTalk DRDA 服务从 Mainframe Cobol 程序访问 SQL Server 和 DB2 上的表吗?

Microsoft SQL Server 2008 上使用 TABLOCK、XLOCK 命令的间歇性死锁

尝试将 laravel lighthouse-php 与 Roadrunner Server 一起使用时遇到间歇性错误