TarsBenchmark | 服务性能压测利器

作者|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

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

16 声望
7 粉丝
0 条评论
推荐阅读
DCache 分布式存储系统|Set, ZSet 缓存模块的创建与使用
导语 | 在之前的系列文章中,我们介绍了 DCache 及其 KV, K-K-Row 和 List 缓存模块的使用,本文将继续介绍如何使用 DCache 中的集合类型缓存模块 —— Set 和 ZSet 缓存模块。

TARS基金会1阅读 1.6k

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木60阅读 5.9k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木39阅读 7.1k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木32阅读 6k评论 9

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木32阅读 4.5k评论 9

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木29阅读 3.8k评论 9

从零搭建 Node.js 企业级 Web 服务器(八):网络安全
计算机网络依据 TCP/IP 协议栈分为了物理层、网络层、传输层、应用层,通常基础设施供应商会解决好前三层的网络安全问题,需要开发者自行解决应用层的网络安全问题,本章将着重表述应用层常见的网络安全问题及处...

乌柏木31阅读 5.7k评论 1

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

16 声望
7 粉丝
宣传栏