我们在ASP.NET + SQL Server 2008中有一个商业Web应用程序。
一开始,SQL Server和IIS在同一台机器上。 现在我们买了另一台机器。 目前的configuration是IIS机器加上SQL Server机器,它们通过一个1GB的LAN连接进行连接。
有了这个configuration我们的Web应用程序比以前更慢。 最大带宽是networking的1-2%,大约15mbps。
当我们使用另一个线程从相同的IIS机器使用同一个SQL Server时,networking使用率更高。 所以这对于SQL Server来说没有问题。
何我们可以为这个SQL连接提供更高的带宽?
眼镜:
使用Profiler,检查在SQL实例上运行的查询。
如果应用程序编码不好,那么可能会出现“数千人死亡”情况,其中有数百或数千个小的,可能不重要的查询返回单个行而不是一个集合,或者JOIN ed结果。 每当应用程序需要其中一组查询的数据时,分隔层在networking连接上引入了大量的额外延迟。 如果你以前没有看到过这种情况,这是非常不直观的。
在具有较高查询量的服务器上运行Profiler可能比较困难,但是如果数据量很大,可以一次打开1-2次,并获得一个好的样本。 无论你做什么, 都不要通过networking连接运行Profiler。 通过RDP在SQL Server框中运行Profiler,或者将跟踪设置为在实例本身上运行(首选)。
我想你可以在这个硬件上减lessnetworking延迟。 国际海事组织,这实在是不可扩展,但如果你在与一个巨大的应用程序,需要修复,捏这是一个选项,至less是暂时的。
他们是不错的networking卡质量好的服务器? 廉价的网卡(如廉价的RAID卡)是一种虚假的经济。 所有最新的驱动程序? 你必须从一端开始,通过validation一切都有一个干净的configuration工作。 然后开始排查。
你有足够的内存分配给你的进程吗?
总是寻找“不同”的东西。 我最近奇怪的是一个运行缓慢的高端服务器。 大量的CPU,内存,没有磁盘活动等任务pipe理器显示12万句柄?! 打印机驱动程序每2秒就会漏出一个句柄。
当Web服务器和SQL Server都驻留在同一台计算机上时,默认情况下该协议使用shared memory 。 如果将SQL Server移动到另一个框中,则通信必须通过TCP/IP 。
基本上,当使用共享内存时,客户端应用程序可以直接从SQL Server的内存中读取tabular data streams (TDS) 。 在使用TCP / IP协议时,必须将TDS转换为服务器上的TCP / IP,发送到客户端,然后转换回TDS,这需要时间。
我似乎无法find最近版本的一个很好的参考,但通读这一点 ,它没有改变那么多。
如果您的应用程序与您的SQL Server在同一台计算机上运行,请考虑使用共享内存Net-Library(如果您尚未使用)。 共享内存基于Net-Library的连接通常比其他types的连接快得多。 请记住我之前所说的:始终彻底地testing一个解决scheme,然后将其与可行的替代scheme进行比较,然后假设它本身更好或更快。 certificate是在布丁。
这个博客文章也给出了一个简要的概述。 在简单的谈话中可以find更多的技术性解释
首先在sql框中加载性能监视器sql计数器,然后看看。
一个.net应用程序? 很有可能是写在各地adhoc查询严重。
你正在使用100%的存储过程? 如果没有,最好有一个很好的理由。
在同一个盒子上安装SQL服务器可能会掩盖以前在应用程序中做出的一些糟糕的deviseselect。 现在,他们一目了然。
如果仅返回结果集, 则 SQL查询可能在56k调制解调器上非常快速。 但是,如果您正在使用客户端游标进行操作,则必须将所有内容都拖回networking。