В Windows PowerShell, как вы можете установить максимальный процент загрузки процессора для использования скриптом? - PullRequest
3 голосов
/ 06 августа 2009

Я стремлюсь ограничить процент процессорного времени, используемого процессом PowerShell, до определенного числа - в качестве аргумента, давайте представим, что оно составляет 13%.

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 06 августа 2009

То, что вы просите, на самом деле не возможно. Ядро 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
}                
1 голос
/ 12 августа 2009

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

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

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

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

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

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

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

1 голос
/ 06 августа 2009

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

/ матовый

0 голосов
/ 23 апреля 2016

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

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

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

0 голосов
/ 06 августа 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 указано:

Операционные системы не обязаны учитывать приоритет потока.

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