none
get-processのPrivateMemorySize64とWorkingSet64の違いについて

    質問

  • いつもお世話になっております。

    現在、powershellでリソース情報の取得を行っております。

    目的はwsuspoolのプロセス"w3wp”のメモリ使用量の推移を調べる事です。

    取得対象のプロパティとして"PrivateMemorySize64"と”WorkingSet64”を指定するつもりなのですがいまいち違いがわかりません。


    私の認識ですと以下の認識です。

    WorkingSet64 = "非共有メモリ”+”共有メモリ”

    PrivateMemorySize64 = "共有メモリ”

    なのですが、取得した値はPrivateMemorySize64の方が大きい値が出力されます。

    伺いたい事は以下2点です。

    ①workingset64とprivatememorysize64の違い

    ②特定のプロセスのメモリ使用量を調査するにあたって最適な方法

     ※諸事情があり、パフォーマンスモニター以外でお願いします。

    以上、よろしくお願い致します。

    取得powershellコード

            while($true){
    
                # 時間を取得
                $time = get-date -Format "yyyy/MM/dd HH:mm:ss";
                
                #取得サーバ名指定            
                [string]$server = "server01";
    
                # Wsus04からプロセス情報を取得
                $wsusp = Get-Process -ComputerName $server;
    
                #ダウンロードパス指定
                $pass = "<download pass>"
    
                # SQLサーバ及びIISプロセスを取得
                $w3wp = $wsusp | Where {($_.ProcessName -eq "w3wp" -and $_.id -eq "576" )};
    
                # メモリ情報取得
                # どっちがタスクマネージャの出力結果と異なる。
                $hoge1 = $w3wp | %{$_. PrivateMemorySize64};
                $hoge2 = $w3wp| %{$_. WorkingSet64};
                
                #GBへの変換
                $gg = [float]1073741824
                #[float]$hgoehoge2 = [float]$hogehoge/[float]$gg
                [float]$hgoehoge1 = [float]$hoge1/[float]$gg
                [float]$hgoehoge2 = [float]$hoge2/[float]$gg
    
                #コンソール出力及びファイル出力
                echo -InputObject $time","$server","$hoge1","$hgoehoge1 
                echo -InputObject $time","$server","$hoge2","$hgoehoge2 
                #Tee-Object -InputObject $time","$server","$hoge1","$hgoehoge2 -Append $pass
                
                # 待機秒指定
                Start-Sleep 1;
            }

    2018年8月6日 2:59

回答

  • PrivateMemorySize64は仮想(物理メモリ(プライベート+共有)+ページファイル))との事ですので

    これ↑は、どこに書いてあったのですか?
    私は「この認識が間違っているのでは?」と言っているのです。
    仮想メモリを使用する限り、ページ ファイルは常に作成されています。
    Task Manager の [詳細] タブで "ページ フォールト" のカラムを表示させ、その値を確認してみてください。
    "ページ フォールト" が発生するという言うことは、ページ ファイルへのアクセスが発生しているということです。

    • 回答としてマーク ろにん365 2018年8月9日 0:26
    2018年8月7日 0:19

