このアプリケーションを使用すると、Windowsプロセスに制約を設定できます。この目的のためにジョブオブジェクトを使用します。
目次
リリースページから最新バージョンのバイナリをダウンロードするか、チョコレートまたはウィンゲットでインストールすることができます。
choco install procgov
# or
winget install procgovここで言うことはあまりありません:)コマンドプロンプトからPROCGOVを起動して新しいプロセスを起動するか、実行中のプロセスに接続するとアクティブ化されるデフォルトモードです。
Procgovを使用する場合、それ自体の2番目のインスタンスを起動することがあることを観察することができます(-nomonitorスイッチを使用しない限り)。この2番目のインスタンスはジョブモニターであり、コマンドラインARGSの-Monitorスイッチによってそれを認識することができます。監視対象のジョブの最後のプロセスが終了するまで、生き続けます。 Windowsセッションごとにジョブモニターの最大1つのインスタンスがあるはずです。その役割は、ProcGovで作成されたジョブを監視することです。モニターは、監視されたジョブの最後のプロセスの終了直後に終了する必要があります。
この機能はベータフェーズにあります。注意して使用して、経験豊富なエラーを報告してください。
-installスイッチを使用してアプリケーション設定を永続化すると、ProcGovはレジストリの設定を保存し、ProcessGovernorという名前のWindowsサービスを作成します。デフォルトでは、Systemアカウントと%ProgramFiles%ProcessGovernorフォルダーをサービスベースパスとして使用します。 -Service-Path 、 -Service-UserName 、および- サービスパスワードコマンドラインスイッチを使用して、この設定を構成できます。別のアプリケーションのインストールコマンドを実行すると、ProcGovはレジストリに新しいデータを追加しますが、既存のサービスを再利用します。このサービスは、短時間後に更新された構成を取得する必要があります。
ProcessGovernorサービスは、開始プロセスを監視し、インストール中に事前に定義された制限を適用します。
サービスをアンインストールするには、 -uninstallスイッチを使用します。最後に保存された構成を削除すると、サービスは削除されます。保存したすべてのProcGovデータをサービスとともに削除する場合は、 -uninstall-allスイッチを使用します。
新しく作成されたプロセスまたはすでに実行されているプロセスに制限を設定できます。実行プロセスを制約するには、-p | -pidスイッチを使用します。
procgov.exe --maxmem 40M --pid 1234制限が適用された新しいプロセスを開始するには、ProcgGov引数としてプロセス画像パスを渡すだけです。 procgov64 --maxmem 40M c:temptest.exe 。ターゲットプロセスにパラメーターを渡す必要がある場合は、使用するのが最善です--たとえば、ターゲットプロセスのパラメーターをProCGOVパラメーターから分離することを最適です。
procgov.exe -m 100M -- test.exe -arg1 -arg2=val2 arg3複数のプロセスを同じジョブオブジェクトに割り当てることができます。異なるプロセスIDで-pパラメーターを複数回使用する場合、ProcGovはすべてのプロセスに同じ制限を適用します。たとえば、:
procgov.exe --maxmem 100M -p 1234 -p 1235 -p 1236プロセスのいずれかがすでにProcGovジョブオブジェクトに割り当てられている場合、他のプロセスも同様に割り当てられます。
制限設定が一度更新されることも可能です。ただし、1つの要件があります。プロセスは、異なるProcGovジョブに割り当てることができません(したがって、同じジョブまたは割り当てられていない必要があります)。制限を更新するには、新しい制限とターゲットプロセスIDを提供するProcGovを実行するだけです。 ProcGovは、指定された制限のみを更新します。この行動をよりよく理解するための例を見てみましょう。
We set a CPU limit on a process 1234
procgov.exe --nowait -c 2 -p 1234
Then we run procgov again with the new CPU limit - procgov will update the existing job object
procgov.exe --nowait -c 4 -p 1234-maxmem ( -m )スイッチプロセスガバナーを使用すると、プロセスでコミットされたメモリに制限を設定できます。 Windows上のメモリは、実際にはプロセスが使用するすべてのプライベートメモリです。これにより、プロセスガバナーを使用して、メモリリークの.NETアプリケーション(Webアプリケーションを含む)をテストすることができます。プロセスがメモリを漏れている場合、より速くOutMemoryExceptionを取得します。
procgov.exe -m 100M -c 2 notepad.exe
procgov.exe -m 120M -p 1234-maxwsおよび-minwsスイッチを使用すると、プロセスの最大および最小作業セットサイズ(物理メモリ使用)を制御できます。このオプションには、 seincreasebasepriorityprivilegeが必要なので、アカウントには確認してください(問題69の詳細)。作業セットのサイズを制限する場合は、これらの両方のパラメーターに常にゼロより大きい値を提供することを忘れないでください。
procgov.exe --minws 1M --maxws 120M -p 1234-maxjobmemオプションを使用すると、特定のジョブオブジェクトに属するすべてのプロセスに最大のコミットされたメモリを指定できます。これは、子供のプロセスへのジョブの伝播を有効にする場合、または同じジョブオブジェクトを使用して複数のプロセスを制御する場合に便利です。
procgov.exe -r --maxjobmem 200M -- cmd.exe
procgov.exe -r --maxjobmem 1G -p 1234,1235,1236-CPUスイッチを使用すると、アプリケーションが実行されるコアを制御できます。 CPUコア番号を小数値として提供する場合、アプリケーションは指定された数のコアを使用することが許可されます。
CPUコア番号を16進値(0xプレフィックス付き)として提供する場合、この数値は、各ビットがCPUコアを表す最初のプロセッサグループのアフィニティマスクとして扱われます(最小値から始まる)。さらに、文字「G」が付いたプロセッサグループ番号と、文字「n」が付いたnumaノード番号でアフィニティマスクを準備することができます。アフィニティをスキップして、numaノードまたはプロセッサグループのアフィニティを使用することもできます。有効な例値: n1:g0:0xF 、 n1:g0 、 n1 、 g0 。
-CPUパラメーターは複数回定義でき、最終的なアフィニティマスクは提供されたマスクの組み合わせになります。
CPU集中アプリケーションでの2つの例を使用してみましょう。最初のものでは、CPUコア制限を2つのコアに設定しました。
procgov.exe --cpu=2 TestLimit.exe私のマシンのCPU使用グラフは次のように見えます:
1秒でCPUアフィニティマスクを設定します(ヘックス表記付き):
procgov.exe --cpu=0x2 TestLimit.exeこの場合のCPUグラフは次のように見えます(2番目のコアのみが使用されていることに注意してください):
より複雑な親和性設定の例:
# Use processor group 0 affinity from NUMA node 0 and 1 core from the group 1 in NUMA node 1
procgov.exe --cpu=n0:g0 --cpu=n1:g1:0x1 TestLimit.exe
# Use processor group 0 affinity and 1 core from the group 1
procgov.exe --cpu=g0 --cpu=g1:0x1 TestLimit.exeシステムにCPU構成が存在するものがわからない場合は、PROCGOVをパラメージなしで実行でき、印刷します。
procgov.exe
#
# Use --help to print the available options.
#
# === SYSTEM INFORMATION ===
#
# NUMA Node 0:
# Processor Group 0: 000000000000000F (CPUs: 0,1,2,3)
# Processor Group 1: 0000000000000007 (CPUs: 4,5,6)
#
# NUMA Node 1:
# Processor Group 2: 000000000000000F (CPUs: 7,8,9,10)
# Processor Group 3: 0000000000000007 (CPUs: 11,12,13)
#
# Total Physical Memory (MB): 20 460
# Available Physical Memory (MB): 16 086
# Total Committed Memory (MB): 3 701
# Current Committed Memory Limit (MB): 21 740-CPU-RATEオプションを使用すると、プロセスの最大CPUレートを設定できます。 CPUアフィニティも設定する場合、レートは選択したコアにのみ適用されます。たとえば、マシンに8つの論理CPUコアがあり、CPUレートを100%に設定し、CPU親和性を0x7(最初の4つのコア)に設定すると、監視ツールによってこのプロセスで報告された最大CPUレートは50%になります(CPU数の半分で実行されています)。
-TimeOutオプションを使用すると、ProcGovが終了する前にプロセスが実行できる最大時間(クロック時間)を定義できます。 -Recursiveオプションが設定され、タイムアウトが合格すると、Progovはモニタリングセッションの開始から子供が開始したすべてのプロセスも終了します。
-process-utimeおよび-job-utimeオプションを使用すると、プロセスの最大ユーザーモード実行時間(すべての子供も)またはジョブの最大ユーザーモード実行時間に制限を設定できます。後者のケースは、プロセスとその子供の合計ユーザーモード実行時間に制限を設定するため、 -Recursiveオプションで意味があります。
-priorityパラメーターは、監視対象プロセスのプロセス優先度クラスを設定します。考えられる値には、 Idle 、 BelowNormal 、 Normal 、 AboveNormal 、 High 、 RealTimeが含まれます。最高の3つの優先順位には、 SeincreaseBasepriorityPrivilegeが必要なので、アカウントがあることを確認してください(問題69の詳細)。
-ENVスイッチを使用すると、プロセス環境変数を設定できます。このスイッチは、変数値を持つテキストファイルへのパスを受け入れます。たとえば、
COR_ENABLE_PROFILING=0x01
COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A}procgovコマンドは次のように見える場合があります。
procgov.exe --env c: t emp e nv.txt -c 2 dotnet_app.exe新しいプロセスを開始したり、既存のプロセスにアクセスしたりするときに、環境変数を設定できます。
ターゲットプロセスで、Enable-Privilegeスイッチを使用して特権を有効にすることができます。たとえば、このパラメーターを複数回使用して複数の特権を指定できます。
procgov.exe --enable-privilege=SeDebugPrivilege --enable-privilege=SeShutdownPrivilege notepadWindowsでは、プロセストークンに新しい特権を追加できないことに注意してください。既存のもののみを有効にすることができます。プロセスハッカーまたはプロセスエクスプローラーで利用可能なプロセス特権を確認できます。特定の特権が特定のユーザーに利用可能になる方法を学ぶためのドキュメントを確認してください(たとえば、グループポリシーを更新する必要がある場合があります)。
以下に、このプロジェクトに貢献した人々のリストがあります。ありがとう!