zoukankan      html  css  js  c++  java
  • 【性能测试】性能测试的知识梳理

    吞吐量(TPS Transaction Per Second):

    TPS = 请求数 / 平均响应时间

    如:目前某游戏日活跃用户250W,假如80%用户活跃时间集中在18:00-24:00,共6个小时。那么可以去这6个小时时间为采样时间。

    TPS = 总请求数*采样时间内用户比率/采样时间

    套用公式可得:

    TPS= 2,000,000 * 0.8 / 6*3,600s = 74.07 /s 

    响应时间=N1+N2+N3+N4+A1+A2+A3

    N1,N2,N3,N4为网络传输时间。N1为客户端到客户端路由器时间,N2为路由器到因特网时间,N3是因特网到服务器路由时间,N4是服务器路路有到服务器的时间。A1是应用服务器处理时间,A2是应用服务器到存储服务器时间,A3是存储服务器处理时间。

    可以继续细分下去,但是含义差不多。

    缓存

    缓存的概念在网络,存储,CPU中无处不再。网络的缓存有DNS缓存服务器,CDN加速服务器,路有缓存,交换机,多媒体缓存服务器等。还有硬盘的缓存,CPU的1级缓存,2级缓存等。存储中的应用,如MYSQL的缓存。操作系统的缓存等。这些缓存的存在都是为了加速,降低响应时间。但缓存也不是越多越好,有的缓存没有设置好,反而会降低性能。例如,某个很大的存储磁盘中,给他配置了很低的缓存,缓存命中就会很低,反而增加了匹配缓存的过程,占用了时间。

    如果上个例子中,没有缓存的话,那么假设加上缓存后,速度提升多少呢?

    TPS = 总请求数*采样时间内用户比率/(采样时间*缓存因子) 

    缓存因子的值,可以根据实际情况计算得出。我假想了一个测试方法:先来一轮没有缓存的测试,得出一个TPS1。然后再来一次有缓存的测试,得出TPS2。那么缓存因子=TPS1/TPS2。这个方法的局限性很大,要求网络环境,操作系统,存储环境保持一致。否则数据就不太准确。更准确的计算方法还是要考虑每个设备之间所占用的时间。

    IO:

    IO的基本概念:

    随机访问和连续访问;

    硬盘的读取数据的原理就是磁头读取盘片的过程。如果要访问的数据随机分布到盘片的各处,那么就是随机访问。如果访问的数据是连续的,那么就是连续访问。

    硬盘访问数据时,会经过寻址,旋转延迟,传输3个步骤。每个步骤都需要一定的时间。连续的数据可以几乎不用寻址和旋转延迟,所以传出数据的数据等于硬盘的传输速度。

    市场上常用硬盘的平均寻址时间:7200转9ms ,10000转 6ms ,15000转 4ms

    平均旋转延迟=1/转速/2

    传输时间=传输数据的大小/传输速度

    连续IO和并发IO。

    连续:串行处理IO请求,一次只能处理一个IO请求。

    并发:并行处理IO请求,一次能处理多个。但是每个磁盘依然只能处理多个,所以并发IO的场景,只是用于多个磁盘的阵列。如RAID0

    IO的响应时间:

    使用M/M/1 模型算法进行计算,目前我也在研究。

    存储阵列:

    RAID0:将一个完整的数据分割成多个部分放在磁盘中。这样可以并发读取数据。不具备容灾性,所以一旦磁盘坏了一个,数据就整个丢了。但是性能极高,读写速度是磁盘的整数倍。

    RAID10:准备两个磁盘,两个磁盘都放一样的数据。这样读取数据时,可以并发读取,提高了读的速度。但是写的话因为要写两个盘,所以速度没有变。如果用多个磁盘,那么可以先镜像,再条带化,就是RAID10。可以坏多个盘,但是只能坏在一个条带上。

    RAID01:先条带化,再镜像。这种方法比RAID10要安全。因为如果只要不是坏了1对硬盘,那么镜像互相之间都能找到损坏的数据。

    RAID5:奇偶校验热备盘,允许坏1个盘,可以内部计算得出坏了硬盘的数据,但性能会降低,因为要内部计算剩余的数据在哪里。读取性能几乎等于磁盘数。写入数据是(1/4)*磁盘数.

    RAID6:和RAID5的加强版,允许坏两个盘,读取性能几乎等于磁盘数的整数倍,写入数据是(1/6)*磁盘盘

    硬盘多的可以用RAID10或者RAID01

    其他:

    虚拟云主机的存储:优化方式在研究当中,因为无法像本地服务器那样对硬盘(SSD,阵列)。估计只能从内存条的缓存中入手优化了。

    NAS文件系统存储:准备研究他们的性能。

    网络:

    网络传输过程中,网线,转发器,路由器,交换机,带宽,丢包率,网卡,网络协议等,都是要考虑的因素。

    综上,个人觉得最难啃的骨头是IO。网络上的问题基本很少见,而且一旦出了问题,只有依赖于通信公司去解决,不会由我们软件工作人员去解决。我们只能定位问题和解决本地网络问题。万维网中的问题如果没有合适的渠道,一般难以解决。

    软件调优:

    MYSQL:主要从索引,语法,缓存,连接数,BLOCK大小等维度去考虑

    JVM:一个系统而复杂的过程,先设置参数拿到堆(heap)文件,然后用工具MAT分析堆中间中各个对象的使用情况。调优方法粗暴一点就是整数倍增加系统默认参数。但是实际上还要具体分析,因为算法不一样。

    算法关键字:计数法,标记-消除法,复制,标记-整理,分区(年轻代,年老代,永久代);强引用,弱引用,虚幻引用;

    JAVA代码调优:准备研究

    TOMCAT:准备研究

    NGINX:准备研究

    其他软件:遇到后研究

  • 相关阅读:
    ASP.NE网站发布注意事项
    jQuery中使用$.ajax提交表单
    DataTable类Clone及Copy方法的区别
    DataList控件使用初步
    一个非常标准的Java连接Oracle数据库的示例代码
    详细解析用C#写的小游戏《彩色连珠》(附源代码)
    VS 2010 复制代码到word出现乱码解决办法
    Java之简单的图片动态显示(实现类似GIF动画效果)
    Class.forName(String driverClassName)加载JDBC驱动程序时,底层都做了些什么???
    Java设计好看的窗体必加的代码(使用内置皮肤控件):
  • 原文地址:https://www.cnblogs.com/stanmao/p/10388698.html
Copyright © 2011-2022 走看看