由于“客户端处理时间”较长,因此远程SELECT语句速度较慢,但​​本地速度较快


12

当连接到我们的生产服务器(SQL Server 2008,功能非常强大的计算机)时,此SELECT语句将花费2秒,回吐所有字段(总共4 MB的数据)。

SELECT TOP (30000) *
FROM person
WITH(NOLOCK);

从同一网络上的任何其他框中(使用SQL身份验证或Windows身份验证进行连接),相同的查询需要1分钟8秒

我正在用这个非常简单的语句进行测试,以说明它不是索引问题或与查询相关的问题。(目前,所有查询都存在性能问题...)

这些行是成块的,而不是一次全部。我立即得到第一行,然后等待1分钟以上,以使成批的行进入。

从远程框中运行查询时,这是查询的客户端统计信息:

Query Profile Statistics
  Number of INSERT, DELETE and UPDATE statements 0
  Rows affected by INSERT, DELETE, or UPDATE statements 0
  Number of SELECT statements  2
  Rows returned by SELECT statements 30001
  Number of transactions 0

Network Statistics
  Number of server roundtrips 3
  TDS packets sent from client        3
  TDS packets received from server 1216
  Bytes sent from client         266
  Bytes received from server 4019800

Time Statistics
  Client processing time 72441 ms (72 seconds)
  Total execution time   72441 ms
  Wait time on server replies 0

我们可以看到“客户端处理时间”等于总执行时间。

有谁知道我可以采取哪些步骤来诊断为什么实际数据传输需要很长时间?

是否有一个SQL配置参数可以限制或限制计算机之间的数据传输速度?


顺便说一下,我们尝试在数据库服务器和另一个盒子之间复制相同大小(4 MB)的文件,这花了一秒钟。因此,这似乎不是网络问题。
FranticRock

什么是客户端应用程序?最终用户工作站上的SSMS?
Thomas Stringer 2012年

是Microsoft SQL Server Management Studio 10.50.160.1。2008 R2
FranticRock 2012年

自从我们移动了数据中心以来,这个问题就开始了,并且重新安装了整个机器(包括SQL在内的所有东西)。我们是一家非常受人尊敬的托管服务提供商。
FranticRock

Answers:


5

根据您的信息,您的问题肯定与网络相关。因此,必须由网络专业人员来处理(我不是这样)。

可能有帮助的事情:

  • 更快的NIC卡(在SQL Server上)。
  • 在服务器(Web服务器和SQL Server)之间添加分配的/特定的NIC卡/子网。

Web服务器与SQL Server是否在同一子网中?

它们之间是否有路由器/网桥等?

在SQL Server上没有太多可能的更改:

  • SQL Server使用专有的MS“ TDS协议”发送输出数据。
  • TDS缓冲区的默认大小为4 KB。请参见MSDB:“网络数据包大小选项”
  • 压缩数据(使用SQL Server或外部应用程序)-取决于数据的性质。

您使用的是默认大小:请参阅统计信息:“从服务器1216收到的TDS数据包”(4MB / 1K = 4KB)。是的,可以更改TDS缓冲区的大小:请参见Google:“ TDS协议批处理大小”

关于这个话题的很好的讨论:“ sql的网络数据包大小真的确定往返流量吗?”

但是,更改TDS封装尺寸将(不可避免)产生不可预测的影响,仅应在特殊情况下用于生产。

更改体系结构或在中间层引入数据缓存也将有所帮助。


8

现在已解决此问题。

这是网络问题,SQL框使用的是100 MB / s的 NIC卡而不是10 GB / s的 NIC卡...

网络配置更改为使用正确的网卡已解决了该问题。现在,对于生产SQL框和网络上的其他框,所有查询的性能都相似。

感谢大家的帮助。


我遇到的问题与您完全相同,我想检查一下我的SQL Server使用的是哪个NIC卡。我在哪里可以看到?
Misha Zaslavsky

3

最初阅读时,听起来好像您遇到了一些网络延迟问题。您是否看过一些Network Perfmon计数器?这些可能会给您一些有关网络状况的指示。

引用我应该监视哪些Perfmon计数器,它们分别是什么意思?

网络IO

要测量网络I / O,可以使用以下计数器:

网络接口总字节数/秒

阈值:持续的值超过网络带宽的80%。

含义:该计数器指示通过每个网络适配器发送和接收字节的速率。此计数器可帮助您了解网络适配器上的流量是否已饱和以及是否需要添加另一个网络适配器。您确定问题的速度取决于您所拥有的网络类型以及是否与其他应用程序共享带宽。

网络接口接收的字节数/秒

该计数器指示通过每个网络适配器接收字节的速率。您可以将传入数据的速率计算为总带宽的一部分。这将帮助您知道您需要优化来自客户端的传入数据,或者需要添加另一个网络适配器来处理传入流量。

网络接口发送字节数/秒

此计数器指示通过每个网络适配器发送字节的速率。您可以将传入数据的速率计算为总带宽的一部分。这将帮助您知道您需要优化发送给客户端的数据,或者需要添加另一个网络适配器来处理出站流量。

服务器字节总数/秒

此值不应超过网络容量的50%。

