我最近注意到的一个趋势是,在尝试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字节,那么您只能使用本文开头提到的选项。如果其他用户是主要用户,可能还有其他选择,但这可能涉及到减少系统上的一些重负载。