我们有一个数据加载作业,它通过网络在两个 sql 服务器之间移动相对大量的数据。服务器在同一个子网上,它们之间只有一个交换机。数据由几个大的 varchar 字段和一个 xml 字段组成。
为了增加吞吐量。我尝试将连接字符串上的网络数据包大小从默认的 4096 更改为 32627;但是,它似乎对性能没有帮助。我怀疑问题在于,尽管我们正在运行 gig 以太网,但未启用“巨型帧”。
为了确认这一点,我尝试了两个 ping 测试:
ping -l 1400 -f pdbsql01dul
作品
ping -l 4096 -f pdbsql01dul
数据包需要分片,但要设置 DF。
如您所见,最大的数据包大小似乎在 1400 左右
我的问题是,如果巨型帧约为 8096,将网络数据包大小设置得比这更大有什么好处吗?
如果连接是相关服务器的本地连接,这会改变吗?
需要发生的是,以太网网络上的 MTU 设置需要从 1500 增加到 4096 以北。这些设置通常在驱动程序设置页面上设置。对于良好的网络,您确实希望同一以太网上的所有设备(包括所有以太网交换机)都具有相同的 MTU 设置。
(来源:sysadmin1138.net)
那就是您要在我的一台服务器上更改它的地方。
能帮上忙吗?它当然可以。更少的数据包碎片意味着更少的 TCP 堆栈重新组装流量流的工作。它可能不是数量级,但它可能会有所帮助。
我相信服务器的本地连接使用管道而不是 TCP 连接,并且可能不受此更改的影响。
你可以试试,但我怀疑它会有多大帮助。TDS 作为一种协议从来都不是为高吞吐量而设计的。如果您想在两个 SQL 服务器实例之间移动数据,您可以考虑使用Service Broker,它的网络堆栈比 TDS 更面向高吞吐量。这就是Mirroring 选择SSB 网络堆栈与备用镜像服务器通信的原因。除了 SSB 的数据移动语义比链接服务器要好得多,而且通常比自定义客户端应用程序要好。
我无法评论 tcp、帧等,但我只为一些仍然需要 SQL 6.5 客户端工具的恶意应用设置了一次 SQL Sever 网络数据包大小。
这是“不要这样做”的设置之一。