根据老雷的试验观察,每调用一次Process32NextW API,大约会触发8次缺页异常。管家程序每调用好一次CreateToolhelp32Snapshot后,会调用165次Process32NextW,那么这两项导致的缺页异常总数加起来便是1300多次,即:
bp kernel32!Process32NextW ".echo enumerating each process;r $t9=@$t9+1;? @$t9;gc"
管家程序每秒钟会做两轮以上循环,于是便是2千多次了。值得说明的是,这个很重的循环操作发生在一个线程中,即前文所说图3中很有规律的第4个线程。有读者可能会问,如果每秒循环两次,那么图3中的尖峰应该是间隔半秒啊?其实不然,因为这个线程是连续循环两次。也就是每次唤醒后,连续做两次拍照和枚举,然后休息不到1秒再做两轮循环,如此往复。执行.ttime观察这个线程的执行时间,可以看到它的执行时间很长。
0:017> .ttime
Created: Mon May 2 09:56:18.377 2016 (UTC + 8:00)
Kernel: 0 days 0:02:45.579
User: 0 days 0:00:24.679
执行~17n命令把这个线程临时挂起,恢复管家程序,再观察任务管理器,发现PF Delta(每秒钟新增的缺页异常)指标立刻降下来了,只有不到十次了。看来导致管家程序那么多的缺页异常的主要原因在于这个枚举系统进程的线程。它忙着给系统里的所有进程拍照,然后再一个个看过来。重要的是,这样的工作不是做一次,而是每秒来两轮,风雨无阻、孜孜不倦,时时刻刻关心着系统里运行着的其它进程,好辛劳的管家啊。
软件的历史不长,但软件的孩提时代已经过去了,因为今天的软件已经丧失了曾经拥有的简单和纯真,变得复杂、贪婪和狡黠。
一年多之前,我曾写过一篇《在调试器里看阿里的软件兵团》,批评了支付宝客户端软件中的性能问题,文章发表后,很高兴看到阿里的同行不断改进,今天已经不再有当时的问题了(图1中还可以看到淘宝的TBSecSvc进程,排名已经比较靠后)。不知百度的同行看过此文有何感想?作为一款客户端软件,能帮助用户管家是好想法,但是管家毕竟是仆人,有事时应该尽心给主人办事,没事时应该安安静静休息,不要肆意挥霍主人家的东西。
Read full article from 在调试器里看百度云管家
No comments:
Post a Comment