<<返回目录

平均值 vs 百分比

在考虑要性能测试的目标值时,我们需要考虑用什么统计口径。大多数人都会首选平均值,但在大多数情况下,这个正确的,但你也应该适当的考虑百分数。但你有可用性的要求,作为性能测试的目标里肯定会有用百分比作的要求。举个栗子:“数据库请求的平均延迟必须小于10ms,95%是请求必须小于100ms”
。。。(这里我省略了对“95%是请求必须小于100ms”的翻译说明,我觉得中国的程序猿应该看得懂我翻译的那句话)

1,2,2,4,5,5,8,10,10,11,11,11,15,23,24,25,50,87

举个栗子,上面有18个测试下来的值(已经过排序了的),的平均耗是17ms,但有5%的访问超过50ms。如果你刚好只看平均值,你一定会认为一切正常。但当你用了百分比作为指标,你就会知道一些偶发的GC操作会影响到你的访问质量。

百分比是高可用性的最重要指标。如果你需要更高的可靠性,就需要提出一个更高的百分数指标。通常来说99%已经很好了,但你还会可能有99.99% 99.999%,甚至更高的指标,但通常来说,决定采用这些指标数字取决于业务,而不是开发。

这里作为翻译的我,来补一些关于百分比的数据
99% 允许每年服务器挂 3.65 天(多让人尴尬的数据啊,但我相信很多公司服务器不一定达能到这个要求)
99.9% 允许每年挂 8.76 小时(1年出了一次较大的事故,基本就用完额度了)
99.99% 允许每年挂 52.6 分钟(1年只能出一次小的事故,还得是能立即解决的)
99.999% 允许每年挂 5.26 分钟(如果真的发生小于这个时间的事故,对于用户来说一般很难有感知,但是在淘宝双十一零点之后的一个小时内碰上的话 (=@__@=) )
99.9999% 允许每年挂 31 秒(写一个程序在一年的时间里只往控制台输出 hello world的同时还得祈求上帝保证机房不要断电 O(∩_∩)O!)

百分比是一个重要的指标,是因为他可以帮助你了解你的系统,即使通过平均值观察到,你的系统一切正常,但是只有90%的用户访问满足了目标,也会意味着,你还有10%的用户访问还有可以改进的空间。要解决这这部分请求问题,需要的更多是商业上的考量,因为这里会存在一个递减回报的问题,因为提升最后的1%要花的时间不是一般的多。

对于上面的例子“有95%的访问请求满足了50ms以内的需求”,但数据源来说,不符合统计学上对样本数量的要求,至少要要相同数量级的样本才行。要描述 99% 需要统计100个样本,要描述 99.9% 则至少要1000个样本,并以此类推。

再举一个作为翻译我的栗子
话说当年做的页游上线,在开服到了几百人(>500)的时候玩家会觉得比较卡,登陆服务器看了一下cpu和网络情况都不是很高(<30%),内存占也没啥问题。经过后来多方努力,发现是用户首次进入游戏时,为了数据安全,这时候初始化数据库的操作是同步的,而不是异步的。再加上dogse引擎的限定,主逻辑是跑在单线程的队列上,这就导致开服时主线程的阻塞会比较严重。每个玩家卡个200ms,同时有3个玩家进入,剩下的玩家自然会觉得卡了。

对于本书最重要的,而起是要重复说三遍的观点是:

测量,测量,测量

你要知道,如果没有准确的测量,在解决性能相关问题时,你只能按照自己的经验和感觉来判断那里有性能问题。这会存在2个问题:
首先:假设你的感觉是对的,找到了一个性能问题的地方,但你不知道当你修改了这里后,对性能提升了多少
其次:我也不可能告诉你那里经常犯错了。举个栗子(这个栗子我没看懂):在分析一个应用占用里很多非托管内存的问题,我们最初假设是认为在某处加载了一个很大的数据。随后安排开发人员做排查工作,通过禁止某些组件的加载,还调试了转储过程(dump)里堆的数据。结果让我们很吃惊,大部分内存的开销来自于组件(Assembly)加载,而不是我们之前所想的数据加载

如果没有工具做测量,那么性能优化就是没意义的。性能优化是一个连续的过程,你需要有自己的工具来对这个过程做记录。下面的章节将介绍一些常见的工具。恩大部分是免费的,有一款收费的,但是是vs专业版附带的,所以你懂的。

下一节 >> Visual Studio

