用docker拓展压测工具artillery的能力

指定域名的IP地址

最近在用 artillery 做压测时遇到一个问题。我需要压测某一个通过域名访问的服务,而这个域名背后的机器地址需要随着压测用例变化的。通常这就是DNS要做的事情 - 把不变的域名和变化的地址关联起来 - 但我又没权限控制这个域名的解析地址。

另一个选择是跑到压测客户端的机器上,修改 /etc/hosts 让它指向不同的地址。不过压测客户端可不止一个,即使有办法批量下发 /etc/hosts 到每台机器上,事后我还需要把 /etc/hosts 给恢复回去,不然后面的人难免会踩坑。

还有一种选择,就是在客户端压测代码里根据不同的用例指定域名对应的IP。比如 curl 就有个 --resolve 参数可以指定域名和IP的对应关系,wrk 也可以通过 Lua 脚本设置。问题在于 artillery 并不支持这样的特性。

正在我一筹莫展之际,一个想法从脑海中蹦出来。我可以用 docker 封一层 artillery,然后通过 docker-compose 的 extra_hosts 配置设置映射关系。

version: '3'
services:
  benchmark:
    image: artillery:v1.6.0 # 我自己打了个 artillery v1.6.0 的镜像
    network_mode: "host"
    extra_hosts:
      # 映射关系在这里!
      - xxx.com:$XXX_HOST
    volumes:
      - .:/artillery
    command: artillery run xxx.yml

注意我这里使用了 $XXX_HOST 而不是直接在文件里写死 IP 地址。这样一来就能通过 docker-compose 的变量机制,在执行 docker-compose up 的时候通过环境变量注入真正的 IP 地址。就像这样:

$ XXX_HOST=192.168.0.123 docker-compose up

这下我只要根据测试用例的不同修改具体的命令行的值,就可以实现类似于 curl 的 --resolve 功能。

extra_hosts 的原理很简单,就是把配置文件里指定的映射关系写到容器的 /etc/hosts 文件,所以即使是 network_mode: "host" 下也能用。

指定 DNS

同样地,通过

dns:
  - 8.8.8.8

也能把 DNS 服务器地址写入到容器的 /etc/resolv.conf 文件,来自定义客户端用的DNS服务器。

利用多核

压测的过程中我们还发现一个问题:作为一个 node.js 应用,artillery 仅支持单核,而只跑一个 artillery 没办法充分利用客户端机器的性能。artillery 2.0 计划通过起多个worker的方式来用多个CPU,但远水解不了近渴,当前最新版本的 artillery 还不支持这一特性。好在我们已经套上了一个 docker 的壳,大可以通过 docker-compose 的方式起多个实例:

docker-compose up --scale benchmark=N

想一次性起多少个实例,就指定 N 为多少。当然这么做最后压测的结果需要自己计算各个实例的结果的总和。

Image placeholder
xiegui
未设置
  11人点赞

没有讨论,发表一下自己的看法吧

推荐文章
自己撸一个 LaraDock(使用 Docker LNMP 部署 PHP 开发环境)

项目简介 DockerLNMP是基于docker-compose开发的运行在Docker上的LNMP开发环境,包含PHP、MySQL、Redis等镜像并支持多版本切换,满足您的学习、开发和测试需求。

一键“脱”衣应用DeepNude迅速下线,来看看它涉及的图像修复技术

大数据文摘出品来源:Github发布者:yuanxiaosc上周,又一AI偏门应用DeepNude爆出,一键直接“脱掉”女性的衣服,火爆全球。应用也很容易上手,只需要给它一张照片,即可借助神经网络技术

为什么使用div css布局?

提起DIV+CSS组合,还要从XHTML说起。XHTML是一种在HTML(标准通用标记语言的子集)基础上优化和改进的新语言,目的是基于XML应用与强大的数据转换能力,适应未来网络应用更多的需求。为什么

Qt on Linux 使用deb打包发布

DistributeQtAPPonPPAofUbuntuusingthe.debpackage.[Abstract]:在QtonLinux上开发程序完成后需要脱离本机所营造的开发库环境变量运行,则需要

js和jquery的区别是什么?

JavaScript和jQuery的区别:一、本质上的区别:js是网页脚本语言,而jQuery是基于js语言封装出来的一个前端框架。也就是说js是一种语言,而jQuery是基于该语言的一种框架。二、用

jquery的$什么意思?

