怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

windows系统内存参数分析

现代操作系统普遍采用了虚拟机内存机制以扩展用户或程序可使用的最大内存值,但是不同的系统有不同的内存管理机制,因此适用于某一系统的术语在另一系统上可能并不是同一概念。本文旨在对于windows系统中内存相关的参数进行解析,使得使用者可以对于windows的内存相关参数有一个清晰的理解。

在windows系统中,内存的相关数据可以通过以下四种方法查看:

(1)任务管理器;

(2)资源监视器;

(3)systeminfo;

(4)procexp;

下面分别介绍在这四种方法中看到的内存各项参数的具体含义:

任务管理器内存参数

一般对windows系统当前运行情况进行查看时,任务管理器都是第一选择。在任务管理器的性能界面上,可以选择内存进行系统内存信息的查看。

自上而下对相关参数进行介绍:

(1)内存:16GB

实际的物理内存,在真实物理机中,就是主板上内存插槽中全部内存条的总容量,在虚拟机中,就是创建虚拟机时配置的内存大小。在系统运行过程中,该参数一般不会发生改变。但是虚拟机具有动态调整内存的功能,因此实际上虚拟机中的该参数是会发生变化的。

(2)使用中(已压缩):7.5GB(470MB)

当前正在被操作系统和正在运行的程序使用的物理内存。包括已分配但是未必正在活跃使用的内存。
出现的”已压缩”字样,它指的是操作系统对内存页进行了压缩。这是一种操作系统级别的优化技术,旨在减少内存使用量并提高系统性能。
内存压缩通常在系统资源紧张时才会被启用,并且操作系统会根据系统负载和内存需求来自动调整内存压缩的程度。在正常情况下,内存压缩对大多数用户和应用程序不会产生明显的性能下降。然而,在某些情况下,例如对于特定的高性能应用程序或需要大量内存带宽的工作负载,可能会出现轻微的性能影响。

#关闭内存压缩,重启生效
Disable-MMAgent -mc
#开启内存压缩,重启生效
Enable-MMAgent -mc
#查看当前内存压缩状态
Get-mmagent 

(3)可用:8.4GB

表示当前操作系统可用于分配给新进程或应用程序的物理内存,可用内存是系统当前未被使用的内存。
初次看到这个参数,可能有的用户会产生一种错觉:只要可用内存不为0,则计算机当前运行情况良好。这种观点是不正确的,windows系统内存的占用关键是看已提交内存的使用率,而可用内存仅代表内存当前未被使用,不代表内存未被分配出去。而这部分内存可被其他进程使用的前提是可以被置换到磁盘上的分页文件中,如果分页文件已满,则这些内存也无法被其他进程使用。

(4)为硬件保留的内存:0.5MB

表示由硬件设备保留的物理内存,通常由系统BIOS或UEFI分配。
物理内存=使用中内存 + 可用内存 + 为硬件保留的内存;

(5)已提交:9.8/33.0GB

表示已分配的物理内存和虚拟内存的总和,已提交的内存包括当前正在使用的内存和保留的内存空间。
左边(9.8G):当前运行的所有程序总共已经向操作系统申请的内存空间
右边(33G):当前运行的所有程序总共可以向操作系统申请的内存空间

(6)已缓存:8.4GB

显示文件系统缓存占用的物理内存。文件系统缓存有助于提高文件访问速度,缓存最近访问过的文件。

(7)分页缓冲池:770MB

内核使用的内存池,存储可以交换到磁盘的数据。

(8)非分页缓冲池:810MB

内核使用的内存池,存储不可以交换到磁盘的数据。

资源监视器内存参数

进程内存参数

(1)提交:表示已经被分配给进程和系统使用的虚拟内存大小。已提交内存包括物理内存(RAM)和交换文件(Pagefile)中的空间,用于存储进程的代码、数据以及操作系统的内核数据。

(2)工作集:进程所占用的总物理内存。但是这个值是由两部分组成, 即 专用工作集 (即专用内存)+ 共享工作集(即可共享内存);

(3)可共享:该进程和别的进程共享的内存量;

(4)专用:进程独占的物理内存;

(1)工作集,即在物理内存中的数据的集合;

(2)工作集 = 专用内存 + 共享内存;

