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