写在前面,窃以为衡量服务器的标准不仅仅只限于服务器的性能,更重要的是性价比。举个例子,最近dmzj的土豆田(服务器)一直在反复的刨地(维护升级),但如果按照阿里的服务器配置,明显的会有大材小用的感觉。因为dmzj的用户本来就不多,会造成大量的服务器资源,开发成本,硬件成本的浪费。说白了就是够用就行,合适的才是最好的。
服务器的性能指标有很多,我们先介绍一些基本概念,再来看看衡量服务器性能的正确姿势:
- 吞吐量
关于吞吐量的定义有很多,指的是在一次性能测试过程中网络上传输的数据量的总和,也可以通俗的理解为固定时间间隔内的处理完毕事务的个数。
- 响应时间
一次事务的处理时间。通常指从一个请求发出,到服务器进行处理后返回,再到接收完毕应答数据的时间间隔,单位一般是毫秒
- 并发数
指同时访问服务器站点的连接数
在这里我们对测试工具不做介绍,网上有各式各样的工具,自己搜吧。在这儿主要讨论一下测试时需要注意的几点:
- 测试数据不应取平均值。不限于服务器测试,平均值在各个领域都不靠谱,就像我和马云的平均工资,北京和底特律的平均房价,都是一些毫无意义的数据。在服务器性能测试时一定不要被平均值所迷惑,往往计量单位是毫秒级的,如参考平均值测试结果产生两位数的倍数偏差是很正常的。正确的做法是用百分比分布统计,也就是英文中的TP – Top Percentile ,TP50的意思在,50%的请求都小于某个值,TP90表示90%的请求小于某个时间。比如:我们有一组数据:[ 10ms, 1s, 200ms, 100ms],我们把其从小到大排个序:[10ms, 100ms, 200ms, 1s],于是我们知道,TP50,就是50%的请求ceil(4*0.5)=2时间是小于100ms的,TP90就是90%的请求ceil(4*0.9)=4时间小于1s。于是:TP50就是100ms,TP90就是1s。
- 对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,在容量规划的测试中,吞吐量是一个重点关注的指标,因为它能够说明系统级别的负载能力,另外,在性能调优过程中,吞吐量指标也有重要的价值。但是如果只看吞吐量不看响应时间,那么吞吐量是毫无意义的。因为哪怕你的吞吐量再大,但需要举个例子,10s的响应时间,这个系统明显是不合格的,吞吐量也毫无意义。当并发量(吞吐量)上涨的时候,系统会变得越来越不稳定,响应时间的波动也会越来越大,响应时间也会变得越来越慢,而吞吐率也越来越上不去(如下图所示),包括CPU的使用率情况也会如此。所以,当系统变得不稳定的时候,吞吐量已经没有意义了。吞吐量有意义的时候仅当系统稳定的时候。所以,吞吐量的值必需有响应时间来卡。比如:TP99小于100ms的时候,系统可以承载的最大并发数是1000qps。这意味着,我们要不断的在不同的并发数上测试,以找到软件的最稳定时的最大吞吐量。
- 应当保证成功率。如果请求不成功,那么任何测试都是毫无意义的。
性能结果分析需要综合硬件,操作系统,应用程序等多方面定位。
- 硬件
关于硬件,窃以为,考虑性价比后,选择最合适的就好,可以避免资源和经费的浪费。
- CPU,一般来说CPU的数量越多,主频越高,那么服务器的性能也就会越好。在实际测试过程中,如果在大压力下持续观察CPU的使用率很低,那么CPU的资源基本上是可以满足服务器要求的。这样的情况其实是有点浪费CPU资源的,比较理想的情况是压力不大的时候CPU利用率比较低,压力上来之后CPU利用率保持在60%-70%。
- 内存,内存的大小也是影响服务器性能的一个重要因素。内存太小,系统进程要被阻塞,应用程序会变得缓慢,甚至是失去响应;如果太大的话,也是造成一种浪费。Linux系统中采用物理内存和虚拟内存两种方式,使用虚拟内存可以缓解物理内存的不足,但是如果占用过多的虚拟内存的话,应用程序的性能会明显的下降。
- 网络带宽,网络带宽的大小限制了客户端与服务器交互的流量,相对其他硬件资源,网络带宽在价格上更贵。这需要我们合理预估服务器的可服务器能力,需要占用的带宽资源。
- 磁盘IO,目前磁盘都是机械方式运作的,主要体现在磁盘读写前寻找磁道的过程。磁盘自带的读写缓存大小,对于磁盘读写速度至关重要。读写速度快的磁盘,通常都带有较大的读写缓存。磁盘的寻道过程是机械方式,决定了其随机读写速度将明显低于顺序读写。在我们做系统设计和实现时,需要考虑到磁盘的这一特性。
2.操作系统
不同的操作系统在内核实现上可能各不相同,因而对运行在上面的应用程序来说可能影响比较大。
笔者并没有做过分析不同操作系统对服务器性能的影响,因为只用过Linux开发服务器程序。Linux操作系统在这十几年发展的异常迅猛,目前大部分的服务器都是运行在Linux操作系统上的。Linux目前具有最好的生态系统,服务器端的各种软件都为它而设计,默认都认为你是在 Linux 上跑,你要是整一个非 Linux 的服务器,你得有足够的心理准备,因为出现任何问题,你可能未必能找到能帮你解决问题的人。
3.程序代码
应用程序本身实现比如程序中需要频繁申请内存,使用bzero和memset对服务器性能影响差距可能会很大。
另外程序中的一些查询操作,采用不同的数据结构,可以实现时间和空间上的相互转化,从而影响服务器的性能。
确保采用的是高性能IO模型。
相关文献:https://zhuanlan.zhihu.com/p/21369877
https://coolshell.cn/articles/17381.html?from=groupmessage&isappinstalled=0