渲染任务运行中 cpu 100%的时候,对ping机器的时延 会有影响吗?
理论上是有一定关系的,cpu 100%时,不丢包就是好的了,延迟变大或存在一定的丢包率是符合预期的
【资料图】
渲染进程跑满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的实现。
可以通过在注册表Services\AFD\Parameters路径下添加一个名为DoNotHoldNicBuffers的参数来控制开关:
值为1表示不允许占用网卡驱动Buffer,也就是彻底禁用掉上面说的内存拷贝优化机制;
值为0表示允许;
如果注册表中不存在这个参数(默认不存在),则在afd.sys加载时会判断当前系统版本,如果是Server则启用优化,普通桌面版则禁用。
方案:执行这句命令后重启机器,在CPU几乎打满的场景中,可以将100%丢包现象缓解为包延时变大,但不会丢包。
reg add "HKLM\SYSTEM\CurrentControlSet\Services\AFD\Parameters" /v "DoNotHoldNicBuffers" /d 1 /t REG_DWORD /f
最好是提前把这句命令做到镜像里,即关机做镜像前已经执行过这句命令。
如果要显著缓解,最好是不要用掉全部vCPU,参考:https://cloud.tencent.com/developer/article/2240284