标签:如何 网络 更改 tcp sse 告诉 简单 默认 ble
为什么我的数据库应用程序如此缓慢?
当您的应用程序运行缓慢时,反射操作将会导致数据库查询。诚然,一些更为奢侈的延迟可以被公平地归咎于缺失的索引或不必要的锁定,但在这出戏中还有其他潜在的反派角色,包括网络和应用程序本身。丹·特纳(Dan Turner)指出,你可以在深入细节之前确定问题的所在,从而节省大量的时间和金钱。
缓慢的应用程序首先会影响最终用户,但是整个团队很快就会感受到影响,包括DBA、Dev团队、网络管理员和系统管理员。
有这么多人参与其中,每个人都有自己的观点,很难确定瓶颈到底在哪里。
一般来说,SQL Server应用程序的性能问题主要有两个原因:
网络问题——与“管道”连接您的SQL应用程序客户机到数据库的“管道”的速度和容量有关
缓慢的处理时间——与处理请求的速度和效率有关,在管道的一端。
在本文中,我们将详细介绍如何诊断这些问题,并了解性能问题的底层。
网络问题
网络性能问题广泛地分解成与网络(延迟)或网络容量(带宽)的响应速度相关的问题,即它可以在一个设置的时间内传输多少数据。
当然,两者是相互关联的。如果你的应用程序(或同一网络上的其他应用程序)产生的网络流量超过了可用的带宽,那么这将会增加延迟。
延迟
延迟是在应用程序和SQL服务器之间发送TCP包所需的时间。你在到达DB的路上会引起延迟,然后在下降的时候。人们通常在往返时间上谈论延迟时间:即到达那里和返回的时间
图1显示了一个60毫秒的往返行程。
带宽
可以在一段时间内发送或接收的数据量,通常以kb / s或Mb / s(兆比特每秒)来计算。
人们在讨论带宽时经常谈论“你的管道的大小”,这是一个很好的类比(加上它听起来很顽皮):你的管道越肥,你能同时通过它的数据越多。
如果你的应用程序需要接收10兆字节的响应(这是80兆位!),并且你有20 Mb/ s的连接,响应至少需要4秒才能收到。如果你有10Mb / s的连接,至少需要8秒的时间。如果你的网络上的其他人都在观看《权力的游戏》,那将会减少可用的带宽。
应用程序问题:缓慢的处理时间
每当客户端向SQL Server发送请求时,要检索所需的数据集,完成请求所需的总处理时间包括:
应用程序处理时间:在发送下一个请求之前,应用程序需要多长时间来处理之前的响应的数据
SQL处理时间:SQL在发送响应之前花多长时间处理请求
图2提供了这个概念的简单说明。
时间花在哪里?
我们花了很多时间来研究客户机/服务器SQL应用程序的性能,并且有大量不同的工具、脚本和方法来帮助您解决各种不同类型的性能问题。
那么,当面对缓慢的应用程序响应时间时,我们如何快速确定问题的根本原因呢?图3中的流程图展示了一种处理问题的系统方法。
在调查性能问题时,您可能会遇到不止一个问题。看看应用程序的几个不同部分,这是一个普遍问题吗?或者有些部件比其他部件慢得多?
最好从小做起。如果你能专注于一个特别慢的应用程序的特定区域,它会让生活变得更简单,例如,当你点击发票页面上的“选择所有”按钮时,加载结果需要10秒。专注于一个可重复的小工作流可以让您隔离这个问题。
下一个要回答的问题是,为什么要花10秒钟?缩小问题的第一个也是最简单的方法是,在同一个机器上,或者在同一个局域网中,尽可能地将应用程序运行到SQL Server上。
如果有效地删除了任何网络延迟和带宽限制,它突然需要一秒或更少的时间来选择所有的发票,然后您需要调查什么网络问题可能会在其余的时间里消耗掉。
如果应用程序仍然花10秒来加载结果,那么恭喜你,你又一次删除了4个问题中的2个!现在,您需要查看正在使用的大部分处理时间。
让我们仔细看看如何计算出这段时间的大部分时间花在哪里。您将需要Wireshark或SQL Profiler(以您更舒适的方式)。
调查应用程序处理时间
您将在两个位置中的一个中看到时间:在向应用程序发送响应和获取下一个请求(应用程序处理时间)之间,或者在向SQL Server发出请求并得到响应(SQL处理时间)之间进行。
为了找出导致您的问题的原因,您可以使用Wireshark或SQL Profiler,因为两者都可以告诉我们大致的应用程序和SQL处理时间(尽管确切的数字可能略有不同)。
使用Wireshark
我们可以使用Wireshark在工作流执行时捕获网络流量。使用Wireshark允许我们过滤非应用程序的流量,并查看工作流中所有数据包之间的时间差异。
计算近似应用程序处理时间:
捕获工作流的包:启动Wireshark捕获并运行应用程序工作流,记住在工作流完成后停止捕获。记得选择相关的网络接口,并注意,你需要在不同的机器上运行这个应用程序,从数据库到Wireshark,以查看流量。确保您没有运行其他的本地SQL应用程序,而不是您试图捕获的其他SQL应用程序。
通过应用过滤器tds来摆脱非应用程序的流量,然后文件|导出指定的包,给出一个文件名并确保“显示”。在Wireshark中打开这个新文件。
显示当前和前一个包之间的时间差,只需添加time delta列,如下:
选择编辑|偏好|外观|列
点击+按钮,将类型下拉改为“Delta Time”,标题改为“Delta”。
过滤请求的流量:
(tds。类型= = 0x01 || tds。类型= = 0 x03 | | tds。type == 0x0E)& tds。packet_number = = 1
上面的过滤器将显示每个请求中的第一个TDS包,而Delta列现在将显示上一次请求的最后一个响应包和下一个请求之间的时间。确保包是按“No”排序的。这将确保包按照发送/接收的顺序进行。
导出为CSV,通过导航文件|导出包将|分解为CSV
在秒内计算应用程序的处理时间——在Excel中打开CSV,并在增量列中求和。
获取近似的SQL处理时间:
重新打开步骤2中创建的文件。在Wireshark的上面,过滤器的流量只是响应:
tds。type == 0x04 && tds。packet_number = = 1
上面的过滤器将显示每个响应中的第一个TDS包,而Delta列将显示上一次请求的最后一个请求包和从SQL服务器发回的第一个响应数据包之间的时间。再次,确保包是由“No”命令的。”专栏。
导出为CSV,通过导航文件|导出包将|分解为CSV
在秒内计算SQL处理时间——在Excel中打开CSV,并在增量列中求和。
使用SQL分析器
虽然使用SQL Profiler收集诊断数据会增加您的工作流程,但它仍然可以为您提供处理时间的总体图。您可以通过运行服务器端跟踪来最小化这个开销,然后按照下面的描述导出数据。或者,如果您对扩展事件和XQuery有信心,您应该能够通过该路径获得类似的数据。
首先通过捕获工作流的分析器跟踪,只使用“标准(默认)”跟踪模板。确保没有其他的东西同时在数据库中访问,所以你只是在捕捉你的流量。
标签:如何 网络 更改 tcp sse 告诉 简单 默认 ble
原文地址:http://www.cnblogs.com/yyyz516/p/7724227.html