e-works数字化企业网  »  文章频道  »  基础信息化  »  终端和服务器

浅谈服务器性能测试的全生命周期

2017/10/5    来源:简书    作者:Micheal      
关键字:服务器  服务器性能测试  
讲到服务器性能大部分人会想到这个服务器的架构是什么样子的,用的什么epoll,select,spring,tornado之类的。其实从本质上来看的话目前大部分的服务器主要包括逻辑层以及DB层,我们采用的各种框架组件处于逻辑服务器中,如下图所示。
    WeTest导读
 
    服务器性能测试是一项非常重要而且必要的工作,本文是作者Micheal在对服务器进行性能测试的过程中不断摸索出来的一些实用策略,通过定位问题,分析原因以及解决问题,实现对服务器进行更有针对性的优化,提升服务器的性能。
 
    1.服务器性能测试小结
 
    讲到服务器性能大部分人会想到这个服务器的架构是什么样子的,用的什么epoll,select,spring,tornado之类的。其实从本质上来看的话目前大部分的服务器主要包括逻辑层以及DB层,我们采用的各种框架组件处于逻辑服务器中,如下图所示。
 
  服务器架构本质
 
    服务器架构本质
 
    服务器性能测试是一项比较繁琐的事情,作为没有做过性能测试的同学可能需要理清楚以下几个事情。
 
    1.1. 协议分析
 
    首先是协议分析,性能测试本质上是我们用代码来模拟真实的用户请求,所以我们必须要知道发送出去的请求内容才能模拟。在典型的CS服务器中很多使用了protobuf,thrift,tdr(腾讯自研)来序列化以及反序列号请求内容。
 
    序列化之后一方面可以对数据进行压缩处理,另一方面也避免请求内容明文传输造成被抓包·泄漏数据的危险。之前有过服务器传输数据的时候使用的是明文直接发送,而且这个数据是一些敏感的sql语句,这样首先暴露了数据库的表结构,同时不法分子可以通过模拟发包造成“脱裤”甚至是数据被清空。
 
    1.1.1. Protobuf
 
    谷歌出品,必属精品。Protobuf使用起来很方便,学习成本非常低,而且序列化和反序列号的接口很容易使用。同时它相对于xml以及json,极大的的减小了数据占用的空间,减少了传输成本。目前支持包括C++,java以及python等多个语言。Protobuf目前用的比较多,打解包也很方便,比较推荐使用。
 
    1.1.2. Thrift
 
    Thrift是一个跨语言的轻量级rpc消息和数据交换框架。Thrift支持几乎绝大部分主流的语言,包括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml,虽然大部分我都没有用过。相对于protobuf,thrift提供了全套RPC解决方案,包括序列化机制、传输层、并发处理框架等,也因为如此thrift的学习成本比较高。
 
    1.1.3. 腾讯自研协议tdr
 
    Tdr是腾讯自研跨平台多语言数据表示组件,主要用于基于数据的序列化反序列化(支持二进制方式和XML文本方式)以及ORM数据存储。广泛用于互娱自研游戏和部分代理游戏。在性能上基本和protobuf差不多,主要应用在C++程序中。
 
    在做服务器性能测试之前,我们需要了解它的协议是怎么定义的。
 
    1.2. 机器人管理
 
    本质上机器人管理就是一个调度控制器,在获取需要发送的请求协议之后,需要有一个框架来管理所有的机器人,控制机器人的启动,发送请求以及停止的动作。框架的选择需要根据服务器的实际情况来,不同的业务场景,使用不同的框架产生的压力上限也会不一样。
 
