精华内容
下载资源
问答
  • Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管理器(Task Manager), 资源监视器...

     

    Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon)

    微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管理器(Task Manager) 资源监视器(Resource Manager), 性能监视器(Performance Monitor), 还有SysInternals工具,  RamMap, PoolMon用以分析内存问题。
    本文简单介绍上述工具的快速使用方法,如果需要了解深入了解,请参考微软相关链接。

    任务管理器

    Windows 系统可以使用任务管理器进行内存监控,监控可以显示出详细的内存占用的进程。尤其是在性能中检查虚拟内存的使用情况,已提交虚拟内存(Commited Bytes)/虚拟内存上限(Commit Limit)。如果已提交非常接近上限,那么系统会出现性能问题。
    Windows 2008 R2
    示例
    通过查看还可以添加各类内存指标进行检查,请重点检查工作集(进程物理内存占用) 提交大小(非保留的虚拟内存空间)


    Windows 2012
    示例

    资源监视器

    通过任务管理器,可以打开资源监视器 Resource Manager进一步检查内存的使用情况,尤其是每个进程的使用情况。对于各个进程而言,请重点关注"提交(KB)"内存的大小,监控是否有进程消耗过多资源。

    物理内存的使用包含以下几个部分:
    为硬件保留的内存
    正在使用:由进程、驱动程序、操作系统使用的内存
    已修改:内容必须写入磁盘才能用于其它用途的内存
    备用:包含未使用的缓存数据和代码的内存
    可用:不包含任何有价值数据,以及当进程、驱动程序、操作系统需要更多的内存时优先使用的内存

    缓存:当文件被打开时,系统会把文件保存在缓存中,才以便下次迅速读写。Windows 2008 R2及以后,对这个缓存的使用也做了限制:有一部分物理内存不会被缓存使用,保证系统即使在缓存过大的时候,也有可用物理内存,满足程序使用需求。

    性能监视器

    Performance Monitor 性能监视器是Windows 监控,收集系统资源消耗的重要工具。
    监控性能消耗
    通过添加指定的计数器,可以实时检查系统资源消耗的情况

    此外,还可以通过"数据收集搜集"->"用户定义" 手工添加各类计数器,例如Logical Disk, Memory, System, Processor, Process来收集系统各类资源的实时运行情况,同时通过采样间隔来定义收集频率。例如,如果机器有内存泄露问题很久才能复现,可以配置采样间隔为5秒,如果机器很容易出现CPU异常,那么可以配置采样间隔为1秒。

    RamMap, Process Explorer

    有时在任务管理器的监控窗口中查看不到占用内存异常的进程,但物理内存显示已经负载的状态了。
    这种情况一般是系统底层有占用内存的情况,可以通过RamMap工具查看系统内存的占用情况,该工具是微软官方的软件,相关信息及下载地址如下: https://technet.microsoft.com/en-us/sysinternals/ff700229.aspx

    下载后直接运行,就可以查看任务管理器中不显示的系统占用内存的情况。
    详细介绍:
    Introduction to the new Sysinternals tool: RAMMap

    Process Explorer 也可以查看进程的详细资源占用情况,例如打开后也可以查看到进程的各类内存资源使用情况。

    Pool Monitor

    对于WIndows内核而言,其两项核心的内存资源为non paged pool(非页面缓冲池)以及paged pool (页面缓冲池)。操作系统出现内存性能问题,很可能是上述2个资源消耗殆尽。虽然通过上述提到的工具可以查看到资源消耗的情况,但是如果需要定位是系统哪个Tag消耗的资源,需要使用PoolMon来定位。
    poolmon
    使用参考:
    https://technet.microsoft.com/en-us/library/cc737099(v=ws.10).aspx

    检查perfmon 日志来定位究竟是哪个Pool Tag导致的资源消耗殆尽,例如一个案例,检查到IoDn tag导致资源消耗完,通过如下命令定位到是SafeDogFileGuard.sys, 而后通过修正该应用解决。

    关于Tag的介绍,请参考微软官方Blog
    http://blogs.technet.com/b/askperf/archive/2008/04/11/an-introduction-to-pool-tags.aspx

     

    来自:https://help.aliyun.com/knowledge_detail/41079.html

    转载于:https://www.cnblogs.com/time-is-life/p/7401245.html

    展开全文
  • 2016-03-24:Windows内存泄露分析工具 参考资料 100%正确的内存泄漏分析工具 ------ tMemMonitor (TMM) posted o...

    参考资料

    100%正确的内存泄漏分析工具 ------ tMemMonitor (TMM)

    posted on 2016-03-24 16:17 octocat 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/zhouLee/p/5316002.html

    展开全文
  • POOLMON 内存分析工具

    2018-01-29 15:24:57
    WINDOWS 内存泄露分析工具 。经典工具!!!!!!!
  • 内存的使用情况是系统性能中重要的因素之一,频繁的页交换及内存泄露都会影响到系统的性能。...② 每个Windows进程都拥有4G的虚拟地址空间,在多任务环境下,所有进程使用的内存总和可以超过物理内存。③ 进程的一...

    内存的使用情况是系统性能中重要的因素之一,频繁的页交换及内存泄露都会影响到系统的性能。本文主要是描述内存的一些概念、计数器含义,以及可能存在的性能瓶颈。

    一些概念

    ① “页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。
    ② 每个Windows进程都拥有4G的虚拟地址空间,在多任务环境下,所有进程使用的内存总和可以超过物理内存。
    ③ 进程的一部分可能会从物理内存中删除而被暂存在硬盘的文件里(pagefile)。当进程试图访问这些被交换到pagefile里的内存的时候,系统会产 生一个缺页中断(page fault),这时候Windows内存管理器会负责把对应的内存页重新从硬盘调入物理内存。
    ④ 用于描述物理内存中虚拟页面子集的术语称为一个工作集(Working Set),也叫驻留集。一共有三种工作集:进程工作集、系统工作集、会话工作集。(具体概念看后面的计数器)
    ⑤ 非换页池:它是由一些“可保证总是驻留在物理内存中”的虚拟地址范围构成的,由于这些地址范围总是驻留在内存中,因此任何时候都可以访问它们,而不会招致页面错误。
    ⑥ 换页池:系统空间中的一段虚拟内存区域,它可以被换入和换出系统。这两种内存池都位于系统地址空间部分,并且被映射到每个进程的虚拟地址空间中。
    ⑦ 共享内存:对于多个进程可见的内存,或者出现在多个进程虚拟地址空间中的内存。例如:如果两个进程使用了同样的DLL,那么只需将引用该DLL的代码页面加载到物理内存一次,然后所有映射了该DLL的进程之间共享这些页面。
    ⑧ MDL(Memory Descrīptor List)是一个结构体,用于描述一片内存区域中的所有物理内存页。

    可能存在的性能问题

    1、Memory\\Page Reads/sec过高,持续大于5。
      过多的页交换要使用大量的硬盘空间,很容易将导致将页交换内存不足与导致页交换的磁盘瓶径混淆。这就需要我们在研究内存不足不太明显的页交换的原因时,必须跟踪如下的磁盘使用情况计数器和内存计数器:Physical Disk\\ % Disk Time、Physical Disk\\ Avg.Disk Queue Length、Memory\\Page Reads/sec
      ①如果Memory\\Page Reads/sec比较低,但Physical Disk\\% Disk Time and Physical Disk\\Avg. Disk Queue Length计数器很高,表明磁盘有瓶颈。
      ②如果随着Physical Disk\\Avg. Disk Queue Length的增加,而Memory\Page Reads/sec并没有减少,表明有内存的瓶颈。

    2、内存泄露
      如果怀疑内存泄露,监视 Memory\\ Available Bytes 和 Memory\\ Committed Bytes,以观察内存行为,并监视可能存在泄露内存的进程的 Process\\Private Bytes、Process\\Working Set和Process\\Handle Count(Handle泄漏)。
      如果怀疑是内核模式进程导致了泄露,则还应该监视 Memory\\Pool Paged Bytes、Process\\ Pool Paged Bytes。(Memory\\Pool Paged Bytes与Process\\ Pool Nonpaged Bytes,有什么不同,期待告知)。
      可以通过PoolMon工具详细查看非换页池和换页池的详细使用情况。
      备注:这里只是随便提一下。
    各计数器理解及描述

    1、Process\\Working Set
    含义:
    进程工作集,是虚拟地址空间在物理内存中的那部分。包含了一个进程内的各个线程引用过的页面,即:Task Manager中的Mem Usage。
    分析:
    由于每个进程工作集中包含了共享页面,所以Process\\Working Set(_Total)值会大于实际的总进程内存使用量。

    2、Process\\Private Bytes
    含义:
    分配的私有虚拟内存总数,即私有的、已提交的虚拟内存使用量。即:Task Manager中的VM Size。
    分析:
    内存泄露时表现的现象是私有虚拟内存的递增,而不是工作集大小的递增。在某个点上,内存管理器会阻止一个进程继续增加物理内存大小,但它可以继续增大它的虚拟内存大小。

    3、Memory\\Available MBytes (Available Bytes、Available KBytes)
    含义:
    Available MBytes 是指以 MB 表示的可用物理内存量,此内存能立刻分配给一个进程或系统使用。它是空闲列表、零列表和备用列表的大小总和。
    分析:
    至少要有10% 的物理内存值,最低限度是4 MB。
    页面状态:
    备用:页面原先属于某个工作集,但现在被去除了。该页面自从最后一次被写到磁盘后一直未被修改过,PTE(Page Table Entry)仍然指向该物理页面,不过已标记为无效的和正在转移中。
    空闲:页面是空闲的,但它包含了未特别指明的脏数据。(需要用零初始化,否则不能交给用户进程)
    零化:页面是空闲的,并且已经被零页面线程初始化为零了。

    4、Memory\\Page Faults/sec
    含义:
    Page Faults/sec 是每秒钟出错页面的平均数量。由于每个错误操作中只有一个页面出错,计算单位为每秒出错页面数量,因此这也等于页面错误操作的数量。这个计数器包括硬错误(那些需要磁盘访问的)和软错误(在物理内存的其他地方找到的错误页)。许多处理器可以在有大量软错误的情况下继续操作。但是,硬错误可以导致明显的拖延,因为需要访问磁盘。

    5、Memory\\Page Reads/sec
    含义:
    Page Reads/sec 是读取磁盘以解析硬页面错误的次数。它显示读取操作的数量,它并不考虑每个操作的页面数量。当一个进程引用一个虚拟内存的页面,而此虚拟内存位于工作集以 外或物理内存的其他位置,并且此页面必须从磁盘检索时,就会发生硬页面错误。此计数器是引起系统范围内延迟的主要指示器。它包含读取操作以满足文件系统缓 存(通常由应用程序请求)和非缓存映射内存文件的错误。比较内存的值\\Pages Reads/sec 与内存的值\\Pages Input/sec 来决定每个操作取读的平均页面数量。
    通俗含义:
    页的硬故障,Page/sec的子集,是为了解决硬错误,从硬盘读取的次数。
    分析:
    阈值为>5,越低越好。大数值表示磁盘读而不是缓存读。持续大于5的值,表明内存的读请求发生了较多的缺页中断(page fault)。
    说明进程的Working Set已经不够,使用硬盘来虚拟内存。此处为读得次数,不关心读取得页数,比较大的值表明内存出现了瓶颈。

    6、Memory\\Page Writes/sec
    含义:
    Page Writes/sec 是指为了释放物理内存空间而将页面写入磁盘的速度。只有页面还在物理内存中时所做的更改才会写入磁盘,因此这些页面可能只保留数据而不保留代码。这个计数器显示写入操作,不计数每个操作中写入的页数。

    7、Memory\\Pages Input/sec
    含义:
    Pages Input/sec 是以解析硬页面错误从磁盘读取的页数。当一个进程引用一个虚拟内存的页面,而此虚拟内存位于工作集以外或物理内存的其他位置,并且此页面必须从磁盘检索 时,就会发生硬页面错误。当夜面发生错误时,系统尝试将多个连续页面读入内存以充分利用取读操作的优点。请比较 Memory\\Pages Input/sec 的值和 Memory\\Page Reads/sec 的值以便决定每个取读操作读入内存的平均页面数量。

    8、Memory\\Pages Output/sec
    含义:
    Pages Output/sec 是指为了释放物理内存空间而将页面写入磁盘的页数。只有在物理内存中更改时页面才会写回到磁盘上,因此页面可能只保留数据而不是代码。高速的页面输出可能 表示内存不足。当物理内存不足时,Windows 会将页面写回到磁盘以便释放空间。

    9、Memory\\Page/sec
    含义:
    Pages/sec 是指为解决硬页错误从磁盘读取或写入磁盘的页数。这个计数器是可以显示导致系统范围延缓类型错误的主要指示器。它是 Memory\\Pages Input/sec 和 Memory\\Pages Output/sec 的总和。是用页数计算的,以便在不用做转换的情况下就可以同其他页计数如: Memory\\Page Faults/sec 做比较,这个值包括为满足错误而在文件系统缓存(通常由应用程序请求)的非缓存映射内存文件中检索的页。
    分析:
    一 般如果pages/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引 起的硬盘数据流量) 。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。

    10、Memory\\ % Committed Bytes In Use
    含义:
    %Committed Bytes In Use 是 Memory\\Committed Bytes 与 Memory\\Commit Limit 之间的比值。Committed memory是已在页面文件中保留空间的在用物理内存。Commit Limit 是由页面文件的大小而决定的。如果扩大了页面文件,该比例就会减小。

    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

    11、Memory\\ Committed Bytes
    含义:
    Committed Bytes 是指已被提交的(不是保留的)虚拟内存字节数。此数并不一定代表页面文件的使用量,因为它包含了物理内存中从未被换出过的私有提交页面。当然,如果一个进程完全是非驻留的,则它代表所使用的页面文件数量。
    对应Task Manager的PF使用 (Current Commit Charge) 。页面文件的使用量参见计数器:Paging File\\%Usage。
    原文:
    Number of bytes of virtual (not reserved) memory that has been committed. This number doesn’t necessarily represent page file usage because it includes private committed pages in physical memory that have never been paged out. Rather, it represents the amount of page file space that would be used if the process was completely made nonresident.
    分析:
    NT的内存分配采用了两步走的方法,首先,在虚地址空间上保留一段空间,这时操作系统并没有分配物理内存,只是保留了一段地址。然后,再提交这段空间,这时操作系统才会分配物理内存。
    Windows的地址空间有三种状态。一种是COMMITED,表明该地址空间已和一块内存相联系;一种是RESERVED,表明该地址空间虽未与一块内存相联系但今后可能会用到,需要保留;一种是FREE,表明该地址空间与内存没有联系。

    12、Memory\\ Commit Limit
    含义:
    Commit Limit 是指无需扩展页面文件就可以提交的虚拟内存字节数。
    原文:
    Number of bytes of virtual memory that can be committed without having to extend the paging files; if the paging files can be extended, this limit is not hard.  
    To use a reserved region of address space, you must allocate physical storage and then map this storage to the reserved region. This process is called committing physical storage. Physical storage is always committed in pages.
    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

    13、Memory\\Pool Nonpaged Allocs
    含义:
    Pool Nonpaged Allocs 指在换换页池中分派空间的调用数。它是用衡量分配空间的调用数来计数的,而不管在每个调用中分派的空间数是多少。
    原文:
    Shows the number of calls to allocate space in the nonpaged pool. This counter is measured in numbers of calls to allocate space, regardless of the amount of space allocated in each call.
    分析:
    考察其自系统启动以来的增长了10%以上,如果是,表明有潜在的严重瓶颈。
    需要观察Server\\Pool Nonpaged Failures,非页面池分配失败的次数。非零表示计算机的物理内存太小。

    14、Memory\\Pool Nonpaged Bytes
    含义:
    Pool Nonpaged Bytes 指在非换页池中的字节数,非换页池是指系统内存(操作系统使用的物理内存)中可供对象(指那些在不处于使用时不可以写入磁盘上而且只要分派过就必须保留在物理内存中的对象)使用的一个区域。
    疑问:Memory\\Pool Nonpaged Bytes 的计数方式与 Process\\Pool Nonpaged Bytes 的计数方式有什么不同。
    通俗含义:
    非换页池中的当前大小,即Task Manager中的Kernel Memory→NonPaged。

    15、Memory\\Pool Paged Allocs
    含义:
    Pool Paged Allocs 指在换页池中分派空间的调用次数。它是用计算分配空间的调用次数来计算的,而不管在每个调用中分派的空间数是什么。
    原文:
    Shows the number of calls to allocate space in the paged pool. This counter is measured in numbers of calls to allocate space, regardless of the amount of space allocated in each call.

    16、Memory\\Pool Paged Bytes
    含义:
    Pool Paged Bytes 指在换页池中的字节数,换页池是系统内存(操作系统使用的物理内存)中可供对象(在不处于使用时可以写入磁盘的)使用的一个区域。
    疑问:Memory\\Pool Paged Bytes 的计数方式与 Process\\Pool Paged Bytes 的方式有什么不同。
    通俗含义:
    换页池的当前虚拟大小,即Task Manager中的Kernel Memory→Paged Virtual。
    换页池的当前物理(驻留)大小参见计数器Memory\\Poll Paged Resident Bytes。
    分析:
    也需要观察Server\\Pool Paged Failures,页面池分配失败的次数。非零表示计算机的物理内存或页面文件太小。
    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

    17、Memory\\ Cache Bytes
    含义:
    系统工作集的总大小,其包括以下代码或数据驻留在内存中的那一部分:系统缓存、换页内存池、可换页的系统代码(Ntoskrnl.exe和驱动程序),以及系统映射的视图。
    分析:
    从字面意思上看,仅仅是指系统缓存,其实不然。
    Cache Bytes Memory\\System Cache Resident Bytes、Memory\\System Driver Resident Bytes、Memory\\System Code Resident Bytes 和 Memory\\Pool Paged Resident Bytes的总和。

    18、Memory\\Cache Bytes Peak
    含义:
    Cache Bytes Peak 是系统启动后文件系统缓存使用的最大字节数量。这可能比当前的缓存量要大。这个计数器只显示上一次观察到的值;它不是一个平均值。
    原文:
    Shows the maximum number of bytes used by the file system cache since the system was last started. This might be larger than the current size of the cache.

    19、Memory\\Cache Faults/sec
    含义:
    Cache Faults/sec 指在文件系统缓存中找不到要寻找的页而需要从内存(软错误)的其他地方或从磁盘(硬错误)的其他上检索时出现的错误的速度。文件系统缓存活动是大部分应用程序 IP 操作的可靠指示
    器。这个计数器显示错误的次数而不管每次操作中的出错的页数。
    原文:
    Shows the rate, in incidents per second, at which faults occured when a page that was sought in the file system cache was not found and was be retrieved either from elsewhere in memory (a soft fault) or from disk (a hard fault). This counter shows the total number of faults, without regard for the number of pages faulted in each operation.
    分析:
    从文件系统缓存中查找数据,未命中的次数。这个值应该尽可能的低,较大的值表明内存出现短缺,缓存命中很低。
    同时需要观察Cache\MDL Read Hits%,MDL Read Hits 是指 Memory Descrīptor List 向文件系统缓存发出的请求命中缓存的百分比,例如:不需要磁盘访问即可为在缓存中的页面提供内存访问。
    值越大(接近100%),表明文件系统缓存效果越好。

    20、Memory\\Demand Zero Faults/sec
    含义:
    Demand Zero Faults/sec 通过零化页面来弥补分页错误的平均速度。这个计数器显示最近两个保留取样值的差,再除以取样间隔。零化页面是指先清空以前的资料,再将页面用0来填满,这 是Windows NT的安全性功能,这样可以防止以前的资料外泄。这个计数器显示的是错误数量,而不是重新获取的页面数量。
    原文:
    Shows the average rate, in incidents per second, at which page faults required a zeroed page to satisfy the fault. This counter displays the difference between the values observed in the last two samples, divided by the duration of the sample interval. Zeroed pages (pages emptied of previously stored data and filled with zeroes) prevent processes from seeing data stored by earlier processes that used the same memory space. This counter displays the number of faults, without regard to the number of pages retrieved to satisfy the fault.

    21、Memory\\Free System Page Table Entries
    含义:
    Free System Page Table Entries 指系统没有使用的页表项目。这个计数值仅显示上一次的值,而不是一个平均值。
    原文:
    Shows the number of page table entries not in use by the system.

    22、Memory\\Pool Paged Resident Bytes
    含义:
    换页池所使用的物理内存,即Task Manager中的Kernel Memory→Paged Physical。

    23、Memory\\System Cache Resident Bytes
    含义:
    System Cache Resident Bytes 是文件系统缓存可换页的操作系统代码的字节大小。此值只包括当前的物理页面,而不包括当前未使用的虚拟内存页面。它不等于“任务管理器”上显示的系统缓存值。因此,此值会比文件系统缓存使用的实际虚拟内存要小。此值是 Memory\\System Code Resident Bytes 的组件,它代表当前在物理内存里的所有可换页的操作系统代码。
    原文:
    Shows the size, in bytes, of pageable operating system code in the file system cache. This value includes only current physical pages and does not include any virtual memory pages that are not currently resident. It does not equal the System Cache value shown in Task Manager. As a result, this value may be smaller than the actual amount of virtual memory in use by the file system cache. This value is a component of System Code Resident Bytes that represents all pageable operating system code that is currently in physical memory.
    通俗含义:
    系统缓存所使用的物理内存。

    24、Memory\\System Code Resident Bytes
    含义:
    System Code Resident Bytes 是操作系统代码当前在物理内存的字节大小,此物理内存在未使用时可写入磁盘。此值是 Memory\\System Code Total Bytes 的组件,它还包括磁盘上的操作系统代码。Memory\\System Code Resident Bytes (和 Memory\\System Code Total Bytes) 不包括必须留在物理内存的代码,并且不能写入磁盘。
    原文:
    Shows the size, in bytes, of operating system code currently in physical memory that can be written to disk when not in use. This value is a component of System Code Total Bytes, which also includes operating system code on disk. System Code Resident Bytes (and System Code Total Bytes) does not include code that must remain in physical memory.
    通俗含义:
    Ntoskrnl.exe中可换页代码所使用的物理内存。

    25、Memory\\System Code Total Bytes
    含义:
    System Code Total Bytes 指当前在虚拟内存中的可换页的操作系统代码的字节数。这是用来衡量在不使用时可以写入到磁盘上的操作系统使用的物理内存的数量。这个值是通过将在 Ntoskrnl.exe, Hal.dll 、启动驱动器和用 Ntldr/osloader 加载的文件系统中的字节的数相加得出的。这个计数器不包括必须保留在物理内存中并不能写入到磁盘上的代码。
    原文:
    Shows the size, in bytes, of pageable operating system code currently in virtual memory. It is a measure of the amount of physical memory being used by the operating system that can be written to disk when not in use. This value is calculated by adding the bytes in Ntoskrnl.exe, Hal.dll, the boot drivers, and file systems loaded by Ntldr/osloader. This counter does not include code that must remain in physical memory.

    26、Memory\\System Driver Resident Bytes
    含义:
    System Driver Resident Bytes 指设备驱动程序当前使用的可换页的物理内存的字节数。它是驱动程序的工作集(物理内存区域)。这个值为 Memory\\System Driver Total Bytes (也包括可以写入磁盘的驱动程序
    内存)的组件。无论 System Driver Resident Bytes 还是 System Driver Total Bytes都包括不能写入磁盘的物理内存。
    原文:
    Shows the size, in bytes, of pageable physical memory being used by device drivers. The counter is the working set (physical memory area) of the drivers. This value is a component of System Driver Total Bytes, which also includes driver memory that has been written to disk. Neither System Driver Resident Bytes nor System Driver Total Bytes includes memory that cannot be written to disk.
    通俗含义:
    可换页的设备驱动程序代码所使用的物理内存。

    27、Memory\\System Driver Total Bytes
    含义:
    System Driver Total Bytes 指设备驱动程序当前使用的可换页的虚拟内存的字节数。当不使用时可换页内存可以写入磁盘。它包括物理内存(Memory\\System Driver Resident Bytes)和代码以及写到磁盘中的数据。它是Memory\\System Code Total Bytes 的一个组件。
    原文:
    Shows the size, in bytes, of pageable virtual memory currently being used by device drivers. Pageable memory can be written to disk when it is not being used. It includes physical memory (System Driver Resident Bytes) and code and data written to disk. This counter is a component of System Code Total Bytes.

    28、Memory\\Transition Faults/sec
    含义:
    Transition Faults/sec是在没有额外磁盘运行的情况下,通过恢复页面来解决页面错误的速度。页面错误包括页面正被另一个共享此页面的进程使用,或在被修改的页面列表上或待机列表上,或在发生页面错误时正被写入磁盘。该技术器也等于错误的页面数量,因为每一操作只有一个页面错误。
    原文:
    Shows the rate, in incidents per second, at which page faults were resolved by recovering pages without additional disk activity, including pages that were being used by another process sharing the page, or that were on the modified page list or the standby list, or that were being written to disk at the time of the page fault. This counter is also equal to the number of pages faulted because only one page is faulted in each operation.
    分析:
    如果这个指标持续的居高不下说明内存存在瓶颈,应该考虑增加内存。

    29、Memory\\Write Copies/sec
    含义:
    Write Copies/sec 是指通过从物理内存中的其他地方复制页面来满足写入尝试而引起的页面错误速度。由于页面只在被写入时才被复制,这是一个实用的共享数据方式;另外该页面是共享的。这个计数器显示的是复制次数,不考虑每次操作时中被复制的页面数。
    原文:
    Shows the rate, in incidents per second, at which page faults were caused by attempts to write that were satisfied by copying the page from elsewhere in physical memory. This is an economical way of sharing data since pages are only copied when they are written to; otherwise, the page is shared. This counter shows the number of copies, without regard to the number of pages copied in each operation.
    分析:
    就是写时复制错误的比率。写时复制页面保护机制是一种优化,内存管理器利用它可以节约内存。
    例 如:两个进程正在共享三个页面,每个页面都被标记为写时复制,当其中一个进程的任一线程对一个页面执行写操作,则会产生一个内存管理错误。内存管理器不会 将该错误报告为访问违例,而是在物理内存中分配一个新的读/写页面,并将原始页面中的内容拷贝到新的页面中,同时更新该进程对应的页面映射信息,使之指向 新的页面位置,然后解除异常,从而继续进行刚才的写指令。写操作成功,新拷贝的页面现在对于执行写操作的进程来说是私有的,对于其他进程是不可见的。

    转载于:https://www.cnblogs.com/yourber/archive/2013/06/04/3117062.html

    展开全文
  • 介绍了一种使用Volatility从内存镜像中分析某即时通讯软件Windows端数据库密钥的方法。

    #本文仅供交流学习使用,切勿用于非法用途#

    目录

    1. 前言

    2. 准备工作

    3. 内存镜像解析

    4. 踩过的坑和感悟

    5. 技术要点总结


    前言

    某年月日,我司在项目中遇到了一个不太常见的需求:根据内存镜像解析电脑中的某即时通讯软件(即“某信”)的聊天信息。在与供应商进行沟通以后我们了解到,市面上国内外几款比较流行的取证软件虽然支持针对某信Windows端的解析,但是大多还是需要用户扫描二维码进行登录。对内存的解析只有一家产品支持,实际试用后也遗憾地失败了。事后分析可能是与操作系统及某信软件的版本有关。

    然后我们又在网上进行了一系列的搜索。虽然确实查到许多资料描述如何解析某信数据库,但是其中对内存镜像进行解析的内容几乎为零。我们只能摸着前人的石头过河。所幸走了不少弯路以后还算有了一个比较满意的结果,这才有了这篇小文。

    *对于Volatility内存分析工具有一定认识的朋友可以直接查看结尾的技术总结。

    准备工作

    某信登录后,使用FTK Imager制作笔记本电脑的内存镜像。

    1. 登录某信

    在这里插入图片描述

    2.使用FTK Imager制作内存镜像

    在这里插入图片描述
    在这里插入图片描述

    在这里有几个选项,是否需要保存pagefile(“Include pagefile”)以及是否需要制作AD1格式的镜像(“Create AD1 file”)。经过测试在解析密钥时并不需要这两个功能,所以为了节约时间我们这里就不用勾选了,毕竟pagefile的文件大小还是很惊人的。
    在这里插入图片描述

    这一步大概花费5到10分钟,根据内存的大小不同。

    3. 导出待解密的数据库文件

    拿到内存镜像后不要就觉得万事大吉了。密钥密钥光有钥匙没有门我们不是一顿白忙活?
    请记得制作笔记本电脑镜像并从中导出某信数据库文件。具体步骤这里就略过了。
    某信数据库的默认地址为“C:\Users[Windows User Name]\Documents\WeChat Files[WeChat account]”。
    在这里插入图片描述

    内存镜像解析

    铺垫了这么久终于可以上主菜了。这里解析内存镜像我们还是用Volatility。
    Volatility是一款开源内存取证框架,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况以及系统的运行状态。
    软件官网:https://www.volatilityfoundation.org
    Github主页:https://github.com/volatilityfoundation/volatility

    1. 分析内存镜像并判断适用的配置文件(profile)

    volatility.exe –f memdump.mem imageinfo
    

    在这里插入图片描述

    Volatility需要从用户配置文件中读取内核的相关信息,通过这些信息来定位内存中的关键信息并对其进行解析。因此我们需要获取用户配置文件,且这些配置文件需与你要分析的内核版本相匹配,其中包含了内核数据结构以及调试符号。

    这里个人将用户配置文件理解成一张地图,而内存镜像就是对应的实际地形。由于不同的系统版本对应不同的地图,只有使用相匹配的地图Volatility才能带我们找到想要的东西。
    这一步会花费几个小时起步的漫长时间。所以个人建议先对笔记本硬盘镜像进行分析,然后根据操作系统的信息判断适用的配置文件会比较快。

    2. 寻找某信进程的pid

    volatility.exe –f memdump.mem --profile=Win7SP1x64 pslist >pslist.txt
    #其中Win7SP1x64为配置文件名称,使用时请根据上一步结果/具体情况进行修改。
    

    在这里插入图片描述在这里插入图片描述

    这里我们使用命令pslist将内存镜像中所有进程列表导出到文档文件pslist.txt中,然后查找WeChat.exe即可得到该进程pid为1072.

    需要注意的是在实际分析过程中这一步可能得到两个或者更多的pid。我们可以通过后面的分析或者根据是否存在Exit时间排除已经退出的进程。

    3. 寻找WeChatWin.dll的基址

    volatility.exe –f memdump.mem --profile= Win7SP1x64 ldrmodules –p 1072 >dlllist.txt
    

    在这里插入图片描述
    在这里插入图片描述

    使用插件ldrmodules将pid为1072的进程所有关联的dll文件导出并查找WeChatWin.dll的基址。此处为 “0x53210000”
    这里我们也可以使用Volatility自带的命令dlllist来查询关联的dll文件。但是插件ldrmodules可以关联部分隐藏的dll,功能更为强大。实际使用过程中我们发现部分电脑ldrmodules可以找到,而部分电脑ldrmodules无法找到而dlllist可以找到。所以个人建议两个命令都试下。

    4. 查询某信数据库密钥

    volatility.exe –f memdump.mem --profile= Win7SP1x64 volshell
    cc(name=”WeChat.exe”)
    dd(base address of WeChatWin.dll + fixed offset, length=4) #The result is the address of decryption key
    db(address of decryption key, length=32) #The result is the decryption key
    

    在这里插入图片描述

    Volshell插件用来进入Volatility的shell,在该shell中可以使用cc命令来切换当前进程,使用dd和db命令分别打印dwords和具体bytes内容到屏幕上。
    这里我们使用volshell插件进入shell以后使用cc命令切换到WeChat.exe进程。由于数据库密钥地址为32位的dwords,所以这里我们使用dd命令将该地址打印到屏幕上。值得一提的是这里我们使用“0x17734a8”来获取密钥地址,该常数根据某信版本不同可能有所变化。在这里测试所使用的版本为某信2.9.5.41。该常数的获取需要一定的逆向工程知识,网上也有很多现成的资料,在这里就不赘述了。(参考:https://blog.csdn.net/qq_38474570/article/details/96606530)最后在获得密钥地址为“0x07bc0a70”后,我们使用db命令将32位的密钥打印到屏幕上。

    5. 使用获得的密钥即可解密数据库并查看具体内容。

    某信Windows端使用sqlcipher进行加密,配置环境后可以使用SQLite进行解密。
    那么关于某信数据库的解析到这里也就圆满结束了,剩下的工作就是将数据导出成Excel等易于查看的格式。
    在这里插入图片描述

    踩过的坑和感悟

    首先是第一个大坑,不知道是不是我搜索的姿势有误,但是感觉内存取证方面的资料明显没有计算机取证/移动端取证那样丰富,仅有的资料也有些晦涩难懂。不知是否因为内存取证门槛相对较高?市场上能找到的也就Volatility一家,官网最近的更新时间还是2016年。虽然Github上能看到他们家在推新版本(Volatility3,Github主页: https://github.com/volatilityfoundation/volatility3),但是插件的开发好像还没有跟上。我们一度由于陈旧的版本缺少支持最新Windows系统的profile而无法进行。

    然后在实际项目中也遇到了由于不同系统版本和某信版本导致的众多小问题。例如在查询某信进程pid时碰到多个进程,需要仔细分辨那些是之前已经结束的进程而那个才是当前运行的。在查询WeChatWin.dll时也有ldrmodules插件无法查询到而Volatility自带的命令dlllist反而可以找到的情况。在最后查询数据库密钥时也碰到因为某信版本不同而需要回头对硬盘镜像中的某信程序进行逆向分析来判断所使用的常数。只有掌握全面的技能才能兵来将挡水来土掩。

    絮絮叨叨说了这么多,其实最后真正有用的可能也就7行命令和1个常数。但是为了得到这些,我们却花了将近一周的时间。好在最后结果还是相对圆满的,达到的客户的期望。之前对内存取证的认识一直停留在做题的阶段。打比赛也好能力验证也罢,对这方面的内容似乎都只是浅尝辄止。在平时工作中就更少碰到这方面的需求了。通过这次小小的研究也让我对内存取证和某信解析有了更加深入的认识。

    之前也一直听说某信Windows端的数据库密钥只有在登陆时才能从服务器端或者从内存中获取,但是没有碰到过实践的机会。直到这次项目的实际需求对我们提出挑战。可见很多知识平时一直只停留在知其然的地方是远远不够的。只有平时多做积累,掌握各种工具,在实际遇到挑战时才能有足够的能力解决问题。

    技术要点总结

    1. 分析内存镜像并判断适用的配置文件(profile)
    volatility.exe –f memdump.mem imageinfo
    
    1. 寻找某信进程的pid
    volatility.exe –f memdump.mem --profile=Win7SP1x64 pslist >pslist.txt
    
    1. 寻找WeChatWin.dll的基址
    volatility.exe –f memdump.mem --profile= Win7SP1x64 ldrmodules –p pid of WeChat.exe >dlllist.txt
    
    1. 查询某信数据库密钥
    volatility.exe –f memdump.mem --profile= Win7SP1x64 volshell
    cc(name=”WeChat.exe”)
    
    dd(base address of WeChatWin.dll + fixed offset, length=4) 
    #返回结果为数据库密钥地址
    #常数fixed offset根据某信版本不同可能有所变化。在这里测试所使用的版本为某信2.9.5.41,该常数为“0x17734a8”。
    
    db(address of decryption key, length=32) 
    #返回结果为数据库密钥
    
    展开全文
  • 转载自公众号:取证者联盟 ...在与供应商进行沟通以后我们了解到,市面上国内外几款比较流行的取证软件虽然支持针对某信Windows端的解析,但是大多还是需要用户扫描二维码进行登录。对内存的解析...
  • MAT内存分析工具,支持版本windows64位。 最近项目遇到oom问题,上传一下查询oom的心酸路程的工具。
  • 引言 Unity是商业引擎,除了购买源代码...针对内存分析,还有一个官方工具MemoryProfiler。本文主要针对这两个工具,做一下简单介绍加实际分析。 编辑器Profiler Profiler窗口在Windows/Profiler菜单下可以打开,...
  • Java内存泄露分析和解决方案及Windows自带查看工具
  • WinCE6.0内存分析工具

    2019-09-12 02:30:54
    《Memory Usage Tool for Windows CE 6.x》中介绍了一个用于查看和分析WinCE6.0内存状态的工具,具体内容参见原文。 该工具主要有两部分组成,一个是运行于设备端的命令行程序(DevHealth60.exe),另一个是运行于PC...
  • 内存分析工具 2. 参考链接 https://cloud.tencent.com/developer/article/1668605 https://blog.csdn.net/Jin_Kwok/article/details/80326088 3. 官网地址 http://www.eclipse.org/mat/downloads.php 3.1. windows ...
  • Windows 内存泄露分析

    2018-01-25 09:41:28
    转自:... 1.准备工具:windbg 2.准备环境:需要设置windbg符号路径 ...内存泄露分析demo [cpp] view plain copy int _tmain(intargc, _TCHAR* 
  • cmd打开命令行,cd到\ android-sdk-windows\tools所在目录,并输入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof为原始文件,yyyyy.hprof为转换过后的文件,.hprof文件处理完毕,可以用来分析内存泄露...
  • JAVA内存泄露分析和解决方案及WINDOWS自带查看工具Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,...
  • 使用RAMMAP的工具检查,发现这些内存被Metafile占用了,经查阅Metafile是系统缓存的一部分同时也包含了NTFS的数据。。此问题可能是由于Server 2008中为保证服务器性能不限制系统缓存,服务器系统长时间执行I/O,系统...
  • 下载到windows下: sz  tomcat6666.hprof 步骤3:下载MAT http://www.eclipse.org/mat/downloads.php 不需要单独安装eclipse,解压后点击如图exe文件 打开刚才的文件 tomcat6666.hprof 效果图如下: 备注: linux下...
  • 一|介绍 Volatility是一个开源的Windows,Linux,Mac,Android的内存取证分析工具,由python编写成,命令行操作,支持各种操作系统。本次讨论主要基于Linux下Volatility的分析。二|特点 Volatility有丰富的插件...
  • 前言经常使用适当的虚拟机监控和内存分析工具可以加快我们分析数据、定位解决问题的速度。目前市场上有许多强大的Java性能监控工具,但是在JDK的bin目录中其实包含了许多小巧的分析工具,并且这些工具也非常稳定,能...
  • Committed: 进程向OS宣称要使用的内存大小(在虚拟内存进行了分配),基本上都不等于进程实际使用的物理内存大小。一是其中统计了进程所链接的所有动态库的空间,比如标准C库,而实际上OS在内存中只加载一份C库的代码...
  • 其他功能:分析文件MD5,一键隐藏窗口(alt+win+z),设置进程优先级,托盘管理,增删用户,内存清理,窗口重置,等等无聊的功能都写里面了... 学习了小半年的编程了 写出来还是有点成就感的 涉及的知识【MFC编程,Windows核心...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,098
精华内容 439
关键字:

windows内存分析工具