[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比的更多相关文章

  1. [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio

    <<返回目录 Visual Studio vs虽然不是全宇宙唯一的IDE,但它是.net开发人员最常用的开发工具.它自带一个性能分析工具,你可以使用它来做开发,不同的vs版本在工具上会略有 ...

  2. [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)

    <<返回目录 Performance Counters(性能计数器) 性能计数器是监视应用程序和系统性能的最简单的方法之一.它有几十个类别数百个计数器在,包括一些.net特有的计数器.要访 ...

  3. [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)

    减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...

  4. [翻译]编写高性能 .NET 代码 第二章:垃圾回收

    返回目录 第二章:垃圾回收 垃圾回收是你开发工作中要了解的最重要的事情.它是造成性能问题里最显著的原因,但只要你保持持续的关注(代码审查,监控数据)就可以很快修复这些问题.我这里说的"显著的 ...

  5. [翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区

    避免使用终结器 如果没有必要,是不需要实现一个终结器(Finalizer).终结器的代码主要是让GC回收非托管资源用.它会在GC完成标记对象为可回收后,放入一个终结器队列里,在由另外一个线程执行队列里 ...

  6. [翻译] 编写高性能 .NET 代码--第二章 GC -- 将长生命周期对象和大对象池化

    将长生命周期对象和大对象池化 请记住最开始说的原则:对象要么立即回收要么一直存在.它们要么在0代被回收,要么在2代里一直存在.有些对象本质是静态的,生命周期从它们被创建开始,到程序停止才会结束.其它对 ...

  7. [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少大对象堆的碎片,在某些情况下强制执行完整GC,按需压缩大对象堆,在GC前收到消息通知,使用弱引用缓存对象

    减少大对象堆的碎片 如果不能完全避免大对象堆的分配,则要尽量避免碎片化. 对于LOH不小心就会有无限增长,但LOH使用的空闲列表机制可以减轻增长的影响.利用这个空闲列表,我们可以在两块分配区域中间找到 ...

  8. [翻译]编写高性能 .NET 代码 第二章:垃圾回收 基本操作

    返回目录 基本操作 垃圾回收的算法细节还在不断完善中,性能还会有进一步的提升.下文介绍的内容在不同的.NET版本里会略有不同,但大方向是不会有变动的. 在.net进程里会管理2个类型的内存堆:托管和非 ...

  9. [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项

    配置选项 在基于"less rope to hang yourself with"思想下,.NET 框架没有给开发提供很多太多的配置选项.但在大多数情况下,GC会跟你的硬件配置,及 ...

随机推荐

  1. 第一个ServiceStack服务框架

    第一个ServiceStack服务框架 最近刚接触ServiceStack,就尝试着写了第一个服务框架,难免出错,还望同道们多多指正. 关于ServiceStack相关的概念不在做详细的叙述,网上研究 ...

  2. Java 中的变量

    变量 Java 程序的变量大体可分为成员变量和局部变量. 局部变量 形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡. 方法内的局部变量:在方法内定义的局部变量,必须在方 ...

  3. margin 和 padding 的本质区别

    问题? 如何弄清 margin 和 padding之间的区别? 那,答案呢? margin 边界, padding 填充 假如有一个盒子,padding就相当于盒子的厚度,盒子大小固定,通过修改pad ...

  4. linux ngix安装

    因为我完全按照第一篇参考文章从上到下一步步安装导致有些安装失败最后重装的,过程有点乱,就没自己总结please read the follow articles Linux 安装Nginx详细图解教程 ...

  5. 在Tomcat中配置单点登录

    单点登录:Single Sign-On .概述 一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理.一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数.作 ...

  6. java 网络编程之UDP通信和简单的群聊程序

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. MySQL相关文档索引

    MySQL的新功能5.7 https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html MySQL5.7安装 http://note.youd ...

  8. 结合find和cp批量查找文件并复制到指定文件夹中

      find . -name JA1_*001_027 | xargs -i cp {} F:/ 说明: . 表示当前文件夹及其子文件夹中查找 -name 指定待查找文件,可以使用通配符 F:/ 表示 ...

  9. plus、max、Pro、Edge

    plus.max.Pro.Edge等后缀到底什么意思? Plus:比好更好.比牛X更牛X 译成中文是:加.和.正的-的意思.比如oneplus中文名就是一加.用于手机命名表示配置更加牛X,最早是由iP ...

  10. oracle的分组查询和连接查询

    分组函数: 六个常用的分组函数: AVG,SUM,MIN,MAX,COUNT,WM_CONCAT: 行转列 PS:分组函数默认会自动过滤控制,可以使用NVL函数使分组函数无法忽略空值: 未使用NVL函 ...