Как в Windows PowerShell установить максимальный процент использования ЦП для сценария?

Я хочу ограничить процент процессорного времени, используемого процессом PowerShell, до определенного числа — ради аргумента давайте представим его равным 13%.

Другие опции, которые не совсем то, что мне нужно: 1) Установка приоритета. 2) Настройка сходства ЦП.

По сути, у нас есть программное обеспечение для мониторинга, которое жалуется, если общая загрузка ЦП становится слишком высокой. У нас есть ежедневный процесс, который вызывает это — в основном безвредно, но слишком много ложных срабатываний в системе мониторинга, и люди привыкают к предупреждениям/ошибкам, когда мы этого не хотим.

Сам процесс также сильно возбуждает lsass.exe, когда он работает, и происходят другие процессы.

Я не знаю PowerShell и пытаюсь исправить Powershell Somebody Else. Очевидно, что переписать с нуля было бы неплохо в какой-то момент в будущем, но сейчас звонят в колокола и раздражают людей.


person Community    schedule 06.08.2009    source источник
comment
Разве не было бы реальным решением запустить его с более низким приоритетом и указать монитору использования ЦП игнорировать процессы с низким приоритетом?   -  person Joachim Sauer    schedule 06.08.2009
comment
У меня сложилось впечатление, что это делается вручную через диспетчер задач. Если этот сценарий powershell срабатывает как часть задания, для кого-то нереально сидеть и следить за диспетчером задач и устанавливать сходство во время его работы.   -  person Michael Beck    schedule 10.01.2018


Ответы (6)


То, о чем вы просите, на самом деле невозможно. Ядро Windows отвечает за планирование процессора — и это правильно. (Я, например, не хочу возвращаться к DOS в реальном режиме).

Лучшее, что вы можете сделать, это вставить длинный Sleep() между каждой строкой скрипта. Но нет никакой гарантии, что какой-либо конкретный командлет / функция / и т. д. Powershell будет регулироваться так, как вы хотите. Вызовы Windows API, которые в конечном итоге выполняют грязную работу каждого оператора, конечно, не будут.

По иронии судьбы, Рэймонд затронул эту тему всего несколько дней назад: http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx

Мое реальное предложение - изменить ваш скрипт, чтобы он выглядел так:

try {
    Stop-CpuMonitor

    # ...the current script contents...
}
finally {
    Start-CpuMonitor
}                
person Richard Berg    schedule 06.08.2009

По моему опыту, невозможно указать, какой процент ЦП будет использовать Powershell. Я думаю, что лучшим способом действий было бы установить для Powershell низкий приоритет, чтобы другие задачи/программы выполнялись первыми. Я думаю, что в первом посте есть достойное предложение использовать паузы (я бы проголосовал, но у меня меньше 15 очков репутации, чтобы сделать это), и это то, что вы можете изучить, но я не думаю, что это даст вам управление, которое вы ищете. Извините, мой ответ больше похож на предложение, чем на решение.

/ матовый

person Matt Dewey    schedule 06.08.2009

Я искренне сомневаюсь, что существует особенно простой способ выполнить то, о чем вы просите. Если проблема с ЦП имеет большое значение, я бы объединил несколько тактик и позволил планировщику позаботиться обо всем остальном - на самом деле он довольно хорошо справляется с нагрузкой.

Предложение использовать ThreadPriority немного проблематично, поскольку PowerShell порождает каждую новую команду в новом потоке, что можно обойти, инкапсулировав все в одну строку, командлет или какую-то функцию. Лучше отправить весь процесс powershell в режим ожидания:

Get-Process -name powershell | foreach { $_.PriorityClass = "Idle" }

Примечание: это отправит ВСЕ экземпляры powershell в режим ожидания, что может быть нежелательным. И, конечно же, не мешает скрипту повышать собственный приоритет.

Кроме того, как упоминалось здесь, засорение вашего кода командами сна может быть эффективным способом обеспечить, чтобы у других процессов было достаточно процессорного времени для обработки их кода. Даже 50-100 мс — это почти вечность для процессора.

[System.Threading.Thread]::Sleep(50)

Между этими двумя тактиками ваш скрипт будет работать, когда он будет доступен, и любезно подчиняться другим требованиям ЦП по мере их возникновения.

person Goyuix    schedule 12.08.2009

Хотя я не знаю способа фактически ограничить использование любого процесса определенным объемом потребления ЦП в процентах, я подумал, что, возможно, можно изменить приоритет потока PowerShell. Поэтому я написал быстрый сценарий и провел тест.

В результате и в «Нормальном», и в «Самом низком» время было примерно одинаковым. Глядя на виджет измерителя ЦП, загрузка ЦП составила примерно 27%, но я работал на четырехъядерном процессоре, так что это неудивительно. В обоих случаях он занимал весь один процессор. В то время моя машина больше ничего не делала, так что, думаю, это были остальные 2%.

Возможно, результаты будут отличаться на более загруженной машине.

Вот сценарий:

function Spin
{
    param($iterations)

    for($i = 0; $i -lt $iterations; ++$i)
    {
        # Do nothing
    }
}

$thread = [System.Threading.Thread]::CurrentThread

Write-Host $thread.Priority
$start = [DateTime]::Now
Write-Host "[$start] Start"

Spin 10000000

$end = [DateTime]::Now
Write-Host "[$end] End"
$span = $end - $start
Write-Host "Time: $span"

$thread.Priority = "Lowest"
Write-Host $thread.Priority
$start = [DateTime]::Now
Write-Host "[$start] Start"

Spin 10000000

$end = [DateTime]::Now
Write-Host "[$end] End"
$span = $end - $start
Write-Host "Time: $span"

$thread.Priority = "Normal"

И вот результат:

Normal
[08/06/2009 08:12:38] Start
[08/06/2009 08:12:55] End
Time: 00:00:16.7760000
Lowest
[08/06/2009 08:12:55] Start
[08/06/2009 08:13:11] End
Time: 00:00:16.8570000

Обратите также внимание, что в документации для Thread.Priority указано:

Операционные системы не обязаны соблюдать приоритет потока.

person Lee    schedule 06.08.2009

Возможность может использовать process lasso. У меня не было ничего, кроме положительных результатов по автоматическому дросселированию процессов, не исключенных мной, когда загрузка ЦП превышает определенный процент.

Имейте в виду, что существует довольно ограниченная бесплатная версия, которую вы можете использовать для тестирования, если она вам подходит.

PS: я ни на кого не работаю. Я просто предлагаю программу, которая работала на меня в прошлом.

person Christopher Hauck    schedule 23.04.2016

Используйте AddType для литерала сценария C#, который снова использует P/Invoke для вызова функций Win32 CreateJobObject, SetInformationJobObject (передавая JOBOBJECT_CPU_RATE_CONTROL_INFORMATION) и AssignProcessToJobObject. Вероятно, будет проще написать программу-оболочку на C, которая устанавливает ограничения и порождает сценарий PowerShell в таком задании.

person RolKau    schedule 03.02.2021