渲染任务运行中 cpu 100%的时候,对ping机器的时延 会有影响吗?
理论上是有一定关系的,cpu 100%时,不丢包就是好的了,延迟变大或存在一定的丢包率是符合预期的
如果要显著缓解,最好是不要用掉全部vCPU,参考:https://cloud.tencent.com/developer/article/2240284
分析:
渲染进程跑满CPU的时候,其他进程慢,网络业务可能会存在用户态收包缓慢 -------> 触发windows的特殊逻辑hold了网卡驱动收包buffer ------> 网卡驱动没有可用buffer放进收包vring进而丢包。
当用户态收包慢的时候,网卡驱动预分配的Buffer可能会被AFD持有最多1秒的时间, 在这断时间内,buffer没法被网卡驱动用来收包,只有等到用户态进程收包,或者1秒后Timer超时,Buffer才会还给网卡驱动。如果用户态收包缓慢,被AFD Timer临时持有的Buffer过多,并且这段时间外部又持续有包进来,就可能出现丢包现象。
XP、2003都没有这个优化逻辑,看了2008-2022的情况,最早出现在win2008,默认开启且无法关闭,Win2012 ---> 2022默认开启但可以通过注册表控制:
这个全局变量有对应符号,微软的变量命名也很直白:AfdDoNotHoldNICBuffers。
如果为true,AFD模块里面buffer timer相关的所有逻辑都不会执行,等同于回退到xp/2003的实现。
可以通过在注册表ServicesAFDParameters路径下添加一个名为DoNotHoldNicBuffers的参数来控制开关:
值为1表示不允许占用网卡驱动Buffer,也就是彻底禁用掉上面说的内存拷贝优化机制;
值为0表示允许;
如果注册表中不存在这个参数(默认不存在),则在afd.sys加载时会判断当前系统版本,如果是Server则启用优化,普通桌面版则禁用。
方案:
1、执行这句命令后重启机器,在CPU几乎打满的场景中,可以将100%丢包现象缓解为包延时变大,但不会丢包。
代码语言:javascript复制reg add "HKLMSYSTEMCurrentControlSetServicesAFDParameters" /v "DoNotHoldNicBuffers" /d 1 /t REG_DWORD /f
最好是提前把这句命令做到镜像里,即关机做镜像前已经执行过这句命令。
2、改网卡的recieve buffer
运行ncpa.cpl打开本地连接属性 → 配置 → 高级页签里找到 Init.MaxRxBuffers 默认256,调1024
把Init.MaxRxBuffers从256改成1024提升收包能力,但业务特殊性所限,有些业务这样做后的改善效果有限,可能6代机更适合这样的业务
针对非6代机,优化:
①升级网卡驱动到最新版
②执行powershell
代码语言:javascript复制$NICName=(Get-WmiObject Win32_NetworkAdapter -Filter 'NetEnabled=True').NetConnectionID
#Close RSS
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "*RSS" -RegistryValue 0
#Close Checksum Offload
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "*IPChecksumOffloadIPv4" -RegistryValue 0
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "*TCPChecksumOffloadIPv4" -RegistryValue 0
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "*TCPChecksumOffloadIPv6" -RegistryValue 0
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "*UDPChecksumOffloadIPv4" -RegistryValue 0
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "*UDPChecksumOffloadIPv6" -RegistryValue 0
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "OffLoad.RxCS" -RegistryValue 0
#Change Init.MaxRxBuffers to 1024
Set-NetAdapterAdvancedProperty -Name $NICName -RegistryKeyword "RxCapacity" -RegistryValue 1024
#Restart NIC
Restart-NetAdapter -Name $NICName -Confirm:$false
Set-ItemProperty HKLM:SYSTEMCurrentControlSetServicesAFDParameters -Name "DoNotHoldNicBuffers" -Value "1" -Force
③重启机器
3、如果以上2点优化效果不明显,可能需要用特殊定制的网卡驱动
解压进到netkvm.inf所在的最后一层目录,执行
代码语言:javascript复制pnputil -i -a netkvm.inf
4、针对RSnt机型的网卡驱动
有些业务比较挑CPU和虚拟化,在低代次机器上和AMD机器上内网drop入包尤其严重,可以换高代次RS5t、S5、S6等高代次机器试试。