我们最近将生产设施升级到 sql server 2017,并迁移到无集群可用性组。有一个主节点、一个现场辅助节点和一个远程辅助节点。我们遇到与远程辅助同步的周期性中断。带宽低至 6G,sql 流量与所有其他流量竞争。好消息是 AG 会在 5-15 分钟后“赶上”。在调查是否有什么办法可以改善这种情况时,我通过实验发现网络 MTU 为 1400,并且 sql 的网络数据包大小设置为默认值 4092。作为实验,我将数据包大小设置为 1400 以匹配MTU。我们已经有好几天没有收到关于 AG 的警报了,所以它“似乎”有帮助。
我的问题是这样做是否正确?我已经读过很多次了,除非 MS 也建议您,否则不要更改网络数据包大小,并且永远不要将其设置为低于默认值 4096。然而......它似乎有帮助。因此,我正在寻找类似情况下更有经验的人的意见。
TLDR:如果对您有帮助,请将其设置得较低,监控您的数据包大小以查看您发送的数据包是否超出您的需要。
MTU 控制每个网络段在每个服务器之间的所有点上的大小,例如 traceroute 跃点 - MTU 大致控制网段在 2 个跃点之间的大小。特定分段上的 MTU 越小,数据包越有可能通过多个分段发送。这通常很好,除非您有一个特别繁忙的段。
数据包大小控制 sql 中每个 TDS 数据包可以发送多少数据。每个 TDS 数据包都有一个标头,因此有一些额外的开销。数据包越小,您需要发送数据的数据包就越多,请注意:
如果您只调用名为“a”且没有参数的存储过程,并且响应只是一个存储过程状态代码,那么您可以将最大数据包大小设置为 50 之类的小值。如果您有非常大的请求(大量的数百行选择语句) 并且响应中有很多行,那么您可能希望数据包大小尽可能大,以避免更多数据包标头的开销。
当你有一个高错误连接时,TCP 会阻碍并发送重传,这会进一步阻塞网络对性能真的很不利。具有较小的数据包大小会导致更多的数据包,从而导致丢失数据包的可能性更大,这反过来意味着更多的重传和等待丢失位的延迟。
那么较小的数据包大小不好吗?通常,但这实际上取决于您的网络。
我会做两件事,首先获取 Microsoft 消息分析器 ( https://www.microsoft.com/en-gb/download/details.aspx?id=44226 ) 并跟踪每台服务器并查找 TCP 重新传输,如果你有很多这样的错误率很高,这表明您需要发送更少的数据包,因此数据包的大小更大。
在消息分析器中,您可以添加一列来显示 TDS PacketSize,因此如果您将最大数据包大小设置为 1000,并且您看到大量大小为 1000 的数据包,然后是大量大小为 1 的数据包,那么理想的数据包可能是 1001 或 1002。
第二件事是看一下像 tds nitro 这样的东西,它压缩 TDS,这样你就可以减少数据包,这可能有助于高延迟高错误连接(http://nitrosphere.com/nitroaccelerator/)
埃德
不使用集群(WSFC 或 Pacemaker)的 AG 不是可用性配置。您需要使用集群来提高可用性。
也就是说,你需要整理你的网络资料。连接性差=坏。除非你有一个更大的管道,否则它不会解决问题。默认情况下,网络内容使用异步压缩。所以这有帮助,但以 CPU 为代价。你知道你的问题。