jquery的$什么意思?在jQuery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法。(相关课程推荐:jQu

jquery的作用是什么?

jquery的作用是什么?下面就是jQuery的具体作用:1、取得页面中的元素。如果不使用JavaScript库,遍历DOM(DocumentObjectModel,文档对象模型)树,以及查找HTML

vuejs和jquery的区别是什么?

vuejs和jquery的区别1、jQuery首先要获取到dom对象,然后对dom对象进行进行值的修改等操作2、Vue是首先把值和js对象进行绑定,然后修改js对象的值,Vue框架就会自动把dom的值

ajax与jquery的区别是什么?

jQuery是javascript的一个框架,也就是有人做好了很多功能,你直接拿来用就好了。比如实现Ajax。纯javascript,你可能需要些好多函数,来新建对象,捕捉事件,处理异常等。但用jQu

如何使用jQuery的插件?

如何使用jQuery的插件?例如:需要使用表单插件,按下列步骤就可实现插件的调用:(1)在页面中导入包含表单插件的JS文件,并确定它定位与主jQuery库后,其代码如下: (2)在JS文件或页面J

jquery的$是什么?

jquery的$是什么?$就是jQuery的别称,而jQuery就是jQuery库提供的一个函数。这个函数的作用是根据()里的参数进行查找和选择html文档中的元素,函数作用之一就是GetElemen

react和jquery的区别是什么?

首先我们要注意的是,虽然我们这里把React和JQuery拿到一个台面上来说,但是这两者是有本质区别的。React是一个UI库,但是JQuery更多的知识一个工具库或者说是插件库,我们之所以把这两者谈

jquery的url参数乱码怎么解决?

URL地址栏传递字符(中文、=、&)乱码解决办法1、使用encodeURI()方法encodeURI()方法可把字符串作为URI进行编码,转码之后就不会乱码,同时如果传递参数中包含&、=等特殊字符转码

vue与jquery的区别是什么?

vue与jquery的区别是什么?vue和jquey的对比:jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DO

对话OceanBase资深总监韩鸿源:数据库是技术能力,云是使用方式,两者不应是竞争关系

5月10日,在第十届中国数据库技术大会(DTCC2019)上,蚂蚁金服的金融级分布式关系数据库OceanBase2.0,在经过200名数据库领域三年以上的从业者投票和专业评委的评选下,高分荣获了“年度

详解 | 阿里怎么做双11全链路压测?

导读:全链路压测是阿里的首创,本文将从工作内容、操作过程、运行总结等多个方向来介绍下阿里内部典型电商活动(如双11准备),以给大家展示一个完整的压测流程,帮助更多的企业和用户更好的完成性能测试。前言关

秘籍在手,训练不愁!特斯拉AI负责人Karpathy的超全神经网络训练套路

大数据文摘出品编译:周素云、宋欣仪、熊琰、ZoeY、顾晨波训练神经网络到底有诀窍和套路吗?AndrejKarpathy认为,还的确有。这位特斯拉的人工智能研究负责人、李飞飞的斯坦福高徒刚刚难得更新了博

基于Redis实现Spring Cloud Gateway的动态管理

引言:SpringCloudGateway是当前使用非常广泛的一种API网关。它本身能力并不能完全满足企业对网关的期望,人们希望它可以提供更多的服务治理能力。但SpringCloudGateway并不

JSON.parse和JSON.stringify的巧用

JSON.parse和JSON.stringify是对json数据的转换,在js中使用的频率还是非常高的,比如localStorage,cookie中对复合型数据的存储,与服务器进行数据交互的格式转换

JSON.parse和JSON.stringify的巧用

JSON.stringify()是将一个JavaScript值(对象或者数组)转换为一个json字符串,如果指定了replacer是一个函数,则可以选择性地替换值,或者如果指定了replacer是一个

使用 Docker 创建 Hyperf 项目

@[TOC]安装Hyperf开发容器dockerrun-d--nameuser_center\ --restart=always\ #映射到宿主机目录,这样我们就直接在/home/wwwroot/us

使用kubei一步部署k8s高可用集群(包含docker安装、k8s组件安装、master初始化和加入nodes节点)

kubei(kubernetesinstaller)是一个go开发的用来部署kubernetes高可用集群的命令行工具,该工具可在Windows、Linux、Mac中运行kubei原理:通过ssh连接

如何成为一名优秀的CTO?需要具备哪些能力?

如何成为一名优秀的CTO?需要具备哪些能力?CTO简单来说就是技术总负责人。那么在自己的专业领域,一定要拥有拔尖的知识技能。除此之外,广阔的技术性视野,与CEO良好的伙伴关系,前瞻性的商业思维以及不断

红帽OpenShift得到IBM、AWS和Azure的支持,生态能力正不断扩大

继IBM在11月6日宣布,IBMCloudPaks容器云的底层技术通过红帽OpenShift来支持后;AWS也于11月7日表示,原生集成AWS服务的红帽OpenShift容器平台已可用于由光环新网技术

两年Flink迁移之路:从standalone到on yarn,处理能力提升五倍

一、背景与痛点在2017年上半年以前,TalkingData的AppAnalytics和GameAnalytics两个产品,流式框架使用的是自研的td-etl-framework。该框架降低了开发流式