TarsBenchmark | 服务性能压测利器

TARS基金会

作者|Eaton

导语| 在服务正式上线前,我们需要确保服务上线后的可用性和稳定性,因此对系统的处理能力和稳定性进行全面的测试是非常必要的。压力测试是其中重要的一环,本文将介绍如何使用 TarsBenchmark 对 TARS 服务进行压测。

目录

  • 压测简介
  • TarsBenchmark 的使用

    • 安装部署
    • 服务压测
  • 总结

压测简介

在标准开发流程中,测试贯彻整个流程,包括但不限于单元测试、接口测试、集成测试、压力测试等。其中压力测试是服务上线之前的最后关键一环。

压测是通过不断给服务接口施加压力,测试服务接口性能,验证服务的处理能力和稳定性。我们可以通过压测对服务的性能进行评估,比如服务最大并发量、可以同时服务用户数等。最后根据测试指标对服务合理部署、扩缩容,或是对发现的性能瓶颈进行优化。

TarsBenchmark 是基于 TARS 生态的一个压测工具,主要用于 TARS 服务的压力测试。并且支持与 TarsWeb 结合使用,提供友好的操作界面对服务进行测试。下面将介绍如何使用 TarsBenchmark 对服务进行测试。

TarsBenchmark 的使用

TarsBenchmark 中包含 NodeServer, AdminServer 两个服务。

  • NodeServer: 为压测节点服务,用于压测的具体执行,对其他服务进行压测。可以在多个节点上部署,从而实现并行压测;
  • AdminServer: 用于管理压测节点,即管理 NodeServer,类似于 TARS 框架服务中的主控服务。

安装部署

我们先来看看怎么安装 TarsBenchmark。

首先,下载 TarsBenchmark 源码

git clone https://github.com/TarsCloud/TarsBenchmark.git

TarsBenchmark 中提供了一键安装脚本,能够通过脚本直接将 TarsBenchmark 发布在 TarsWeb 上,在 TarsWeb 中集成压测功能,执行命令如下

./install.sh $WebHost $Token $AdminIP $NodeIP

其中,参数

  • WebHost 为 TarsWeb 部署地址;
  • Token 为在 TarsWeb 用户系统中生成的 Token,能够在 http://${WebHost}/auth.html#/token 中新增并获取;
  • AdminIP 为要部署 AdminServer 的节点;
  • NodeIP 为要部署 NodeServer 的节点。

例如,TarsWeb 部署地址为 192.168.123.128:3000,并要将 AdminServer 部署在节点 192.168.123.128NodeServer 部署在节点 192.168.123.128,部署命令如下

cd TarsBenchmark
./install.sh 192.168.123.128:3000 abc123efg456ijk789 192.168.123.128 192.168.123.128

执行完成后,在 TarsWeb 上看到 benchmark 应用下包含服务 AdminServerNodeServer,即安装成功,如下

服务压测

成功安装后 TarsBenchmark 后,就可以在 TarsWeb 上对服务进行压测了。接下来我们将以 HelloServer 服务为例,了解如何对服务进行压测。

首先,我们需要定义 HelloServer 的接口

// Hello.tars
module Demo
{

interface Hello
{
    int testHello(string req, out string rsp);
};

};

进入压测界面

我们打开 HelloServer 服务的管理界面,点击 Tab 栏的 接口调试 跳转到接口调试页面。如未上传服务 tars 接口文件,点击 添加 来上传。最后点击压测,即可打开压测界面。步骤如下图

点击 压测 后,跳转到压测界面,如下

可以看到函数列表中仅有一个我们在接口中定义了的函数 testHello,点击页面中的入参结构和出参结构展开,如下图

可以看到,testHello 的入参和出参都是 string 字符串类型,和 HelloServer 接口文件中的定义是对应的。

接下来,点击右侧的 用例,就能够添加压测的测试用例了。

添加测试用例

点击 用例 后,会在 函数列表 下方显示该函数测试用例列表。如果是第一次添加,这里打开的列表会是空的,如下图

我们点击 添加用例,在弹出窗口中给函数添加测试用例,传入参数为字符串 hello,如下

点击 确定 后,就能在用例列表中看到我们添加的用例

点击 压测,会弹出压测配置界面,如下

我们勾选 endpoints 中要测试的节点,这里 HelloServer 只部署了一个节点,因此只显示了一个。其他选项

  • 单 endpoint 连接数:即与前面勾选的每个 endpoint 服务建立的连接数,这里默认为 1,表示只建立一个连接;
  • 单 endpoint 速率:即每个 endpoint 的请求速率,默认为 100,即每秒请求 100 次,可以通过增大该速率增加请求压力;
  • 压测时长:压测进行的时间,默认为 20 秒。

