SQL Server 网络数据包大小

Joh*_* N. 6 sql-server configuration

RETRANSMIT在分析从 Citrix 客户端到数据库服务器的网络流量时,我们注意到在 TCP 数据包传输过程中发生了很多问题。数据包被拆分并重新发送。

为了确定网络中的 MTU 大小,我启动了以下命令:

ping 10.28.212.22 -l 4096 -f
Run Code Online (Sandbox Code Playgroud)

啊,是的,对于那些感兴趣的人:该-f参数告诉 ping 不要对 ping 数据包进行分段,如果必须将其拆分然后重新发送。

然后我开始减少-l参数值,直到收到以下消息:

PS C:\temp> ping 10.28.212.22 -l 1474 -f

Ping wird ausgefhrt fr 10.28.212.22 mit 1474 Bytes Daten:
Paket msste fragmentiert werden, DF-Flag ist jedoch gesetzt.
Paket msste fragmentiert werden, DF-Flag ist jedoch gesetzt.
Paket msste fragmentiert werden, DF-Flag ist jedoch gesetzt.
Paket msste fragmentiert werden, DF-Flag ist jedoch gesetzt.


Ping-Statistik fr 10.28.212.22:
    Pakete: Gesendet = 4, Empfangen = 0, Verloren = 4
    (100% Verlust),

PS C:\temp> ping 10.28.212.22 -l 1472 -f

Ping wird ausgefhrt fr 10.28.212.22 mit 1472 Bytes Daten:
Antwort von 10.28.212.22: Bytes=1472 Zeit=3ms TTL=123
Antwort von 10.28.212.22: Bytes=1472 Zeit=2ms TTL=123
Antwort von 10.28.212.22: Bytes=1472 Zeit=2ms TTL=123
Antwort von 10.28.212.22: Bytes=1472 Zeit=2ms TTL=123

Ping-Statistik fr 10.28.212.22:
    Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
    (0% Verlust),
Ca. Zeitangaben in Millisek.:
    Minimum = 2ms, Maximum = 3ms, Mittelwert = 2ms

Run Code Online (Sandbox Code Playgroud)

由于数据包本身具有 28 字节的标头,因此从 ping 命令成功返回的ping值与我们网络的 1500 字节的 MTU 大小相对应。1472

1472 + 28 = 1500
Run Code Online (Sandbox Code Playgroud)

SQL Server 实例有一个名为网络数据包大小 的高级配置设置,其默认值为 4096(字节)。Microsoft 建议不要更改此参数,除非是经验丰富的数据库管理员或经过认证的 SQL Server 专业人员:

此选项是高级选项,只能由经验丰富的数据库管理员或经过认证的 SQL Server 专业人员进行更改。

参考: 配置网络数据包大小服务器配置选项(Microsoft | SQL 文档)

RETRANSMIT遗憾的是,该文档没有涉及任何细节,也没有提供太多关于在遇到大量网络数据包时是否应该更改此参数的见解。我确实认为自己是一位经验丰富的 DBA,但我从未遇到过这种情况。在某个时间点,该值曾经是 512(SQL Server 7.0?)。

我读过上一个问题:

……但它没有提供明确的答案。

在进一步阅读时,我发现了 TDS 协议,它在简介中包含以下信息:

表格数据流 (TDS) 协议是一种应用层请求/响应协议,可促进与数据库服务器的交互并提供以下功能:

  • 身份验证和通道加密协商。
  • SQL 中的请求规范(包括批量插入)。
  • 存储过程或用户定义函数的调用,也称为远程过程调用 (RPC)。
  • 数据的返回。
  • 事务管理器请求。

本规范的第 1.5、1.8、1.9、2 和 3 节是规范性的。本规范中的所有其他部分和示例均提供信息。

参考: 1 简介(Microsoft | Docs)

那么为什么是 TDS?显然,这就是数据通过 TDS 协议传输回客户端的方式。

  • 数据的返回。

请不要问这是在哪个 OSI 层。它应该是第 7 层,因为它是应用程序层......

TDS“数据包”具有 8 个字节的标头。

问题

根据我所读到的内容和目前的情况,我应该......

  1. 网络数据包大小参数设置为1500
  2. 网络数据包大小参数设置为1492?(TDS 数据包大小 - TDS 标头)
  3. 将网络数据包大小参数设置为不同的值?
  4. 网络数据包大小保留为4096?

我确实知道将数据分割成更小的块可能会对性能产生负面影响,但网络堆栈无论如何都会(并且正在)这样做。

完美的世界中,我会允许巨型数据包在客户端和数据库服务器之间或应用程序服务器和数据库服务器之间自由流动,但这在我们的环境中是不可能的(如:允许)。