web-dev-qa-db-ja.com

Windowsでのプログラムの合計RAM=使用状況を測定する方法は?

さまざまなポータブルブラウザーのメモリ使用量を比較していましたが、この質問は、タスクマネージャーのいくつかのサブプロセスで開かれるすべてのプログラムに共通です。

Sysinternalsのスクリーンショットを参照してください Process Explorer 以下:

One programm opens several processes

たとえば、Firefoxは1つのプロセスで開くだけですが、Google Chromeはタブごとに複数のプロセスを開始します。

では、1つのプログラムによって開かれたすべてのプロセスの合計RAM使用量を取得するにはどうすればよいですか?(Googleの場合はChrome 例えば。)

もちろん、電卓を使って合計を計算することもできますが、もっと便利な方法があるはずです。

8
UdeF

一般的な答えは次のとおりです。正確ではありません。

仮想ではなく、RAM(物理メモリ))について尋ねていると仮定すると、Windowsは、各プロセスに対して2つの関連するカウンタ、合計ワーキングセットとプライベート(プロセスに対する)ワーキングセットを発行します(PerfMonタスクマネージャには「プライベート」と「共有」が表示されます(これらを合計すると合計になります)。プロセスエクスプローラには、これらが「ワーキングセット」(合計)、「WSプライベート」、「WS共有可能」と表示されます。 、および「WSShared」。ProcExpは、後者の2つを見つけるために、少し「詳細な調査」を行います。

「共有」、または全体の共有部分が問題の原因です。

Process Explorerの用語を使用すると、「共有可能」は、プロセスに割り当てられているが、少なくとも他のプロセスと共有されている可能性のあるRAM)を示します。「共有」は、実際に共有されているサブセットです。 、少なくとも1つの他のプロセスによる。

問題は、実際に共有しているプロセスの数やプロセスがわからないことです。 「共有可能」または「共有」の数値をすべて合計すると、共有ページがたまたま共有しているすべてのプロセスでカウントされるため、実際よりも合計が大きくなります。すべてのプロセスが、同じプログラム(Chromeなど)を実行しているプロセスであっても、アドレス空間全体から同じページを共有しているとは限りません。

Chromeのように、すべて同じ.exeを実行している一連のプロセスの場合:すべての「WSプライベート」カウンターを合計し、その合計に任意のChromeインスタンスの「WS」の最大のものを追加します。共有可能」の場合、最小限の数値になりますが、実際の数値はこれよりも大きくなる場合があります。

Chromeには、ge0rdiで言及されている優れた自己報告機能があります。必要なカウンターは「メモリー」の下にあるカウンターです。 Chromeは、OSが報告する内容と正確には一致しませんが、すべての実際の使用には十分に近いです。

考慮すべきもう1つのことは、仮想メモリOSにおけるプロセスまたはプロセスのサブセットの「メモリ使用量」は、プロセスの動作とRAM圧力に非常に依存していることです。 RAMが多かれ少なかれ、または他の多かれ少なかれRAMを要求しているシステムでは、数値は非常に異なって見えます。したがって、RAMプロセスは「必要」です。したがって、「使用可能なRAMに気づき、すべてのChromeインスタンスを閉じて、使用可能なRAM増加」の量を確認する」ことは適切ではありません。テスト。OSは、特にビジー状態の場合、リリースされたRAMの一部を他のプロセスに割り当てる場合があります。

12
Jamie Hanrahan

一般的にこれを行う方法はわかりませんが、Chromeの合計メモリ使用量を測定するには、アドレスバーにabout://memoryを書き込むことができます。

Summaryセクションには、すべてのChromeプロセスの合計メモリ使用量が表示されます。

10
ge0rdi

しばらく前に私はそれを行う素晴らしい(そしておそらくやや醜い)バッチファイルを書きました、それはgnuwin32のsedとcutを必要とします。

私はそれを書きました 'cos私は恐ろしくてRAM現代のブラウザが占めるので、すぐに見たかったのです。

私は現在それを強化しようとしていますが、これはそのままです。

つまり、Chromeは3.4GBを使用しています。

    C:\>ramchrome<ENTER>
    >=1GB
    3GB
    3,480,288
    3.4GB (rounded down)
    3480288KB

これがバッチファイルです。かつてははるかに簡単でした。しかし、私は例えばを追加したかったGBとKB ..そしてそれはバッチファイルの大部分を占めます。 Chromeがヨタバイトの束を占めたとしても(ヨタバイトは数百万兆メガバイト)、私のバッチはそれをサポートするために書かれるべきであるか、少なくとも書かれているので、これは非常に将来の証拠です。

バッチファイルの内部がどのように機能するかの基本は簡単です。いくつかの一時ファイルが作成されます。これは確認できます。基本的に、すべてのプロセスのリストを出力し、chrome.exeグラブのプロセスを除外します使用するバイト数を示す部分だけです。次に、出力できる最後の一時ファイルには、各chrome.exeプロセスで使用されるすべてのバイトのリストがあり、コンマまたはスペースが削除されていることがわかります。次に、forステートメントでそれらすべてが合計されます。最後の一時ファイルはExcelで開くことができますが、必要はありません。

Batファイルの使用方法を確認し、実行して出力内容を確認します。あなたはそれがどのように機能するかを知る必要はありませんが、それはそれがどのように機能するかです。生成された一時ファイルを見るとわかります。

