读懂Windows的系统信息

奇怪,在我的电脑上第一次打开Visual Studio 2010要8秒左右,而关掉后再次打开,则只要2秒左右, 这是为什么?

好吧,你肯定知道是Windows在背后搞的鬼,你甚至知道我们分别把他们叫做冷启动(cold start)和热启动(warm start), 可是Windows到底做了什么而产生如此大的区别呢?

任务管理器几乎每天都在用,可是其"性能"那一页的内容未必全看的懂;Process explorer也常在看,可是其系统信息(system information)那个框框里的东西却未必认得全。花了些时间把这些概念理了理,总结一下。相信看完这些,对刚才那个问题会有比较清晰的解答。

image

 

虽然这个对话框名字为"系统信息",但其主要包含的还是系统的一些性能参数,如内存,CPU, I/O之类的。从上到下,从左到右一共10大类,我们一个一个加以解读吧。

  1. CPU Usage
    CPU总使用率。在右边CPU Usage History中可以看到其使用历史,我们可以注意到有两条线:红的那条量比较小的是内核的使用率,而绿色的则表示总的使用率。如果你的系统时不时的卡一下,通过查看每个进程的使用率又因为太快而捕捉不到,看看历史,把鼠标移到之前某个波峰上,就会跳出个tooltip,谁在捣鬼自然一目了然。
    当然,如果是多核的机器,可以把最下面那个"Show one graph per CPU"勾上查看单个核的使用情况。

  2. Commit
    虚拟内存的"认可用量"。这是任务管理器的翻译。如果我们把在物理内存中的所有可交换到pagefile的内容强制交换出去,此时pagefile中总的内容,就是Commit的大小。这就是为什么任务管理器也把Commit称为Page File使用率(page file的有效内容/page file文件大小)的原因。对于当前系统来讲,其大小为已经写到page file上的内容,加上还在物理内存中的可以写到page file中去的内容。
    "Commit"或者"认可用量"这个名字听起来不是很直观,但我们知道有个叫VirtualAlloc的API分配内存的时候,我们可以指定内存的类型,常用的两种是MEM_COMMIT和MEM_RESERVE, 我们看出来这里Commit其实就是指以MEM_COMMIT的方式分配的内存。
    会被交换到pagefile的内存包括private bytes, paged pool等,不会被交换到page file的内存包括内存映射文件(他们会被交换到对应可执行文件)和nonpaged pool或者系统内核,驱动(常驻内存)。
     
  3. I/O Bytes
    系统的输入输出情况。包括文件、网络和设备(鼠标、键盘等)的活动。读写文件是最常见的一种I/O。右边历史窗口中,蓝色的表示读写的总量,而粉红色的表示写的量。和CPU的使用率一样,我们可以对之前哪些进程进行了大量读写一目了然。一般情况下,粉红的那条线是"贴地而行"的,但你可以通过copy-paste上百兆的文件(avi或者rmvb等)观察到粉红线的突然上升。

  4. Physical
    物理内存使用量。

  5. Totals
    系统中句柄,线程,进程的总数量。
    这里句柄(Handle)是指向操作系统的一个引用,如HWND,HMENU,HDC等等。你可以把其简单的看成指向系统的某块内存,当然,实际情况会比这个复杂

  6. Commit Charge(k)
    这个就是第二项所介绍的Commit,只不过除了实时的认可用量,还提供了更多的关于Commit Charge的信息:。

    Current: 当前的Commit Charge大小
    Limit: Commit Charge的最大可能值,一般为:页面文件大小 + 物理内存大小 - 常驻物理内存的内容(nonpaged pool, system core等等)
    Peak: 自系统启动以来有过的最大的Commit Charge大小。
    Peak/Limit,Current/Limit两个数据的意义不言自明,当Current/Limit的值接近100%时,你的系统就会非常非常的慢。
    这个概念在Wiki上也有很不错的解释:Commit Charge.

  7. Physical memory(k)
    物理内存的使用情况。

    Total:总物理内存量
    Available:可用物理内存,包括free page list, zero page list和standby page list,在第四项看到的物理内存使用量,加上这里的可用物理内存,自然就是总物理内存量。
    System Cache:包括Cache Bytes(System's working set)和standby page list.

    Standby page list是可用物理内存,当free page list和zero page list用完后,就会开始破坏cache使用它。Standby page list同时也是cache,它是磁盘内容在物理内存的缓存,当再次访问到该内容时,可以从物理内存cache中直接拿到从而避免了读取磁盘。

  8. Kernel Memory(k)
    内核内存。内核下使用的内存包含两个非常重要的概念:paged pool和nonpaged pool。内核分配内存就是通过这两个内存池的。正如其名字所表示的,paged pool上的内存是可以被交换到page file的,而nonpaged pool上的内存是常驻物理内存的,是永远也不会被交换到pagefile上去的。

    Paged Physical: paged pool所分配的内存在物理内存上大小。
    Paged Virtual: paged pool所分配的总内存大小。
    Paged Limit:paged pool的最大值,在注册表中可以设置。
    Nonpaged: nonpaged pool上所分配的内存的大小,也就是物理内存的大小。
    Nonpaged Limit:nonpaged pool的最大值,在注册表中可以设置。
    这里page limit和nonpaged limit的内容需要设置系统符号文件才能正确显示:Option|Configure Symbols.

  9. Paging
    这里的paging不光指系统的page file,还包括memory mapped file,一般为exe,dll文件。当系统需要时,commit的内存会被交换到page file,而代码所占的内存则会被交换到其对应的可执行文件本身。当然,如果你的dll被rebase过,也就是被修改过了,触发了copy on write,会产生一份新的内容并也会被交换到pagefile上去。

    Page Fault Delta:每秒所发生的page fault的总次数,page fault是指访问的虚拟内存页不在进程的工作集中,需要从内存的standby list去拿,或者从磁盘load进来,前者为soft page fault, 后者为则hard page fault,耗时较长。
    Page Read Delta:每秒从磁盘读入的page数量。
    Paging File Write Delta:每秒写入到page file的page数
    Mapped File Write Delta:每秒写入到mapped file的page数,如exe,dll等。

    当系统物理内存不够用时,这些数据会变得很大,这是一个系统thrash的信号。

  10. CPU and I/O
    Context Switch Delta: 每秒钟线程context switch的次数。
    I/O Read Delta: 每秒的输入数,I/O包括磁盘,网络,设备等的输入输出。
    I/O Write Delta: 每秒的输出数,
    I/O Other Delta: 不包括数据的I/O操作,如控制操作的速率。
  11. copy-paste一个500M左右的.rmvb或者.avi,就能明显的观察到read delta和write delta的变化。

 

那么现在,对本文开始提出的那个问题就比较清晰了:

image

 

注意:

很多术语名词,如private bytes, paged pool之类的,都可以在performance monitor中看到说明。

posted @   lzprgmr  阅读(1486)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

黄将军

点击右上角即可分享
微信分享提示