跟踪MmSt分页池使用情况

我最近注意到的一个趋势是,在尝试KB304101(PoolUsageMaximum)之后,MmSt标签的使用率仍然很高,这是一种趋势。内存管理器将这些池分配用于节对象原型pte。通常只有两种选择:1)升级到64位平台,或2)减小卷的大小。但我们可能想知道哪些映射文件正在使用这个内存。这是如何做到的。从!memusage开始。

5: kd> !memusage

 loading PFN database

loading (100% complete)

Compiling memory usage data (99% Complete).

             Zeroed: 19073 ( 76292 kb)

               Free: 0 ( 0 kb)

            Standby: 1468824 (5875296 kb)

           Modified: 368 ( 1472 kb)

    ModifiedNoWrite: 1927 ( 7708 kb)

       Active/Valid: 605772 (2423088 kb)

         Transition: 0 ( 0 kb)

                Bad: 0 ( 0 kb)

            Unknown: 0 ( 0 kb)

              TOTAL: 2095964 (8383856 kb)

  Building kernel map

  Finished building kernel map

Scanning PFN database - (100% complete)

在此之后,您将看到映射文件及其控制区域的列表。

Usage Summary (in Kb):

Control Valid Standby Dirty Shared Locked PageTables name

…

8c62a638 1108 945868 3064 0 0 0 mapped_file( $Mft )

…

控制区是最左边的地址,它有一个包含PTE总数的段字段。

5: kd> dt 8c62a638 _CONTROL_AREA Segment->TotalNumberOfPtes

nt!_CONTROL_AREA

   +0x000 Segment :

      +0x004 TotalNumberOfPtes : 0x1e8b00

MmSt分配包含这些PTE,所以我们需要做的就是将其乘以PTE的大小,从而得到这个控制区域的MmSt分配的总大小。请注意,此控制区域可能有多个分配,但此数字将反映所有这些分配的总大小。

5: kd> ?? 0x1e8b00 * sizeof(nt!_MMPTE)

unsigned int 0xf45800

所以现在我们知道了单个控制区域或映射文件的MmSt大小(以字节为单位)。如果我们想查看来自的所有映射文件的总数呢!内存使用输出?首先,放置!memusage在文本文件中输出并删除所有头信息。您还需要删除所有尾部信息,包括页面文件和流程摘要。每一行都应该像这样。

8c62a638 1108 945868 3064 0 0 0 mapped_file( $Mft )

8b06ac18 516 0 0 0 0 0 No Name for File

我们希望包含“No Name for File”条目,因为这些条目是有效的映射文件,即使找不到该名称。下一步,除去控制区地址之外的所有内容。您可以使用Excel或任何其他工具来选择和删除文本文件中的列。现在我们有了一个文件,其中只有一列系统上所有的控制区域。以下调试器命令脚本可用于处理此文件。

$$ countptes.txt script

r $t2 = 0;

$$ Replace the memusage.txt file name with your file name.

.foreach /f (ca "memusage.txt") {

    r $t1 = @@c++(((nt!_CONTROL_AREA *)(0x${ca}))->Segment->TotalNumberOfPtes);

    .printf "Control Area %p : %d\n", ${ca}, @$t1;

    r $t2 = @$t2 + @$t1;

}

.printf "Total PTEs : %d\n", @$t2;

.printf "MmSt size : %d bytes\n", (@$t2 * @@c++(sizeof(nt!_MMPTE)));

下面的命令将执行脚本。

5: kd> $$><countptes.txt

这将显示每个控制区域的PTE数量,然后是摘要。

Total PTEs : 62790244

MmSt size : 502321952 bytes

MmSt分配的一个常见高用户是$Mft。缓存管理器将保存这些文件系统元数据文件的MmSt分配,每个PTE最多4个文件。通过首先在命令提示符处使用findstr将这些值与!输出内存使用。

C:\Projects>findstr /c:"$Mft" memusage.txt >mftusage.txt

在用Excel剥离出控制区域地址并运行命令脚本之后,您将只获得$Mft文件的MmSt分配大小。如果这占用了大部分MmSt字节,那么您只能使用本文开头提到的选项。如果其他用户是主要用户,可能还有其他选择,但这可能涉及到减少系统上的一些重负载。

posted on 2020-09-25 08:00  活着的虫子  阅读(419)  评论(0编辑  收藏  举报

导航