Windows 10 调度算法是否会限制我的进程?

Windows 10 调度算法是否会限制我的进程?

我有一个 10 核 20 线程的 Intel Core i9-7900X 3.3GHz CPU。大约四年来,我一直在这台机器上运行 18 到 20 个线程,大部分时间都是在 Windows 7 下运行。几个月前,我换到了 Windows 10。我刚刚注意到我的程序运行方式有些奇怪。

它们都是控制台模式程序,并且大多数时候几乎不进行屏幕 I/O。

到目前为止,它们都以“最大速度”运行,即每个线程都拥有完整的周期份额。这可以从程序保存的统计数据中观察到,最简单的是“每秒操作数”的速率。如果我只运行一个程序副本,它会获得更高的速率,这是预期的,因为至少一个 CPU 线程可以以“提升”的速率运行。所以当我运行 20 个线程时,它们都以 3.3GHz 的速率稳定运行。代码不使用浮点,它非常简单,二十个线程似乎以一个(非提升)线程的吞吐量的二十倍运行。

一两个月前,我注意到在几个小时没有进行 I/O 后,大多数或所有进程的操作“速率”都下降了。我通过添加一行每隔几分钟写入屏幕的代码来验证这一点。当然,这意味着要非常小心地在最内层循环的外面添加一些代码,但不要太远,以免它很少执行。这很不方便,因为该代码的位置取决于特定程序正在执行的操作。但如果我费心了,它会导致程序再次以“全速”运行。由于额外的代码,速度会减去一点点。

“较低速率”很难准确测量,但似乎低于正常速度的 10%。

我不能肯定地说这种情况是在我安装 Windows 10 时开始发生的,但似乎很有可能。或者它是随某个更新一起出现的。我不能肯定地说这仅限于控制台模式程序,但似乎也有可能,因为其他程序通常会花费大量时间在 Windows API“空闲循环”上,而这根本不是空闲的,可能会触发我的屏幕 I/O 触发。

所有相关的高级电源选项都设置为“允许 100%”。CPU 不会突然过热。

当程序速度变慢时,Windows 任务管理器仍显示它们以 5% 的速度运行(二十个可能线程中的一个的最大值)。

还有人注意到这一点吗?我希望能够解决这个问题,而无需定制我的程序来绕过侵入式调度程序。

更新:我仍在寻找答案,但我安装了一个变通方法。在最内层的循环中,我对“中断标志”进行了非常简单的布尔检查。这几乎不会增加开销,事实上它已经存在以允许键盘中断,Ctl-Brk 启用键盘菜单。我修改了中断例程以区分 Ctl-C 和 CTL-Brk,现在 Ctl-C 设置了一个标志来表示“用进度更新屏幕然后返回全速”。然后我编写了一个批处理文件/程序,每五分钟循环一次,并向每个正在运行的程序发送一个具有正确名称的 Ctl-C 信号。这几乎允许我像以前一样继续,而不必担心进行一些 I/O 的最佳位置以保持全速运行。循环程序占用的 CPU 周期接近零。

我做了一些进一步的测量,似乎“每秒平均操作数”在一天内从大约一千万下降到一千左右。因此,相比之下,速度的降低几乎是稳定的。

批处理文件:

:looparound
@echo off
wmic process where "Name LIKE 'cgpuz.exe'" GET ProcessID > procIDs.txt
type procIDs.txt > procIDs.lst
set nump=0
FOR /F "eol=P tokens=1 delims=, " %%i in (procIDs.lst) do ( @set /A nump += 1
@signal %%i 8 )
@echo.
@echo Sent %nump% signals
@timeout /T 250
goto looparound

相关内容