英文:
Effects of programmatically enabling `Efficiency Mode` for services in Windows 11?
问题
假设有一个在白天非常繁忙但通常在晚上空闲的服务。
目前任务管理器显示未启用效率模式
然而,应用下面的代码更改后,任务管理器显示效率模式
已启用
通过以下方法实现了这种模式
- 首先,
效率模式
降低了后台任务的进程优先级,以便Windows不分配重要资源给这些应用程序。 - 其次,它部署了一种称为EcoQoS的东西,这是一种降低高效任务时钟速度的服务质量包。
要在任务管理器中显示效率模式
,至少需要这两个(通过反复尝试):
- 将进程优先级类设置为IDLE_PRIORITY_CLASS
- 使用PROCESS_POWER_THROTTLING_EXECUTION_SPEED节流CPU功率
#include <windows.h>
// 将进程优先级设置为IDLE_PRIORITY_CLASS。
void set_process_priority()
{
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
}
// 启用EcoQos以降低时钟速度。
void enable_ecoqos()
{
PROCESS_POWER_THROTTLING_STATE PowerThrottling = { 0 };
PowerThrottling.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION;
PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
PowerThrottling.StateMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, &PowerThrottling, sizeof(PowerThrottling));
}
int main(int argc, char* argv[])
{
set_process_priority();
enable_ecoqos();
// 现在进程正在运行效率模式...
return 0;
}
问题
在白天服务非常繁忙时启用效率模式
是否会导致性能下降?(试图降低CPU/内存使用成本,使其更加绿色软件友好)。
是否有其他效率选项可以启用以改善整体的效率模式
?
英文:
Suppose there's a service that's extremely busy during the day but generally idle at night.
Currently Task Manager shows Efficiency mode not enabled
However, applying the code changes below, Task Manager shows Efficiency mode
enabled
It achieves this mode by applying these methods
- First, the
Efficiency mode
lowers the process priority of background
tasks so that Windows does not allocate important resources to these
apps. - Second, it deploys something called EcoQoS, which is a Quality of
Service package that reduces the clock speed for efficient tasks.
To get the Efficiency mode
to appear in the Task Manager, at a minimum these two are required (through trial and error):
- Set process priority class to IDLE_PRIORITY_CLASS
- Throttle CPU power with PROCESS_POWER_THROTTLING_EXECUTION_SPEED
<br>
#include <windows.h>
// Sets the process priority to IDLE_PRIORITY_CLASS.
void set_process_priority()
{
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
}
// Enables EcoQos to reduce the clock speed.
void enable_ecoqos()
{
PROCESS_POWER_THROTTLING_STATE PowerThrottling = { 0 };
PowerThrottling.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION;
PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
PowerThrottling.StateMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, &PowerThrottling, sizeof(PowerThrottling));
}
int main(int argc, char* argv[])
{
set_process_priority();
enable_ecoqos();
// Process is now running in Efficiency mode...
return 0;
}
Question
Will enabling Efficiency mode
cause degraded performance issues during the day when the service is very busy? (Trying to lower the costs of CPU/Memory usage and make it more Green Software friendly).
Are there other efficiency options that could be enabled to improve the overall Efficiency mode
?
答案1
得分: 2
因为效率模式会降低分配给服务的资源并降低其相对于其他运行服务的优先级,将一个进程切换到效率模式可能会降低其整体性能。
是否重要取决于许多因素。如果服务设计良好,它仍然应该能够正常运行。操作系统通常会优先考虑高需求的服务。
减少资源的目的不是为了提高性能(对于具有更高优先级的进程来说),而是为了保持系统的响应性。如果一个后台进程大部分时间都处于空闲状态,那么消耗大量资源就没有太多意义。
我曾经在一家公司工作,他们有一台服务器每秒轮询 SQL Server 终端点十次。你可以想象,如果服务器大部分时间都处于空闲状态,而大部分工作都在夜间进行,那么这是相当浪费的。我修改了代码,使其在连续六秒的空闲后将轮询间隔降低到每秒一次。在另外一分钟的空闲后,将轮询间隔降低到每分钟一次。如果一次轮询产生了活动请求,间隔就会恢复到每秒十次。
这样做的效果是消除了大部分的浪费活动,同时在繁忙时期保持了服务器的响应性。
英文:
Because Efficiency Mode reduces the resources allocated to a service and reduces its priority relative to other running services, switching a process to Efficiency Mode would likely reduce its overall performance.
Whether that matters or not depends on many factors. If the service is well-designed, it should still perform adequately, however. The operating system typically defers to services that are in high-demand.
The point of reducing resources is not to achieve performance gains (to those processes having higher priorities); it is to keep the system responsive. It doesn't make much sense for a background process to consume large amounts of resources if it spends most of its time idle.
I once worked in a company that had a server which polled a SQL Server endpoint ten times per second. As you can imagine, this is quite a waste if the server sits idle most of the day and does the bulk of its work at night. I changed the code so that after six seconds of inactivity, it reduced the polling interval to once per second. After another minute of inactivity, it reduced the polling to once per minute. If a poll produced a request for activity, the interval went back up to 10 per second.
This had the effect of eliminating most of the wasteful activity, while still making the server responsive during its busy times.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论