浅谈服务器性能测试的全生命周期—从测试、结果分析到优化策略

发表于:2016-6-28 11:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:WeTest Micheal    来源:51Testing软件测试网采编

  服务器性能测试是一项非常重要而且必要的工作,本文是作者在对服务器进行性能测试的过程中不断摸索出来的一些实用策略,通过定位问题,分析原因以及解决问题,实现对服务器进行更有针对性的优化,提升服务器的性能。
  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.   腾讯自研协议
  tdrTdr是腾讯自研跨平台多语言数据表示组件,主要用于基于数据的序列化反序列化(支持二进制方式和XML文本方式)以及ORM数据存储。广泛用于互娱自研游戏和部分代理游戏。在性能上基本和protobuf差不多,主要应用在C++程序中。
  在做服务器性能测试之前,我们需要了解它的协议是怎么定义的。
  1.2.  机器人管理
  本质上机器人管理就是一个调度控制器,在获取需要发送的请求协议之后,需要有一个框架来管理所有的机器人,控制机器人的启动,发送请求以及停止的动作。框架的选择需要根据服务器的实际情况来,不同的业务场景,使用不同的框架产生的压力上限也会不一样。
  
机器人管理框架
  以一个简单的多线程框架为例,主线程负责控制逻辑,管理所有的机器人状态信息。子线程执行每个机器人的任务,包括连接服务器,发送数据,接收数据,断开连接等。
  1.3.  结果统计
  机器人发送请求包之后,一般是要等待服务器的响应回包。服务器那边可以计算本次压测过程中各项业务数据,包括TPS,总的收发包量等。
  不可能在测试过程中一直盯着各个数据看,我们需要把每项数据记录下来,后续综合各项结果进行分析。
  这里的结果统计除了需要统计每个机器人收到回包的结果,还需要统计服务器在压测过程中的各项性能数据变化。一旦客户端的压力上到一定值时,服务器某项资源支撑不了的话,说明这个资源可能存在短板,存在可以优化的空间。
  2. 性能结果分析
  性能结果分析是一个比较复杂的过程。需要综合硬件、操作系统、应用程序等多方面来定位。
  2.1.  硬件的影响
  硬件对服务器性能影响还是蛮大的,如果是土豪的话,可以直接买最好的。我们分析硬件主要是希望选择合适的配置,节约资源,避免出现高射炮打蚊子的情况。
  2.1.1.   CPU
  在资金的充足下,一般来说CPU的数量越多,主频越高,那么服务器的性能也就会越好。在实际测试过程中,如果在大压力下持续观察CPU的使用率很低,那么CPU的资源基本上是可以满足服务器要求的。这样的情况其实是有点浪费CPU资源的,比较理想的情况是压力不大的时候CPU利用率比较低,压力上来之后CPU利用率保持在60%-70%。
  大部分的CPU在同一时间内只能运行一个线程,但是超线程的处理器可以在同一个时间运行多个线程,我们可以利用处理前超线程特性提高系统性能。虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。
  2.1.2.   内存
  内存的大小也是影响服务器性能的一个重要因素。内存太小,系统进程要被阻塞,应用程序会变得缓慢,甚至是失去响应;如果太大的话,也是造成一种浪费。Linux系统中采用物理内存和虚拟内存两种方式,使用虚拟内存可以缓解物理内存的不足,但是如果占用过多的虚拟内存的话,应用程序的性能会明显的下降。
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号