(3)将所有的 "工作集" 相加后的值会大于任务管理器中内存占用的百分比,因为百分比对共享内存进行排重了,即共享内存会在不同进程中被重复计算;

(4)"提交大小" 和 "工作集" 是两个层面的概念,大部分活跃进程的 "工作集" 会大于 "提交大小",而大部分非活跃的进程 "工作集" 会小于 "提交大小",但是两者没有绝对关系;

物理内存参数

物理内存大小为16G,内部分为了以下几个部分:

(1)为硬件保留的内存(1MB):专门为硬件(如显卡、BIOS等)保留的内存,通常在系统启动时由硬件设备直接占用,用户无法访问。

(2)正在使用(7732MB):当前正在被操作系统和正在运行的程序使用的物理内存;

(3)已修改(20MB):被修改的内存页,但是修改并未写回到磁盘,写回操作完成后这部分内存才能用于其他用途;

(4)备用(8614MB):包含未使用的缓存数据和代码的内存;

(5)可用(17MB):不包含任何有价值数据,以及当进程、驱动程序、操作系统需要更多的内存时优先使用的内存;

实际上的可用内存(8631MB)= 备用内存(8614MB)+ 可用内存(17MB),而当系统内存负载过高时,也可以看到可用内存急剧减少。

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

systeminfo内存参数

(1)Total Physical Memory:16383MB

对应任务管理器中的总物理内存,即实际的物理内存。在真实物理机中,就是主板上内存插槽中全部内存条的总容量。

(2)Available Physical Memory:8634MB

对应任务管理器中的可用内存,表示当前操作系统可用于分配给新进程或应用程序的物理内存,可用内存是系统当前未被使用的内存。

(3)Virtual Memory:Max Size:33791MB

对应任务管理器中的可提交内存,表示已分配的物理内存和虚拟内存的总和。

(4)Virtual Memory:Available:23778MB

可提交内存与已提交内存之差,表示当前运行的所有程序还可以向操作系统申请的内存空间。

(5)Virtual Memory:In Use:10013MB

对应任务管理器中的已提交内存,表示当前运行的所有程序总共已经向操作系统申请的内存空间。

(6)Page File Location

分页文件的位置,windows通过分页文件机制提供了远超物理内存大小的虚拟机内存。
如下图所示,在windows系统的高级设置-性能选项中可以修改分页文件的设置(文件位置及文件大小)。名称虚拟内存是一个不太准确的标题,忽略即可。

procexp内存参数

procexp显示相比较上述的途径更加全面,主要包含提交内存、物理内存、内核内存(分页缓冲池和非分页缓冲池),相关参数都已经在前面有过介绍,这里不再赘述。

总结

(1)决定windows系统当前真实内存负载的参数是任务管理器界面的已提交内存,该数值越大,代表系统内部当前各项进程申请的内存资源越多,如果已提交内存远大于真实物理内存,代表一大部分文件被置换到了分页文件中,进行进程切换时可能会有卡断发生;

(2)资源监视器的物理内存参数真实反应了系统当前物理内存的分配使用情况,该界面的可用内存(备用+可用)越小,代表此时系统的内存压力越大;

(3)反应进程真实物理内存使用的是其工作集,尤其是工作集中的专用内存,这部分内存表示该进程独占的物理内存,在系统内存压力过大时,可以手动关闭专用内存占用较多的进程;

(4)驱动有时也会发生内存泄漏,但是相关信息无法通过上述的工具看到,这时可以使用微软提供的poolmon工具进行分析,使用方法可在网络进行搜索;

参考资料

https://learn.microsoft.com/zh-cn/troubleshoot/windows-client/performance/introduction-to-the-page-file
https://answers.microsoft.com/zh-hans/windows/forum/all/windows/e1a6c144-26e1-4c1a-af27-c5c90fd60308?page=2
https://blog.51cto.com/markwin/91907
https://cloud.tencent.com/developer/article/1924864
https://www.pcoic.com/system/windows/4785.html
https://docs.freebsd.org/en/articles/vm-design/#allen-briggs-qa
https://www.itprotoday.com/cloud-computing/the-memory-optimization-hoax
https://www.zhihu.com/question/43714216/answer/1164044678
https://github.com/cw1997/memory-allocation-test
https://www.cnblogs.com/oboth-zl/p/17168468.html