机器人管理框架
 
    机器人管理框架
 
    以一个简单的多线程框架为例,主线程负责控制逻辑,管理所有的机器人状态信息。子线程执行每个机器人的任务,包括连接服务器,发送数据,接收数据,断开连接等。
 
    1.3. 结果统计
 
    机器人发送请求包之后,一般是要等待服务器的响应回包。服务器那边可以计算本次压测过程中各项业务数据,包括TPS,总的收发包量等。
 
    不可能在测试过程中一直盯着各个数据看,我们需要把每项数据记录下来,后续综合各项结果进行分析。
 
    这里的结果统计除了需要统计每个机器人收到回包的结果,还需要统计服务器在压测过程中的各项性能数据变化。一旦客户端的压力上到一定值时,服务器某项资源支撑不了的话,说明这个资源可能存在短板,存在可以优化的空间。
 
    1.性能结果分析
 
    性能结果分析是一个比较复杂的过程。需要综合硬件、操作系统、应用程序等多方面来定位。
 
    2.1. 硬件的影响
 
    硬件对服务器性能影响还是蛮大的,如果是土豪的话,可以直接买最好的。我们分析硬件主要是希望选择合适的配置,节约资源,避免出现高射炮打蚊子的情况。
 
    2.1.1. CPU
 
    在资金的充足下,一般来说CPU的数量越多,主频越高,那么服务器的性能也就会越好。在实际测试过程中,如果在大压力下持续观察CPU的使用率很低,那么CPU的资源基本上是可以满足服务器要求的。这样的情况其实是有点浪费CPU资源的,比较理想的情况是压力不大的时候CPU利用率比较低,压力上来之后CPU利用率保持在60%-70%。
 
    大部分的CPU在同一时间内只能运行一个线程,但是超线程的处理器可以在同一个时间运行多个线程,我们可以利用处理前超线程特性提高系统性能。虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。
 
    2.1.2. 内存
 
    内存的大小也是影响服务器性能的一个重要因素。内存太小,系统进程要被阻塞,应用程序会变得缓慢,甚至是失去响应;如果太大的话,也是造成一种浪费。Linux系统中采用物理内存和虚拟内存两种方式,使用虚拟内存可以缓解物理内存的不足,但是如果占用过多的虚拟内存的话,应用程序的性能会明显的下降。
 
    2.1.3. 网络带宽
 
    网络带宽的大小限制了客户端与服务器交互的流量,相对其他硬件资源,网络带宽在价格上更贵。这需要我们合理预估服务器的可服务器能力,需要占用的带宽资源。
 
    2.1.4. 磁盘IO
 
    目前磁盘都是机械方式运作的,主要体现在磁盘读写前寻找磁道的过程。磁盘自带的读写缓存大小,对于磁盘读写速度至关重要。读写速度快的磁盘,通常都带有较大的读写缓存。磁盘的寻道过程是机械方式,决定了其随机读写速度将明显低于顺序读写。在我们做系统设计和实现时,需要考虑到磁盘的这一特性。
 
    2.2. 操作系统及软件
 
    2.2.1. 版本
 
    不同的操作系统在内核实现上可能各不相同,因而对运行在上面的应用程序来说可能影响比较大。
 
    笔者并没有做过分析不同操作系统对服务器性能的影响,因为只用过Linux开发服务器程序。Linux操作系统在这十几年发展的异常迅猛,目前大部分的服务器都是运行在Linux操作系统上的。Linux目前具有最好的生态系统,服务器端的各种软件都为它而设计,默认都认为你是在 Linux 上跑,你要是整一个非 Linux 的服务器,你得有足够的心理准备,因为出现任何问题,你可能未必能找到能帮你解决问题的人。
 
    2.2.2. 参数配置
 
    先说一个小故事。福特公司一套重要设备出现故障,找了很多人来维修,结果都没有维修好,没办法了,就在购买设备的英国公司高价聘请一位工程师过来维修,工程师来到之后,反复查找原因,最后在一个小零件上划了一条线,然后对旁边福特公司的人说,在划线的地方切掉就好了,果不其然,切掉之后故障真的解除了,按照合约,福特公司应支付公司一万美元,周围的人都唏嘘不已,感叹一条线就可以价值一万美元,工程师回答到:那条线只值一美元,而怎样找到那条线值9999美元。
 
    我们在测试服务器的过程中,经常会遇到性能上不去。查看CPU,网络,IO消耗都挺低的,就是定位不到问题的原因。有经验的程序员可能会告诉你你把某个参数修改一下,立马性能噌噌噌上去了。比如mysql相关设置,系统文件描述符,缓冲区大小,time_wait快速回收设置等,甚至是线程池配置的线程个数也会对服务器的性能产生较大的影响。
 
    关于数据库参数的设置,比如mysql的配置文件my.cnf文件中,修改不同的配置(比如innodb_flush_log_at_trx_commit 设置为0,1还是2 )可能会对数据库的读写性能影响很大。
 
    2.2.3. 应用程序本身实现
 
    比如程序中需要频繁申请内存,使用bzero和memset对服务器性能影响差距可能会很大。
 
    另外程序中的一些查询操作,采用不同的数据结构,可以实现时间和空间上的相互转化,从而影响服务器的性能。
 
    1.Linux下的数据监控工具
 

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