Monday, February 22, 2010

读懂Windows的系统信息

 
 

Sent to you by tony via Google Reader:

 
 

via Dbger的博客 by Dbger on 2/17/10

奇怪,在我的电脑上第一次打开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中看到说明。


 
 

Things you can do from here:

 
 

No comments:

Post a Comment