吞吐量(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:准备研究
其他软件:遇到后研究