这个系列的内容来到在Windows操作系统上做网络性能调优。主要是介绍利用在第一篇《Windows 服务器网络性能调优系列硬件篇》里面提到的SG TCP Optimizer。
笔者:国际认证信息系统审计师、软考系统分析师
本篇涉及知识点:Windows操作系统,TCP/IP协议。
注意:本篇很长。
操作系统的调优设置始终受制于硬件性能和驱动程序。所以优化效果是有可能因为实际使用环境的情况发生变化的。任何这些设置,都应该通过实际运行测试去评估是否真实有效、需要启用。
另外,不同的Windows版本在网络子系统上的优化设置有着比较多的差异,这也显示出了在网络性能方面的技术一直在发展,无论是在硬件抑或在软件方面。
SpeedGuide.net 这个网站长期专注于如何使计算机的网络性能可以充分发挥。SG TCP Optimizer是该网站基于对Windows操作系统TCP协议栈各种参数的理解而实现的主要面向互联网连接的TCP协议参数优化设置软件。
该软件支持的Windows操作系统范围很广,从古老的Windows 9x到2019 Server,下载地址:
当前版本4.1.1。
从支持的Windows范围可以知道,这个软件对前面说的不同的Windows版本有着不同的网络优化设置的情况是有应对的。
但是,这软件并不是什么智能优化软件,本质上只是一个辅助设置的工具。软件的第一页,右下角的“Optimal”优化设置完全是固定面向互联网连接的设置,并不是智能化的设置。因为这软件压根就没问过你是想优化吞吐量还是优化延迟还是我是成年人我全都要。
软件需要以管理员身份运行,没有提供中文界面,启动后要手工调整界面大小才能全部显示。下面一页页地介绍。
页面最顶部的部分是连接的带宽设置,100Mbps以上没有给出。这是因为按该软件的出发点是普遍性和低速互联网连接,对于高速网络一视同仁。这也进一步确认了这个软件的定位。
带宽设置之下的部分是选择要优化的网卡,有线或无线均可选择,因为优化的目标主要是TCP/IP协议的参数而不是硬件(驱动程序),所以还可以勾选修改全部网卡。注意MTU下面的PPPoE选项,用于确认网卡是否直接用于宽带虚拟拨号接入。如果正在优化的系统就是当做出口软路由器使用的Windows 服务器,那就要对相应网络接口勾选PPPoE选项。可以注意到勾选后MTU(最大传输单元)值变为1492,MTU值可以自己修改,通过第四页的MTU测试功能可以找出合适的MTU值。
最下面的部分是TCP协议参数。这里给出的参数每一项都有若干篇学术论文作为支撑,也都在专业论坛带出无数讨论:
TCP Window Auto-Tuning:指定TCP接收窗口自动调节方式,这个在介绍软件的第三页时再说,选择normal即可。
Windows Scaling:允许由Windows根据网络条件决定是否超越用户设置而设置TCP接收窗口自动调节方式为更保守的状态。如果上一选项不是选normal,且自己有信心的话就选择disabled,否则选择default或者enabled。该项仅对Windows 8.1和Windows 7有效。
Congestion Control:选择TCP拥塞控制算法,历久尤新的话题了。这些选项中微软官方推荐的是CTCP或者CUBIC。CTCP是较新的拥塞控制方法,主要面向高延迟/宽带互联网连接场景,可以提高吞吐量和丢包恢复。CUBIC是基于丢包的拥塞控制算法,是为高速TCP传输而设计的,不适用于互联网连接。所以如果是内网性能优化,该选哪个就很清楚了(但这个软件的Optimal设置只会选择CUBIC)。
Receive-Side Scaling (RSS):接收侧缩放,面向多核CPU环境且多数据流时的优化措施,需要网卡支持,在网卡篇提过这是个应用场景优化措施,不具备多核CPU或者应用场景不符合时没必要开启。
R.Segment Coalescing (RSC):接收分段聚合,聚合多个TCP数据片而减少对CPU发出的中断,能提高吞吐量、降低CPU消耗,但必然增大了延迟(看过我写的前面两篇就不用解释了)。软件直接提示打网游就别开,确实如此。
Time to Live (TTL):数据包生命期,我觉得是没必要去改这个。
ECN:显式的拥堵提示,基于RFC 3168协议。这是需要终端和路由器相互配合的功能,通过在IP包头中设置的拥堵标记相互提醒和退让从而减少拥堵。开不开这个选项,取决于你是否处于资源争夺性的网络环境中,如果要争就不要开。
Checksum:分载TCP包校验和的计算,需要网卡支持,在上一期的《Windows 服务器网络性能调优系列网卡篇》网卡篇说过就不重复了,启用之。
TCP Chimney:TCP连接及数据传输处理过程分载,需要网卡支持。由于自Windows Server 2016起该功能被弃用,所以选择disabled禁用就行。
Large Send Offload:大型发送分载,需要网卡支持,在网卡篇说过,开。
TCP 1323:即RFC 1323 高性能TCP扩展,该协议目的是为提升高BDP(后面第三页也会讲到)网络连接的效率和高速通道的可靠性而设计的,定义了窗口缩放和时间戳两个新的TCP参数选项。如果这两个因素都不涉及就不需要开启。
这一页有大量参数,按选项分区先左后右介绍如下:
1、Internet Explorer Optimization
IE浏览器优化设置,调整访问单个服务器的最大连接数。这些设置随着IE已经跟大家SAY GOODBYE而过时了,调也罢不调也罢。不过想起来当年某品牌路由器必须修改IE的服务器连接数设置,否则管理界面加载会出错的往事。
2、Host Resolution Priority
主机(域名)解析优先级设置,控制本地缓冲解析(Local Priority,Windows的DNS客户端服务)、HOSTS文件解析(Host Priority)、DNS服务器解析(DNS Priority)和NetBT/WINS解析(Netbt Priority)的优先级。软件给出的优化建议是调整为4、5、6、7四个值。这个修改能提高的速度就只是Windows在数优先级时的增量过程而已,属于最不明显的调整了。可以按软件的建议调整。
3、Retransmissions
重传设置。这两项仅适用于Windows 8和Windows Server 2012R2,不属于这些版本时保持默认值。
最大SYN握手包重传数,Max SYN Retransmissions,懂TCP协议握手设计的都懂,软件建议的优化设置是保持为默认(也就是2)或者直接指定为2。按我的理解是无论增大或减少这个值,首先就不见得网络对端或路由器会配合,其次是基于TCP协议握手机制修改此项对提高传输效率没有有效的说服力。
对于非SACK客户端是否启用弹性的往返时延,Non SACK RTT Resiliency,这个项目比较晦涩,是对不支持SACK的客户端,放宽往返时延的限制从而减少需要重传的情况,且只对响应缓慢(ping值大且不固定、频繁丢包)的对端有意义,不属于这种情况就保持不变。这个设置虽然有点意思但还是落入需要路由器或者对端配合。
4、Retransmit Timeout (RTO)
定义重传超时间隔,包括初始RTO(Initial RTO)和最小RTO(Min RTO)两项。
初始RTO,Initial RTO,默认值3000毫秒,对于延迟较低的宽带互联网连接建议优化为2000至3000之间的值,对于非常高延迟的环境下可以增大以适应减少重传。
最小RTO,Min RTO,默认值300,软件建议保持不变。该值不是所有版本的Windows都允许修改。
这两项对于高速局域网基本上无意义,除非网络传输要经过某些非常繁忙的瓶颈节点,例如总带宽不足的VPN接入。
5、Type/Quality of Service
QoS 带宽保留设置。如果Windows内运行了需要QoS服务的应用程序,Windows默认保留20%的带宽给这些应用程序。曾经有很多一知半解的文章直接说关了QoS的支持以释放带宽,这是没有的事,因为前提是需要有在运行的QoS应用软件,而且如果需要运行此类软件,用户还巴不得带宽全给它去保障其流畅运行,比如在线视频会议或VoIP。
第一项 QoS: Non Best Effort Limit,保留分配给QOS应用程序的带宽百分比,默认20(空白不设置即20),设置为0时禁用。
第二项 QoS: Do not use NLA,这选项是对基于Windows组策略的QoS的补充,允许网管通过单机本地组策略去设置 QOS DiffServ (DSCP)的标记值而不需要加入域。在有多张网卡的系统上(某些网卡在域内而某些不在,比如软路由器)也可能需要该设置。
这两项看不懂直接忽略保持不变就好。
6、Gaming Tweak - Network Throttling Index
游戏优化选项。游戏优化最关键的目的是降低延迟,这是这个软件的优化建议的立足点。
网络限流索引,Netowrk Throttling Index,限制非多媒体类网络流量为每毫秒X个包,默认值10的意思是每毫秒最大10个数据包,折合稍大于100Mbps每秒。设置为ffffffff时禁用并获得最大吞吐量。对此网上的讨论很多,但由于是在Windows 8时产生的功能且依赖于具体的网络流量类型,现在看已经过时。
如果是局域网环境或高速互联网连接且优化目标是降低延迟时禁用。软件的说明文档指出禁用后对Source Engine游戏比如TF2, Left 4 Dead, CS:S以及 HoN, CoD, Overlord 系列游戏有效果。
系统响应,System Responsiveness,从Windows 7起,系统为使用了多媒体分级调度(Multimedia Class Scheduler,MMCSS)服务的应用程序确保其优先使用CPU资源,但同时也保留了20%的CPU资源给后台服务。如果要使此类应用程序能充分利用CPU资源,可以设置为10或设置为0禁用,比如面向游戏时。对于服务器环境则取决于服务器用途,如果不涉及多媒体应用服务,适合设置为100(Windows Server 默认已设置为100)。
7、Gaming Tweak: Disable Nagle's algorithm
Windows实现的网络传输Nagle算法是合并多个小的数据包为单个数据包,从而提高传输效率节省带宽(减少了TCP包头的数据量),但很显然会造成提高了延迟。Windows 10全部版本及Windows Server 2012R2起默认开启了Nagle算法。需要注意关闭Nagle可能会对文件传输产生负面影响。相关选项包括:
TCP应答频率,TCP Ack Frequency,默认为2,禁用为1,指定在忽略延迟了的ACK应答前需要有多少个未解决的ACK应答。优化目标是降低延迟时,应禁用该项,如果需要最大化带宽利用,可以尝试设置为大于2的值,软件建议最大可以设置为6并指出对于WiFi连接禁用该设置可能可以改善性能(要测试)。
TCP不延迟,TCP No Delay,默认为0启用Nagle,禁用为1。
TCP ACK应答包间隔超时设置,Tcp Del Ack Ticks,默认为2即200毫秒,为0时禁用,可设置范围是1~6即100毫秒至600毫秒。仅在启用了Nagle时有效。软件建议设置为1可以在保留Nagle的作用的同时降低Nagle的影响。
8、Network Memory Allocation
内存分配选项,主要影响吞吐量。包括有:
增大的系统缓冲,Large System Cache,共享大量文件或大文件时避免内存分配错误,默认为0即大约8MB的缓冲,设置为1时允许缓冲区扩展为大于8MB(最大为可用物理内存减4MB)从而提高传输吞吐的稳定性。如果在Windows事件日志记录中查看到事件ID为2017的无法分配资源的记录就应该启用该项。该问题常见于Windows服务器和客户端之间进行文件共享传输且操作系统版本差异太大时。笔者碰到的是在Windows Storage Server 2016和Windows 7之间传输文件时发生。优化目的为降低延迟时不启用。
网络共享服务的内存平衡性,Size(这个项目名称是真够省字), 默认 1 即最小内存使用,2 表示平衡内存使用, 3 表示最大内存使用。建议系统主要用于网络共享时使用3。该项设置对延迟基本不影响。
9、Dynamic Port Allocation
动态端口分配。低于1024的端口被操作系统保留,高于1024的端口可以用于各种临时用途或分配给用户应用控制,这些情况熟悉TCP/IP协议和操作系统的网管都清楚。Windows默认的端口范围是1024~5000。但在重度的网络传输负荷下,5000显然不够,Windows会提示连接异常之类的错误。所以有:
最大用户端口,Max User Port,该项用于调大前述端口范围的上限值,最高为65534, 建议范围起码要设置到16384,如果是软路由服务器,一步到位65534即可。
TCP端口超时等待时间,Tcp Timed Wait Delay,等待回收并重新宣布端口可用的时间,默认120秒,建议设置为30秒。缩短该时间有益于端口的重新利用,可以减少对提高端口范围上限的需要,这也同样适用于软路由服务器。
这一页是BDP计算工具页面。BDP是Bandwidth-Delay-Product的缩写,意思是带宽*延迟的乘积,基于这个值可以计算出TCP窗口的太小。
界面中第一个输入是网络接口的带宽上限,第二个输入是可能的最大延迟(通过测试获得),然后点击“Calculate”计算按钮获得窗口大小值。
界面中提示,TCP接收窗口设置为MSS的倍数值是比较好的做法,所以计算器得出的只是一个近似值。MSS是指Maximum Segment Size,即最大数据分段长度,是通过TCP协议提交给IP层的最大数据分段大小,不包含TCP首部和IP首部。接收窗口设置为MSS的倍数的目的就是尽可能多地实现缓冲区和数据包内数据之间的对齐,减少对数据进行切割而导致的性能损失。
TCP窗口是TCP/IP协议里面一个很重要的概念,有这样一个公式:
总吞吐量MBps=TCP窗口Bytes*(1s/连接延迟ms)
按照微软的文档指出,在Windows Server 2008之前TCP窗口都是固定的数值,假如网络延迟是10 毫秒,可实现的最大吞吐量就只有区区51Mbps。由此可见延迟对网络实际可用带宽的影响多么重要!
Windows Server在该版本之后,TCP接收窗口的大小是可以调节的。一般来说会有以下的参考设置:
链路带宽上限(Mbps) | 窗口设置(KB) |
<1 | 8 |
1~200 | 17 |
100~10000 | 64 |
>10000 | 128 |
注:10000Mbps=10Gbps
例如计算机上插的网卡是1Gbps时,TCP窗口大小应设置为64KB字节。
正确设置TCP窗口大小是支持其它网络优化手段的基础。详细可以参考RFC 1323文档内容去了解关于TCP协议的其它选项设置。
基于RFC1323的定义,Windows会在最大窗口大小的范围内与其它网络设备协商设置较小的TCP接收窗口大小,以适应网络设备的要求。
在Windows 10和Windows Server 2019之前,可以通过修改注册表去设置TCP接收窗口的大小,但从这两个版本的Windows开始,只能通过NETSH命令去设置窗口自动调节的级别。NETSH命令在我的另一篇文章《网络安全运维必须掌握的Windows命令行工具》中有介绍,属于网管必学。
可以通过如下命令查看设置:
netsh interface tcp show global
实例如下:
Windows Server 2012
Windows Server 2019
Windows 11
话说这输出的对齐居然是一代不如一代......对不住我精心调节的复古视觉主题,还暴露了微软的开发人员连文本对齐的基本功都已经丢了。有些参数的名称一看就知道是机器直译,我觉得微软要省成本干脆就别译了,专业术语应该是网管的基本功。
从上面两张截图可以看到,不同版本的Windows的TCP协议参数有着明显的不同。
如果需要修改设置,可以通过如下命令进行修改:
netsh interface tcp set global autotuninglevel=
可选项包括
disabled: 固定为默认值不自动调整
highlyrestricted: 允许接收窗口增长超过默认值,但非常保守不轻易突破。
restricted: 允许接收窗口增长超过默认值,但限制在某些特定场景。
normal: 允许接收窗口增长以适配几乎所有的场景
experimental: 允许接收窗口增长以适配激进的场景。微软警告这个选项在常用场景下会显著地降低网络性能,仅应用于研究的目的。
其实上面说了这么一大堆,目的只是进一步说明在Windows操作系统一级的网络性能调优的复杂性。如果不是有时间有资源,一般网管是没能力去做什么手工调优的。
这一页内容是MTU和延迟的测试工具。首先我们要修改用于测试的URL,换成符合自己网络环境的目标URL,比如国内的新闻门户网站之类。这个可以在软件上面的菜单中的“preference”中修改,删除原来的换成自己的测试目标:
需要注意的是用于测试的目标URL需要允许被PING,否则无法用于测试。
然后通过下方的三个按钮分别进行测试。这三个按钮的功能是:
Largest MTU:通过二分法查找最大的MTU值。正确设置MTU值不仅提升网络吞吐量和降低延迟,还能避免或减少各种莫名其妙的传输中断。
Latency:网络延迟测试,计算出往返时延(Round-Trip Time, RTT)。
Trace:网络路径跳点测试,也就是Trace Route。
最后是软件的菜单项,包括有备份当前设置、还原备份设置、还原Windows默认设置、导入设置、导出四项设置(默认值、当前值、优化值和自定义值)、复制设置到剪贴板或文本文件、重置TCP/IP协议参数、重置Winsock配置等:
在全面了解了每一项设置后,就看自己情况是选择使用软件提供的Optimal设置,还是自己通过Custom方式去做配置调整。
完成配置设置后,点击“Apply changes”按钮应用。软件会再让用户查看和确认设置,并且给出每项设置实际进行的修改,用户还可以选择备份设置和输出设置日志,方便回溯和回滚。例如下图是在服务器上应用设置:
参数设置后一般都需要重启系统才能生效。
最后小结:网络优化没有银弹,只有取舍和适配。所以这篇文不会也不可能给出按图索骥式的设置截图。
需要了解更多没有在这个软件内出现的优化设置可以到:
SpeedGuide网站详细看看。
本站微信订阅号:
本页网址二维码: