- PR -

C# 物理メモリおよびスワップファイルの使用状況

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-11-29 15:38
物理メモリやスワップファイルの容量が不足しないか見極めるため、
物理メモリやスワップファイルの使用状況を常時監視したい。
できるだけ「軽い」方法が望ましいです。宜しくお願いします。

具体的には下記の6種類の値を取得したい。
どのクラスのどのプロパティ(あるいはメソッド)から算出すれば良いのでしょうか。
(1)Windowsが使用できる物理メモリの総容量
(2)物理メモリの空き容量
(3)カレントプロセスが占有している物理メモリの容量
(4)現在のスワップファイルの容量(の合計)
(5)カレントプロセスが占有しているスワップファイルの容量(の合計)
(6)現在のスワップファイルの空き容量(の合計)
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-29 17:39
引用:

できるだけ「軽い」方法が望ましいです。宜しくお願いします。



C# を選択している時点で「ものすごく軽い」のとは程遠い世界かと。

引用:

具体的には下記の6種類の値を取得したい。
どのクラスのどのプロパティ(あるいはメソッド)から算出すれば良いのでしょうか。



WMI でほとんど取得できるような気がします。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-11-29 23:40
ご回答ありがとうございます。

すでにWMIを試みましたが、
常時監視目的ではWMIはWQLを経由するため
オーバーヘッドが大き過ぎると感じました。

例えば物理メモリ関連ならProcessクラスやGCクラス等、
直接取得できるクラスのほうが有望そうに見えます。
ただ、Processクラスにしても、さまざまな値があるので、
どう計算して良いかよく理解できていません。
宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-30 06:29
リファレンスにそれぞれのプロパティがどのような値か、書いてあると思うのですが、それをどのように理解しているのでしょう?
_________________
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-30 10:23
引用:

すでにWMIを試みましたが、
常時監視目的ではWMIはWQLを経由するため
オーバーヘッドが大き過ぎると感じました。



WMI でダメなら、いろんな API を呼び出して情報をかき集めることになりますね。

標準クラスライブラリだと、希望する情報を全部取得するのは難しいような気がします<ちゃんと調べてません

最終的に行き着くのは API ですが、この場合、パフォーマンスカウンタや PSAPI 辺りを使うことになると思います。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-11-30 13:57
ご回答ありがとうございます。
私なりに現在の理解度をまとめてみました。
アドバイスを宜しくお願いします。

ポイント
※WMIよりも高速な取得方法があれば、その方法を知りたい。
※正しい値がどこから取得できるか知りたい。
 (考え違いで誤った値を参照していないかも確認したい)

(1)Windowsが使用できる物理メモリの総容量

 Windowsタスクマネージャのパフォーマンスタグで表示される物理メモリの合計を
 取得したいと思っています。
 WMIのWin32_OperatingSystem.TotalVisibleMemorySizeです。

★質問1-1
  WQLは重いので、物理メモリ総容量について、
  もっと軽い取得方法は無いでしょうか?

(2) 物理メモリの空き容量

 WMIのWin32_OperatingSystem.FreePhysicalMemoryです。

★質問2-1
  WQLは重いので、物理メモリの空き容量について、
  もっと軽い取得方法は無いでしょうか?

(3) カレントプロセスが占有している物理メモリの容量

 Windowsタスクマネージャのプロセスタグで表示されるメモリ使用量を
 知りたいと思っています。
 
 ProcessクラスのNonpagedSystemMemorySize+PagedSystemMemorySize
 が算出できそうに思ったのですが、タスクマネージャの値と上記の値とは
 異なっています。

 ★質問3-1
  NonpagedSystemMemorySize+PagedSystemMemorySizeでは駄目なのでしょうか。
  あるいはGC.GetTotalMemory(bool)を参照すべきなのでしょうか?
  あるいは別の値でしょうか?


(4)現在のスワップファイルの容量(の合計)

 WMIのWin32_OperatingSystem.SizeStoredInPagingFilesから物理メモリ合計
 を差し引いた値が設定したスワップファイルの容量と合致するはずですが、
 結果がずれています。

 例
 RAM 1GB実装、スワップファイル最大値=4096KB/最小値=4096KBに設定したマシンで
 タスクマネージャの物理メモリ合計は1047344KBと表示されている。
 さて、SizeStoredInPagingFilesの値を見ると5140752KBになっている。
 1047344(使用可能物理メモリ)を差し引くと4093408KBになる。
 4096x1024(スワップファイル)=4194304KBになるはずである。
 
 ★質問4-1
  Win32_OperatingSystem.SizeStoredInPagingFilesでは駄目なのでしょうか。

★質問4-2
  WQLは重いので、現在のスワップファイルの容量について、
  もっと軽い取得方法は無いでしょうか?

(5)カレントプロセスが占有しているスワップファイルの容量(の合計)

 ★質問5-1
  Processクラスあたりだと思いますが、どのプロパティ値を見ればよいか分かりません。

(6)現在のスワップファイルの空き容量(の合計)

 ★質問6-1
  WMIのWin32_OperatingSystem.FreeSpaceInPagingFilesで正しいでしょうか?

★質問6-2
  WQLは重いので、現在のスワップファイルの空き容量について、
  もっと軽い取得方法は無いでしょうか?

ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-11-30 14:30
WMIの抽出ロジック(WQL)自体を改善することも検討したいと思います。
WQLの改善まで本議題に含めると質問自体の範囲が広がりすぎるので、
WQLによる最適な抽出方法については別議題を立てます。
本議題ではWQLの抽出ロジックの改善以外について回答願います。
宜しくお願いします。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-30 21:59
WMIが何かを知らないで書くのでとてもピントはずれなのかもと思いますが
こんなサンプルは、多少でもお役に立ちますか???

コード:
    Dim myCounterProcessor As System.Diagnostics.PerformanceCounter
    Dim myCounterDiskFree As System.Diagnostics.PerformanceCounter
    Dim myCounterMemory As System.Diagnostics.PerformanceCounter
    Dim myCounterPagingFile As System.Diagnostics.PerformanceCounter

    Dim process As New System.Diagnostics.Process
    Dim prevTime As Date
    Dim prevProcessrTime As TimeSpan

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick


        Dim newTime As Date = Now
        process = process.GetCurrentProcess
        Dim newProcessTime As TimeSpan = process.TotalProcessorTime

        Dim TimeSpan As TimeSpan = newTime.Subtract(prevTime)
        Dim processTimeSpan As TimeSpan = newProcessTime.Subtract(prevProcessrTime)

        If TimeSpan.TotalMilliseconds = 0 Then Exit Sub

        Dim cpu As Single = (processTimeSpan.TotalMilliseconds * 1000 \\\\ TimeSpan.TotalMilliseconds) / 10

        Dim text As String
        text &= "------system--------" & vbCrLf
        text &= "% Processor Time   : " & myCounterProcessor.NextValue().ToString() & vbCrLf
        text &= "Free Megabytes(C:) : " & myCounterDiskFree.NextValue().ToString() & vbCrLf
        text &= "Available Memory    : " & myCounterMemory.NextValue().ToString() & vbCrLf
        text &= "% Paging File Usage : " & myCounterPagingFile.NextValue().ToString() & vbCrLf

        text &= "-------process---------" & vbCrLf
        text &= "% CPU使用率        : " & cpu.ToString() & vbCrLf
        text &= "物理メモリ使用量   : " & (process.WorkingSet \\\\ 1024).ToString() & vbCrLf
        text &= "仮想メモリ使用量   : " & (process.VirtualMemorySize \\\\ 1024).ToString() & vbCrLf

        TextBox1.Text = text


        prevTime = newTime
        prevProcessrTime = newProcessTime

    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myCounterProcessor = New System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total")
        myCounterDiskFree = New System.Diagnostics.PerformanceCounter("LogicalDisk", "Free Megabytes", "C:")
        myCounterMemory = New System.Diagnostics.PerformanceCounter("Memory", "Available KBytes", "")
        myCounterPagingFile = New System.Diagnostics.PerformanceCounter("Paging File", "% Usage", "_Total")

        prevTime = Now()
        process = process.GetCurrentProcess
        prevProcessrTime = process.TotalProcessorTime()

        Timer1.Interval = 1000
        Timer1.Enabled = True

    End Sub




まったくのピントはずれでしたら、なにとぞご容赦を。

スキルアップ/キャリアアップ(JOB@IT)