配置完毕后,点击 开始压测,即弹出压测进行界面,显示本次压测的指标,如下

这样我们就通过 TarsBenchmark 完成了对 HelloServer 的压测。

进阶

前面例子中,我们只介绍了 string 类型,并只是简单地添加了一个固定值作为测试用例。实际情况中,参数类型通常会比较复杂。TarsBenchmark 不仅支持 tars 协议中使用的数据类型,还针对部分数据类型支持随机参数生成。具体支持的数据类型可以参考官方文档 tars通信协议

对于常用的 int, string, vector, map 这几个类型,添加用例的方式如下

// int
"a": 1
// string
"a": "string"
// vector<int>
"a": [1,2,3,4]
// map<string, string>
"a": {"test": "abc"}

特别地,为了规避压测过程中的热key效应,避免后端请求落到同一台单机上,TarsBenchmark 支持对整型和 string 类型生成随机内容。目前支持两种随机方式:

  • 范围随机值:如 "[1-100]",表示在随机选择 1100 的数字;
  • 限定随机值:如 "[a,b,c,111]",表示在 a, b, c, 111 中随机选择;
热key效应:部分业务场景下,后端会缓存热key,将包含热 key 的请求定向到特定服务器单机上的服务,

下面我们通过前面 HelloServer 的例子,来看看具体如何使用。

首先对于 HelloServer,我们新增定义一个结构体 TestPacket,其中包含了类型为 int, string, vector, map 的四个字段 a, b, c, d。同时新增一个接口 testType,入参和出参都为 TestPacket 类型,如下

module Demo
{

struct TestPacket
{
    1 require int                 a = 0;
    2 require string              b = "";
    3 require vector<int>         c;
    4 require map<string, string> d;
};

interface Hello
{
    int testHello(string req, out string rsp);
    int testType(TestPacket input, out TestPacket output);
};

}; 

testType 接口的实现如下,可以看到,只是简单地打印日志,并将传入参数直接赋值给出参 output

int HelloImp::testType(const Demo::TestPacket & input, Demo::TestPacket & output, tars::TarsCurrentPtr current)
{
    TLOGINFO("HelloImp::testType| a: " << input.a
            << " | b: "       << input.b
            << " | c[0]: "    << input.c[0]
            << " | d[test]: " <<(input.d.count("test")? input.d.at("test") : "")
            << endl);
    output = input;
    return 0;
}

服务部署后,我们需要先在 接口调试 页面重新上传 tars 文件。上传完成后,打开压测界面,即可在函数列表中看到 testHellotestType 两个函数。

接下来,和前面的示例一样需要添加测试用例。我们点击 添加用例,会默认提供用例入参的结构,如下图

接下来我们编写用例,这里对于整型和 string 类型,我们使用前面提到的两种随机方式。用例如下

{
  "input": {
    "d": {
      "test": "hello",
      "a": "b"
    },
    "c": [
      2,
      32
    ],
    "b": "[test,hello,awsl]",
    "a": "[22-100]"
  }
}

最后进行压测,结束后查看服务的日志,如下图。

可以发现 ab 的值都是随机变化的,规避了热key效应,这样压测过程的请求不会都落在同一服务器单机上,确保了压测结果的准确性。

总结

本文介绍了 TARS 服务的压测利器 TarsBenchmark,结合 TarsWeb ,集成压测功能,方便开发者对 TARS 服务进行压测,验证服务的处理能力和稳定性。

TARS 可以在考虑到易用性和高性能的同时快速构建系统并自动生成代码,帮助开发人员和企业以微服务的方式快速构建自己稳定可靠的分布式应用,从而令开发人员只关注业务逻辑,提高运营效率。多语言、敏捷研发、高可用和高效运营的特性使 TARS 成为企业级产品。

TARS微服务助您数字化转型,欢迎访问:

TARS官网:https://TarsCloud.org

TARS源码:https://github.com/TarsCloud

Linux基金会官方微服务免费课程:https://www.edx.org/course/bu...

获取《TARS官方培训电子书》:https://wj.qq.com/s2/6570357/...

或扫码获取:

QR

阅读 928

2020年3月10日,Linux基金会正式宣布旗下的TARS开源项目将成立TARS基金会。TARS基金会是一个专注于微服...

16 声望
6 粉丝
0 条评论
你知道吗?

2020年3月10日,Linux基金会正式宣布旗下的TARS开源项目将成立TARS基金会。TARS基金会是一个专注于微服...

16 声望
6 粉丝
文章目录
宣传栏