3

ライブラリ「CPU/メモリ使用率取得」を作ってみました。
%なしの数値で取得します。

拾い物のツギハギです。
使いかただけがオリジナルです。

 

スクリプト

'共通

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(localhost)

'CPU
Set colItems = objService.ExecQuery("SELECT * FROM Win32_Processor")

For Each objItem In colItems
  SetUMSVariable $CPU使用率$ , objItem.LoadPercentage
  cpuUseRate = objItem.LoadPercentage
Next

'メモリ
Set objEnumerator = objService.ExecQuery("Select * FROM Win32_OperatingSystem")

For Each objInstance In objEnumerator
  freeMemory = objInstance.FreePhysicalMemory
  'SetUMSVariable $メモリ空き容量$ , Round(freeMemory / 1024 / 1024, 2) & "GB"
  totalMemory = objInstance.TotalVisibleMemorySize
  'SetUMSVariable $メモリ総容量$ , Round(totalMemory / 1024 / 1024, 2) & "GB"
Next

memoryUseRate = freeMemory / totalMemory
memoryUseRate = FormatPercent(memoryUseRate, 0)
memoryUseRate = Replace(memoryUseRate, "%", "")
memoryUseRate = 100 - memoryUseRate
SetUMSVariable $メモリ使用率$ , memoryUseRate

 

使いかたの案

A. シナリオ内でライブラリとして

CPU/メモリ使用率取得
分岐:CPU使用率かメモリ使用率がたとえば80%以下
 True
  何も置かない
 False
  サブルーチン呼び出し:リカバリ処理  

        or

  音
  音声読み上げ:救助要請
  タスクマネージャーのパフォーマンスタブを表示
  待機ボックス:リカバリ誘導

B. シナリオ外で監視ルール発動のセンサー代わりに

  1. ウィンドウタイトル「CPU使用率高騰」と「メモリ使用率高騰」のウィンドウ識別ルールを作っておく
  2. 「CPU使用率高騰」か「メモリ使用率高騰」の出現でサブルーチンを発動する監視ルールを作っておく
  3. 監視ルールで発動させるサブルーチンの末尾に、「CPUメモリ使用率取得.vbs」を実行する「Explorerでファイル開く」を置く(スクリプトはこの投稿の最下部)
  4. シナリオ先頭に、「CPUメモリ使用率取得.vbs」を実行する「Explorerでファイル開く」を置く
  • 「CPUメモリ使用率取得.vbs」自体のパフォーマンス(参考値)
    CPU使用率:0.5〜1.0%程度
    メモリ消費:2.5MB程度
    これを高負荷と読むかごく僅かと読むか
  • 停止方法やその他は、このへんのスレッドに準ずる

https://winactor.com/questions/?q=悲しいとき

https://winactor.com/questions/?q=初期値ありのテキストボックスをn秒後に自動的に閉じる

 

経緯

CPU使用率が異常に高く、100%に振り切れることもある。
これでは自動化の意味がない。
周囲でこんな声を聴きました。

この手の症状も、きっと実行開始時は正常だったはず。
実行中に何らかの条件が重なって暴走したと考えられる。
ここも条件を変えて連鎖を断ち切れば、きっと解消するんだと思います。

https://winactor.com/questions/?q=不規則なCPU高負荷への対応方法

ウチの場合はセキュリティソフトが原因のほとんどを占めていることを特定済みなので、わたしが辿った経緯の資料と対策を改めて共有しました。

原因を特定するまで、ずっと見守るのは骨が折れます。
兆候をうまいことキャッチして、人と同じリカバリ処理を組み込めればベター。
ここで少しよぎりました。

https://winactor.com/questions/question/pcによって実行スピードを変える必要がある場合の/

「CPU/メモリ使用率取得」が激重症状未然防止の根本対策を見出すまでの繋ぎになればと。

 

CPUやメモリの負荷が原因の1つっぽいスレッド

https://winactor.com/questions/?q=ウィンドウ識別でフリーズしてしまいます

https://winactor.com/questions/?q=ファイル数取得処理でフリーズ

https://winactor.com/questions/question/マクロでフリーズ発生を解消したい/

https://winactor.com/questions/question/「word操作閉じる」でwordがフリーズし先へ進めない/

https://winactor.com/questions/?q=WinActorが実行中にプログラム終了してしまう。

https://winactor.com/questions/question/winactorが強制終了する/

https://winactor.com/questions/?q=WinActorの起動するまでの時間が長い

https://winactor.com/questions/question/画像マッチングの速度が遅い/

https://winactor.com/questions/question/処理速度の劣化が起きる!?/

 

リファレンス

[VBScript/WMI] CPU使用率をリモート監視: へっぽこSEのメモメモ
http://heppoen.seesaa.net/article/132740982.html

WSH/VBScriptでCPU情報を取得する方法 - Windowsと暮らす
https://win.just4fun.biz/?WSH/VBScriptでCPU情報を取得する方法

VBScript で空きメモリ容量を取得する
https://www.upken.jp/kb/HdPBaCEihTHpWKzfDZZsVhEJEYkamv.html

 

CPUメモリ使用率取得.vbs

※ 太字部分のボーダーを適宜調整

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(localhost)

Set colItems = objService.ExecQuery("SELECT * FROM Win32_Processor")

Set objEnumerator = objService.ExecQuery("Select * FROM Win32_OperatingSystem")

Do

  For Each objItem In colItems
    cpuUseRate = objItem.LoadPercentage
  Next

  For Each objInstance In objEnumerator
    freeMemory = objInstance.FreePhysicalMemory
    totalMemory = objInstance.TotalVisibleMemorySize
  Next

  memoryUseRate = freeMemory / totalMemory
  memoryUseRate = FormatPercent(memoryUseRate, 0)
  memoryUseRate = Replace(memoryUseRate, "%", "")
  memoryUseRate = 100 - memoryUseRate

  If cpuUseRate > 80 Then
    MsgBox " CPU使用率が " _
      & cpuUseRate _
      & " %です。" _
      & vbCrLf _
      & " 原因を究明して対策を講じてください。" _
      & vbCrLf _
      & " タスクマネージャーの状況を参考にします。" , _
      48, _
      "CPU使用率高騰"
    Exit Do

  ElseIf memoryUseRate > 80 Then
    MsgBox " メモリ使用率が " _
      & memoryUseRate _
      & " %です。" _
      & vbCrLf _
      & " 原因を究明して対策を講じてください。" _
      & vbCrLf _
      & " タスクマネージャーの状況を参考にします。" , _
      48, _
      "メモリ使用率高騰"
    Exit Do

  Else
    WScript.Sleep 100

  End If

Loop

anothersolution 新しいコメントを投稿
回答とコメントは、会員登録(無料)で閲覧できるようになります。