该计数器指示通过网络发送和接收的字节数。较高的值表示网络带宽是瓶颈。如果所有服务器的“字节总数/秒”之和大约等于网络的最大传输速率,则可能需要对网络进行分段。

处理器%中断时间

该计数器指示处理器花费在接收和处理硬件中断上的时间百分比。此值是生成中断的设备(例如网络适配器)活动的间接指示。

网络接口(*)输出队列长度

此计数器检查以查看有多少线程在网络适配器上等待。如果网络适配器上有很多线程在等待,则系统很可能由于网络延迟或网络带宽而使网络I / O饱和。

输出队列长度是输出数据包队列的长度(以数据包为单位)。如果该长度大于2,则存在延迟,如果可能,应找到并消除瓶颈。由于在此实现中,请求由网络驱动程序接口规范(NDIS)排队,因此该值始终为0。


在监视Perfmon中的这些统计信息之后,我注意到了一些事情。在任何网卡上,总字节/秒从未超过700K / s。即使我正在运行请求兆字节数据的查询,该数字仍保持在500K /秒左右。我们的带宽为100 MBPS,甚至没有达到1%的使用率。我认为应该在某个位置配置一个限制,以限制数据包的大小或限制传输速率。硬件中断/秒为700-2000。输出队列为空。网卡使用率最高时约为4%。
FranticRock 2012年

2
网卡速度和交换机端口之间可能不匹配。您是否已与您的网络团队合作,从交换机的角度进行研究?
jgardner04 2012年

2

一些初步的问题:1)服务器在Prod上有一个SQL客户端。服务器机器设置好吗?因此,如果您从位于同一台计算机上的客户端进行相同的查询,它将在2秒内完成?您尝试这样做吗?真的是2秒吗?2)您提到生产环境的配置已更改(或生产服务器移至其他网络/总服务器重建已完成),对吗?旧生产环境中的查询消耗时间是多少?

从同一网络上的任何其他框中...相同的查询需要1分8秒。3)您是说查询返回并从客户端使用,该客户端位于给定网络中任何计算机(使用您的特定计算机)上的客户端大约需要70秒?我理解正确吗?3.1顺便说一下,企业接受此查询的时间是什么时候?4)但是,您指定的是,对于使用查询输出的特定客户端计算机,输出消耗时间为:客户端执行时间15:30:48 15分钟?(这次显然是不可接受的)?正确?5)那么问题仅限于单个客户端计算机吗?还是到任何客户端/中间层等机器(在新环境中)?6)ping显示的延迟是多少?从客户端计算机到服务器?7)您(或网络管理员)是否同时运行了tracert(从客户端到服务器,从服务器到客户端)?多少跳?总时间是多少?8)旧的生产网络还存在吗?您能否使用Ping和Traceroute进行比较-那里的客户端和服务器之间的时间和跳数是多少?

出于好奇:这是查询的示例吗?或查询的确切用语?该查询确实不包含WHERE子句?与我同意这是非常不寻常的。表具有聚集索引还是Heap?该表总共包含多少行?该表是零散的吗?出于好奇:为什么选择SELECT TOP NNN?为什么不设置ROWCOUNT NNN-然后选择*?客户端每天发出几次此查询?1?100?1MLN?底层数据是静态的还是动态的,并且变化很大?多少(每天0.01%?每天1%?每天10%?)以编程方式处理查询输出?(不是用户?)为什么不将其缓存/不存储在中间层?谢谢,阿列克谢


非常感谢您提供的信息。我的回应如下。1.正确。客户端工具也安装在产品上,我提到的同一查询需要2秒才能返回所有30,000条记录(总计4 MB大小)。顺便说一句,我使用的查询只是一个例子。这不是真正的业务查询。这只是从表中获取4 MB数据的一种方式。当前,我们在使用任何查询从任何表中读取数兆字节的数据时遇到性能问题。
FranticRock 2012年

2.消耗时间接近,即使与从PROD框中本地运行的同一查询的消耗时间不同。(即2秒)3.正确的是1分8秒是执行时间。此时间在不同的客户端计算机之间有所不同。在我们的开发机器(比舞台机器远得多的地方)中,我连续运行了8次此查询,时间从11秒到22秒不等。(平均18秒)
FranticRock 2012年

从我们的开发箱tracert Prod_IP_Address 1 53 ms 52 ms 53 ms SQL2008从舞台机器开始,时间始终超过1分钟。tracert Prod_IP_Address tracert:1 1 ms <1 ms <1 ms SQL2008从生产Web服务器:执行时间为53秒。tracert:1 1 ms <1 ms <1 ms SQL2008
FranticRock 2012年

4.第一栏“客户端执行时间”仅是计算机的本地时间(IE:15:30:00)5.在任何使用生产DB服务器的计算机上,包括在我们的生产Web服务器上,都将发生此问题。6.从阶段框到产品SQL框的ping延迟为<1 MS。7.请参阅上面。8.不幸的是,旧网络不再存在。
FranticRock 2012年

有趣的是,即使DEV ping 53 MS,运行查询只需要11-22秒。虽然阶段ping 1 MS,但要花费1分钟以上的时间才能返回数据。开发人员在地理位置上也很远。舞台就在产品框旁边,但是需要更长的时间。
FranticRock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.