Предположим, есть служба, которая очень загружена днем, но обычно простаивает ночью.
В настоящее время Диспетчер задач показывает Режим эффективности не включен
Однако при применении приведенных ниже изменений кода диспетчер задач показывает Efficiency mode
включенным
Он достигает этого режима, применяя эти методы
Efficiency mode
снижает приоритет фонового процесса.
задач, чтобы Windows не выделяла важные ресурсы для этих
Программы.Чтобы значок Efficiency mode
появился в диспетчере задач, необходимы как минимум эти два (методом проб и ошибок):
#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;
}
Вопрос
Не приведет ли включение Efficiency mode
к снижению производительности в течение дня, когда служба очень загружена? (Попытка снизить затраты на использование ЦП/памяти и сделать его более дружественным к «зеленому» программному обеспечению).
Существуют ли другие варианты эффективности, которые можно было бы включить для улучшения общего Efficiency mode
?
Бездействующий процесс (GetMessage, WaitFor... и т. д.) не использует ЦП, поэтому присвоение ему более низкого приоритета ничего не изменит.
Поскольку режим эффективности сокращает ресурсы, выделяемые службе, и снижает ее приоритет по отношению к другим запущенным службам, переключение процесса в режим эффективности, вероятно, снизит его общую производительность.
Важно это или нет, зависит от многих факторов. Однако если служба хорошо спроектирована, она все равно должна работать адекватно. Операционная система обычно отдает предпочтение службам, пользующимся повышенным спросом.
Смысл сокращения ресурсов заключается не в повышении производительности (для тех процессов, которые имеют более высокий приоритет); это чтобы система оставалась отзывчивой. Для фонового процесса нет особого смысла потреблять большое количество ресурсов, если он проводит большую часть своего времени в режиме ожидания.
Однажды я работал в компании, у которой был сервер, который опрашивал конечную точку SQL Server десять раз в секунду. Как вы понимаете, это пустая трата времени, если сервер простаивает большую часть дня и выполняет основную часть своей работы ночью. Я изменил код так, чтобы после шести секунд бездействия он уменьшал интервал опроса до одного раза в секунду. После еще одной минуты бездействия он сократил опрос до одного раза в минуту. Если опрос производил запрос активности, интервал снова увеличивался до 10 в секунду.
Это привело к устранению большей части расточительной деятельности, но при этом заставило сервер реагировать в часы пик.
Служба работает практически в своем собственном контейнере. Не так много других конкурирует с ним, поэтому, возможно, производительность может немного снизиться, но в целом все еще будет достаточно отзывчивой. Спасибо за идеи, надо будет стресс-тестировать.
Вы задали этот вопрос вчера, затем, поскольку не получили ответа, удалили его и отправили снова. Не делай это.