带着问题去思考!大家好
性能问题是架构前想的还是之后想的?评估什么?
在设计阶段时,你需要理解整体架构和约束条件,不然你就回遗漏一些关键点,这将严重制约程序的运行,设计阶段就把性能目标预先考虑进去。当然安全问题也是一样的。一旦项目进入测试,部署和维护阶段,就得把更多的经理投入到微观优化,具体代码方式的分析,减少内存占用等工作。
我们评估什么呢?评估的东西太多,就拿内存来说,显然需要评估内存占用情况,以便减少内存小号,查看那些类内存呢?专用工作集内存,提交大小,页面缓存池,峰值工作机,.NET堆内存大小,还是大对象堆内存。
平局值还是百分位值
用什么统计值才合适》多数人会优先选用平均值,但是应该考虑一下百分位值。如果对程序的可用性有要求,肯定会用到百分比形式的性能指标。例如:数据库请求的平均延迟必须少于10ms。95%以上的数据库请求延迟必须少于100ms。
(P/100)xN,P为百分位值,N为数据个数。
假定测试由0代垃圾回收导致的暂停服务时间
1,2,2,4,5,5,8,10,10,11,11,11,15,23,24,25,50,87;
18个样本数据。平均值为17ms,95%百分位值远大于50ms。如果只看平均值,你也许不会发现垃圾回收引起的延时问题。你还会发现,中间值(50%百分位值)与平均值的差距相当大,那些占比高的数值,对平均值的影响往往比较大。这样不具备统计学意义,也许只是偶然,可以用一条经验法则来确认所需的样本数,0-99%需要100个,99.9%需要1000个,以此类推,可以从数学角度了解到底需要多少样本数才够用。
评估工具
“性能监视器”,所属Category和名称,Processor Time计数器属于Process类,它的多个实例分别对应了当前存在的各个处理器。有些性能计数器还带有“元实例”,
我们先熟悉一下基本的操作系统术语
- 物理内存---安装在计算机中的物理芯片内存,只有操作系统才能直接管理物理内存。
- 虚拟内存---属于进程的逻辑内存块。虚拟内存可以大于物理内存。虚拟内存中连续的内存块,在物理内存中不一定是连续的,进程中的所有内存地址都是指虚拟内存。
- 保留内存---在虚拟内存地址空间中为进程预留的地址段,且永远不会被分配。保留内存无法用于内存分配,因为它根本不存在。只是一段内存地址
- 已提交内存---物理存在的一段内存,可能位于RAM中,也可能在磁盘上,
- 内存页---内存单位,每页包含了多个已分配的内存块,单位通常KB
- 页面交换----在多个虚拟内存区域之间交换内存页的过程,内存页即可能与其他进行交换(软交换),也可能与硬盘交换(硬交换)。软交换的速度可以非常快,只要把内存映射到当前进程的虚拟地址空间即可,硬交换则涉及到速度较慢的硬盘数据交换。你的程序尽量避免触发硬交换。
- 调入内存页--把内存页从其他地方送入当前进程,
- 调出内存页--把内存页从当前进程送出至其他地方。比如磁盘
- 上下文切换---保存和恢复线程或进程状态的过程,因为线程数目通常总是多余可用处理器数,所以往往每秒会发生多次上下文交换
- 内核模式--该模式下允许操作系统修改底层硬件参数,
- 用户模式--用于执行普通指令的非特权模式,
Process类计数器可以提供很多重要信息。大家不妨试一试;
PerfView
他是由微软的.NET性能架构师Vance Morrison编写的。
当然还有很多工具,。CLR Profiler,Windbg.MeasureIt。这里不在赘述,大家可以通过其他途径获取了解。这些只不过是一些可视化程序。更重要的是评估,评估在评估