すべての返信

  • ①のみですが…

    WorkingSet64:

    ワーキングセット(プロセスが使用している物理メモリ)の容量。
    ワーキングセットの容量は、プライベートワーキングセット(他プロセスと共有できない物理メモリ)と共有ワーキングセット(他プロセスと共有可能な物理メモリ)の容量の合計となる。

    PrivateMemorySize64:

    プロセスが使用している仮想メモリ(物理メモリ+ページファイル)の容量。タスクマネージャでは「コミット サイズ」と表記されている。

    なお、Get-Processで返されるProcessオブジェクトから、プライベートワーキングセットもしくは共有ワーキングセットの容量を取得する方法はないかもしれません。

    これらの値が欲しい場合は、パフォーマンスカウンタを用いる必要があるかと思います。

    例:

    $processName = "w3wp"
    $privateWorkingSet = 
        (Get-Counter "\Process($processName)\Working Set - Private").
        CounterSamples[0].CookedValue
    $workingSet = 
        (Get-Counter "\Process($processName)\Working Set").
        CounterSamples[0].CookedValue
    $sharedWorkingSet = $workingSet - $privateWorkingSet



    2018年8月6日 5:56
    モデレータ

  • --------------------------------------------------
    Process::WorkingSet64 Property
    https://msdn.microsoft.com/en-us/library/system.diagnostics.process.workingset64(v=vs.110).aspx

    The amount of physical memory, in bytes, allocated for the associated process.
    --------------------------------------------------
    Process::PrivateMemorySize64 Property
    https://msdn.microsoft.com/en-us/library/system.diagnostics.process.privatememorysize64(v=vs.110).aspx

    The amount of memory, in bytes, allocated for the associated process that cannot be shared with other processes.
    --------------------------------------------------

    > WorkingSet64 = "非共有メモリ”+”共有メモリ”
    > PrivateMemorySize64 = "共有メモリ”

    この↑認識がおかしい。
    基本的にユーザー モード プロセスがアクセスできるのは、仮想メモリ空間だけ。
    ユーザー モード プロセスの仮想メモリ空間は、基本的に各プロセス毎に独立している。
    (そしてユーザー モード プロセスがどんなに頑張っても、「直接」物理メモリにアクセスすることはできない。)
    ユーザー モード プロセスの実行状況に応じて、仮想メモリの一部が物理メモリ上にマップされて実行される。
    つまり。。。
    "WorkingSet64" は対象プロセスが現在使用している「物理メモリ」の総量を示しているのに対して、"PrivateMemorySize64" は対象プロセスが現在使用している「仮想メモリ」の総量を示している。
    異なるメモリ空間 (「物理メモリ」or「仮想メモリ」) を同列に考えるから理解がおかしくなる。


    "Process Explorer" を使えばわかる。
    --------------------------------------------------
    Process Explorer v16.21
    https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
    --------------------------------------------------

    2018年8月6日 8:15
  • ご回答ありがとうございます。

    1点追加で質問させてください。

    PrivateMemorySize64の(物理メモリ+ページファイル)の”物理メモリ”はプライベート、共有を足した値という認識であっていますか?つまりワーキングセット+ページファイルなのでしょうか。。

    現状、メモリは枯渇していないのでページファイルは作成されていない認識です。よってサーバ側のタスクマネージャから見たプライベートワーキングセットの値とリモートで取得したPrivateMemorySize64が一致していなのは、”物理メモリ”はワーキングセットの値なのだろうと考えています。

    2018年8月6日 10:33
  • ご回答ありがとうございます。

    なんとなくですが、解ってきました。

    WorkingSet64は物理メモリのプライベートと共有を足した値
    PrivateMemorySize64は仮想(物理メモリ(プライベート+共有)+ページファイル))との事ですので

    どちらかと言えば、Workings Setの方が本来見たい値に近い訳ですね。

    ただ、ページファイルが作成されていないのであれば、WorkingSet64とPrivateMemorySize64の値は一致すると思えるのですが、この認識は間違っているのでしょうか。


    2018年8月6日 10:45
  • PrivateMemorySize64は仮想(物理メモリ(プライベート+共有)+ページファイル))との事ですので

    これ↑は、どこに書いてあったのですか?
    私は「この認識が間違っているのでは?」と言っているのです。
    仮想メモリを使用する限り、ページ ファイルは常に作成されています。
    Task Manager の [詳細] タブで "ページ フォールト" のカラムを表示させ、その値を確認してみてください。
    "ページ フォールト" が発生するという言うことは、ページ ファイルへのアクセスが発生しているということです。

    • 回答としてマーク ろにん365 2018年8月9日 0:26
    2018年8月7日 0:19
  • ご回答ありがとうございます。

    私は、ページ=Linuxでいう所のswap、かと思ってたのですが違うんですね。

    そもそも質問をするにあたり、基礎的な知識が欠けている事を認識しました。

    windowsにおいてメモリの用語についてまずは意味を確認しようと思います。

    ご回答頂けて助かりました、ありがとうございました。

    2018年8月8日 5:02