4

PowerShell プロセスが使用する CPU 時間のパーセンテージを特定の数値に制限しようとしています。議論のために、13% であると想像してください。

正確には必要ではないその他のオプション: 1) 優先度の設定。2) CPU アフィニティの設定。

基本的に、合計 CPU 使用率が高くなりすぎると文句を言う監視ソフトウェアがあります。私たちはこれを引き起こす日常的なプロセスを持っています - ほとんど無害ですが、監視システムであまりにも多くの誤検知があり、人々は私たちが望んでいないときに警告/エラーに慣れてしまいます.

プロセス自体も、lsass.exe が実行されると非常に興奮し、他のプロセスも発生します。

私は PowerShell を知りません。Somebody Else の Powershell を修正しようとしています。明らかに、将来のある時点で根本的な書き直しが必要になるでしょうが、今のところ、ベルが鳴り、人々を悩ませています。

4

6 に答える 6

3

あなたが求めていることは実際には不可能です。Windows カーネルは、CPU のスケジューリングを担当しています。当然のことながら、そうです。(私はリアルモード DOS に戻りたくありません)。

できる最善の方法は、スクリプトの各行の間に長い Sleep() を挿入することです。ただし、特定の Powershell コマンドレット / 関数 / などが希望どおりに調整されるという保証はありません。最終的に各ステートメントの汚れた作業を実行する Windows API 呼び出しは、そうではありません。

皮肉なことに、Raymond は数日前にこのトピックに触れました: http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx

私の本当の提案は、スクリプトを次のように変更することです。

try {
    Stop-CpuMonitor

    # ...the current script contents...
}
finally {
    Start-CpuMonitor
}                
于 2009-08-06T14:45:25.527 に答える
1

私はあなたが求めていることを達成するための特に簡単な方法があることを心から疑っています。CPUの問題が大きな問題である場合は、いくつかの戦術を組み合わせて、残りはスケジューラーに任せます。実際には、負荷の管理はかなり得意です。

ThreadPriorityを使用する提案は、PowerShellが新しいスレッドで新しいコマンドを生成するので少し問題があります。これは、すべてを1行、コマンドレット、またはある種の関数にカプセル化することで回避できます。PowerShellプロセス全体をアイドル状態に送信することをお勧めします。

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

注:これにより、すべてのPowerShellインスタンスがアイドル状態になりますが、これは望ましい効果ではない可能性があります。そして確かに、スクリプトがそれ自体の優先順位を上げることを妨げることもありません。

また、ここで説明したように、スリープコマンドを使用してコードを散らかすことは、他のプロセスがコードを処理するための十分なCPU時間を確保するための効率的な方法です。50〜100ミリ秒でさえ、プロセッサにとってほぼ永遠です。

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

これらの2つの戦術の間で、スクリプトは利用可能になったときに実行され、他のCPU要求が発生したときにそれを丁寧に受け入れます。

于 2009-08-12T14:26:05.403 に答える
1

私の経験から、CPU Powershell の何パーセントが使用されるかを規定する方法はありません。最善の方法は、Powershell の優先度を Low に設定して、他のタスク/プログラムを最初に実行できるようにすることだと思います。最初の投稿には一時停止を使用する適切な提案があると思います (私は賛成しますが、そうするための 15 の評判ポイントを下回っています)。あなたが探しているコントロール。申し訳ありませんが、私の答えは解決策というよりも提案です。

/マット

于 2009-08-06T16:28:21.937 に答える
0

プロセスの使用を特定の割合の CPU 消費量に実際に制限する方法はわかりませんが、PowerShell スレッドの優先度を変更できるのではないかと考えました。そこで、簡単なスクリプトを作成してテストを実行しました。

その結果、「通常」と「最低」の両方で、所要時間はほぼ同じでした。CPU メーター ウィジェットを見ると、CPU 使用率は約 27% でしたが、私はクアッド コア ボックスで実行していたので、それは驚くべきことではありません。どちらの場合も、1 つの CPU をすべて使用していました。当時、私のマシンは他に多くのことをしていなかったので、それが残りの 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

オペレーティング システムは、スレッドの優先順位を尊重する必要はありません。

于 2009-08-06T15:23:49.647 に答える
0

C# スクリプト リテラルで AddType を使用します。これは、P/Invoke を使用して Win32 関数 CreateJobObject、SetInformationJobObject (JOBOBJECT_CPU_RATE_CONTROL_INFORMATION を渡す)、および AssignProcessToJobObject を呼び出します。制限を設定し、そのようなジョブで PowerShell スクリプトを生成するラッパー プログラムを C で作成する方がおそらく簡単です。

于 2021-02-03T21:02:45.280 に答える