zoukankan      html  css  js  c++  java
  • 跟踪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
    ", ${ca}, @$t1;
    
        r $t2 = @$t2 + @$t1;
    
    }
    
    .printf "Total PTEs : %d
    ", @$t2;
    
    .printf "MmSt size : %d bytes
    ", (@$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字节,那么您只能使用本文开头提到的选项。如果其他用户是主要用户,可能还有其他选择,但这可能涉及到减少系统上的一些重负载。

  • 相关阅读:
    Maintaining Online Redo Log Files
    redo
    SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
    undo
    HDU_1207_汉诺塔2
    POJ_1611_The Suspect
    POJ_1847_Tram
    POJ_2255_Tree Recovery
    Queries for Number of Palindromes(求任意子列的回文数)
    POJ_1163_The triangle
  • 原文地址:https://www.cnblogs.com/yilang/p/13617118.html
Copyright © 2011-2022 走看看