@echo off
setlocal enableextensions enabledelayedexpansion


set tempfile1=%temp%\asdf1.a
set tempfile2=%temp%\asdf2.a
set tempfile3=%temp%\asdf3.a
set tempfile4=%temp%\asdf4.xls

tasklist >%tempfile1%
type %tempfile1% | grep "chrome" > %tempfile2%
cut -b 68- %tempfile2% > %tempfile3%
sed -r "s/\d32|K|,//g" %tempfile3% >%tempfile4%


set total=0
for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul

:: --- added this
set a=%total%

if "%a:~-9,-6%"=="" echo ^< 1GB
if NOT "%a:~-13,-6%"=="" echo ^>=1GB

set Yotta=%a:~-24,-21%
set zetta=%a:~-21,-18%
set exa=%a:~-18,-15%
set peta=%a:~-15,-12%
set tera=%a:~-12,-9%
set giga=%a:~-9,-6%
set mega=%a:~-6,-3%
set kilo=%a:~-3%

set prefix=

if NOT "!Yotta!"=="" (
    set Yotta=!Yotta!,
    if "!prefix!"=="" (
        set prefix=YB
        echo !a:~-24,-21!!prefix!
    )
)

if NOT "!zetta!"=="" (
    set zetta=!zetta!,
    if "!prefix!"=="" (
      set prefix=ZB
      echo !a:~-21,-18!!prefix!
    )
)

if NOT "!exa!"=="" (
    set exa=!exa!,
    if "!prefix!"=="" (
      set prefix=EB
      echo !a:~-18,-15!!prefix!
    )
)

if NOT "!peta!"=="" (
    set peta=!peta!,
    if "!prefix!"=="" (
      set prefix=PB
      echo !a:~-15,-12!!prefix!
    )
)

if NOT "!tera!"=="" (
    set tera=!tera!,
    if "!prefix!"=="" (
      set prefix=TB
      echo !a:~-12,-9!!prefix!
    )
)

if NOT "!giga!"==""  (
    set giga=!giga!,
    if "!prefix!"=="" (
      set prefix=GB
      echo !a:~-9,-6!!prefix!
    )
)

if NOT "!mega!"==""  (
    set mega=!mega!,
    if "!prefix!"=="" (
      set prefix=MB
      echo !a:~-6,-3!!prefix!
    )
)

if "!mega!"=="" (
  if "!prefix!"=="" (
   set prefix=KB
   echo !kilo!
  )
)


echo !Yotta!!zetta!!exa!!peta!!tera!!giga!!mega!!kilo!

if "%prefix%"=="YB" echo !a:~-24,-21!.!a:~-21!YB (rounded down)
if "%prefix%"=="TB" echo !a:~-12,-9!.!a:~-9,1!TB  (rounded down)
if "%prefix%"=="GB" echo !a:~-9,-6!.!a:~-6,1!GB (rounded down)
if "%prefix%"=="MB" echo !a:~-6,-3!.!a:~-3,1!MB (rounded down)


:: echo %a:~-13,-6%,%a:~-6,-3%,%a:~-3%
 set a=
:: -----------

echo %total%KB
set tempfile1=
set tempfile2=
set tempfile3=
set tempfile4=

それがどのように機能するかを要約すると、最初の一時ファイルasdf1.aのサンプルがあります。これは、chrome.exeだけでなく多くのプロセスをリストしていることがわかります。

chrome.exe                    5572 Console                    1     64,784 K
chrome.exe                    3880 Console                    1    155,376 K
chrome.exe                   14516 Console                    1    106,932 K
chrome.exe                    2524 Console                    1     88,464 K
dllhost.exe                  15996 Console                    1      8,844 K
tasklist.exe                 16232 Console                    1      7,152 K

2番目の一時ファイルは、chrome.exeを除外することで、必要なファイルに近づきます。

asdf2.a

chrome.exe                    5572 Console                    1     64,784 K
chrome.exe                    3880 Console                    1    155,376 K
chrome.exe                   14516 Console                    1    106,932 K
chrome.exe                    2524 Console                    1     88,464 K

asdf3.aがさらに近づく

 64,784 K
155,376 K
106,932 K
 88,464 K

asdf4.xml(.xlsである理由を尋ねないでください。Excelで開くつもりだったかもしれません)

64796
155592
114084
88464

したがって、バッチファイルは合計するプレーンリストを生成しました。

そして明らかにバッチファイルのこの行は合計を行います

for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul

バッチファイルを使用してこれを書き込むのはばかげていました。新しいバージョンのOSまたは新しいバージョンのコマンドでコマンドの出力がわずかに変更されるため、バッチファイルは移植性が低いことがよくあります。 、プログラムが機能しない可能性があります。そして、それらの異なるバージョンが存在するサードパーティのプログラムに依存している場合、それは良くありません。そして、gnuwin32のコマンドの多くは古くなっています。cygwinは、そのコマンドのバージョンでより最新のものになる傾向があります。これは私にとっては問題なく実行されていましたが、今試してみるとエラーが発生しました。

ある時点で、代わりにC#で何かを書くかもしれません。

また、リックが指摘したように、これはプログラムで使用されるDLLを考慮に入れていないことに注意してください。個人的には、実行可能ファイル(または、一部の最新のブラウザーの場合は実行可能ファイルの多くのインスタンス!)によって使用されている量を知ることが有用だと思います。

0
barlop