[转帖]13 个 QA 带你了解线上压测的知识点

qa,了解,知识点 · 浏览次数 : 0

小编点评

**线上压测系统设计问题解答** 1. **为什么要进行线上压测?** - 在某些活动、大促前,评估机器扩容数量。 2. **区别链路压测和接口压测?** -链路压测全链路串联,同时施压,尽可能模拟真实用户行为;接口压测仅针对接口,并可能因为数据库连接等共享资源,导致实际 QPS 下降。 3. **如何识别压测流量?** - 在请求 URL 中添加标记参数,例如 `st=truehearder`。 4. **如何保证往下游发请求时,仍然是压测标记的形式?** - 使用 threadLocal 或阿里的 TransmittableThreadLocal 等技术保存和传递压测标记。 5. **如何处理外部服务的接口请求?** - 在链路跟踪系统中新增 MockFilter,判断请求是否为压测请求,并返回 mock 逻辑。 6. **数据库的影响?** - 为每个生产库生成一个影子库,用于存储压测数据,并进行分库分表处理。 7. **如何处理中间件的特殊处理?** - 在中间件中添加 MockFilter,判断请求是否为压测请求,并返回 mock 逻辑。 8. **压测结束如何避免对数据库继续产生影响?** - 停止发送数据源的 init-method 方法,并确保会话连接。 9. **如何构造压测数据?** - 从线上直接 dump 最近的请求数据,并做一些脱敏和修正处理。 10. **如何设计压测系统架构?** - 可以参考《超大流量分布式系统架构解决方案》一书中给出的方案,也可以有其他方案。 11. **如何模拟实际用户的请求发送?** - 使用 apache HttpComponents 的 `HttpClient` 支持 HTTP/2,支持用 reactive stream。 12. **如何模拟多个不同 ip 的用户访问进来才对?** - 使用 Apache HttpComponents 的 `HttpClient` 支持 HTTP/2,支持用 reactive stream。

正文

https://my.oschina.net/u/4526289/blog/5586897

 

 
摘要:设计一个线上压测系统能让我们学习到多少东西?这 13 个问题看你能否搞定。

本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13 个问题看你能否搞定》,作者:breakDawn。

Q: 为什么需要线上压测?

A:

  1. 需要在某些活动、大促前,评估机器扩容数量,验证系统能否有效支撑流量峰值。
  2. 线下测试环境的机器资源有限, 无法完全模拟现网。 同时很多配置可能配置不相同,如果没对上导致机器数量估计错误,可能引发重大故事。所以必须要在线上做压测。

Q: 全链路压测和接口压测的区别?

A:
在特定的业务场景下,将相关的链路完整地串联起来同时施压,尽可能模拟出真实的用户行为。
接口 A 做接口压测,可能是 1w/s 的 QPS, 但是 A 和 B 同时压测,可能因为数据库连接等共享资源,导致实际 QPS 下降。

Q: 业务系统如何区分压测流量?即判断哪些是压测的请求,哪些是正常的请求?

A:

  1. url 上加上打标参数, 例如 http://xx?st=true
  2. hearder 中打标

Q: 这个压测打标的改造和适配要中间所有服务参与吗? 改造成本会不会有点大?

A:
不需要全部参与。

如果设计过链路跟踪系统, 则每个服务都有中间件团队提供的拦截器, 因此直接通过公共拦截器来做压测标记的识别。

Q: 识别到压测标记后, 如何保证往下游发请求时,仍然是压测标记的形式?

即发请求的时候已经不是同一段拦截器的代码了。 但是也要保证尽可能不改动原有的业务逻辑代码。

A:
如果处理请求和发下游请求是在一个线程中完成的, 那么可以使用 threadLocal。
即拦截到请求时, 将压测标记 set 进 threadLocal 中。
发送下游请求的代码中,如果能从 threadLocal 中拿到压测标记,则改造 url,设置进往下发的请求中

Q: 如果我不在同一个线程中处理和发请求, 怎么办?

即我的业务代码中 做了 new Thread 或者 ExectorPool.submit 提交异步请求, 这时候业务逻辑里肯定不会涉及到 threadLocal 的代码, 而此时压测标记就会丢失了。

threadLocal 可以用 InheriableThreadLocal, 这样如果在线程中 new 新的线程,则标记可以被传递下来。
如果是线程池创建异步请求, 可以用阿里的 TransmittableThreadLocal。

Q: 如果我的压测链路中 包含了外部服务的接口怎么办? 例如第三方支付、第三方短信等。

A:
链路跟踪系统中发请求的 filter 中, 新增 MockFilter, 如果判断是压测请求, 则直接返回 mock 逻辑(不建议部署 mock 服务, 因为部署 mock 服务的话,服务器成本又得考虑,不如直接封装到 mockFilter 代码中)

Q: 会对数据库产生影响的压测请求怎么办?

如果直接落库,可能会影响正常用户的请求访问, 也可能污染线上数据。
A:
为每个生产库 生成一个影子库, 专门用来存储压测数据。

然后做过分库分表的话, 肯定有数据库的 proxy,在 proxy 里都往压测库插入和读写。
如果没有,就扩展 Spring 的 AbstactRoutngDataSource 类, 实现一个动态的数据源,让里面可以根据压测标记进行切换。

Q: redis、kafka 等中间件对压测有什么特殊处理?

A:
除了添加统一特点的压测标记(中间件和业务不是强相关,所以可以进行特定改造)
还要注意缓存的存活时间要设置短一点。

Q: 压测结束时,如何避免对数据库继续产生影响?

A:
注意不要触发 数据源的 init-method 方法, 当真正执行压测的时候再建议会话连接。
各种超期时间也要注意设置, 尽快接触压测对组件的影响。

Q: 压测数据怎么构造?一个个手动拼数据参数,然后让测试同学发送吗?

A:
不行,如果业务有改动,参数很容易对不上,同时组装过程耗时也会非常久。

建议从线上直接 dump 最近的请求数据,这样可保证参数没有变化。
同时做一些脱敏和修正处理。

Q: 怎么完整设计这个压测系统的架构?包含哪些角色

A:
该问题参考《超大流量分布式系统架构解决方案》一书中给出的方案,也可以有其他方案。

  1. 压测 manager 服务, 提供给压测控制者查看和使用的。可以读取 mysql 数据库获取压测结果情况,或者进行调度指令的下发等。
  2. taskService 服务,用于处理调度指令,执行定时调度、即时调度等行为。
  3. Agent 压测请求发送客户端。根据 taskService 的指令进行发送
  4. DataFactoy,给 agent 提供脱敏、修改后的压测数据。
  5. MQ, 接收 agent 压测请求的结果,堆积到队列里提供给 DataCollect 消费。
  6. DataCollect, 压测结果消费者, 将结果写入到数据库 MYSQL。
  7. 注册中心,用于管理和注册上面这些服务。
  8. Detecotr, 流量检测和干预器,可以根据情况即时调整 agent 的发送速率。
 

Q: 怎么模拟实际用户的请求发送? 因为实际场景应该是多个不同 ip 的用户访问进来才对。

A:

  • apache HttpComponents 的 httpclient 包
  • Java11 的异步 httpclient, 支持 HTTP/2, 支持用 reactive stream。

与[转帖]13 个 QA 带你了解线上压测的知识点相似的内容:

[转帖]13 个 QA 带你了解线上压测的知识点

https://my.oschina.net/u/4526289/blog/5586897 摘要:设计一个线上压测系统能让我们学习到多少东西?这 13 个问题看你能否搞定。 本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13 个问题看你能否搞定》,作者:breakDawn。 Q:

[转帖]Shell 脚本中经典的13个面试题

经典的Shell十三问 1. 为何叫做shell?2. Shell prompt(PS1)与Carriage Return(CR)的关系?3. 别人echo, 你也echo, 是问echo知多少?4. ""(双引号)与(单引号)有什么区别?5. var=value? export前后差在哪?6. e

[转帖]工信部电子标准院授予阿里巴巴9个开源项目“优秀”评级

http://blog.itpub.net/31545803/viewspace-2932061/ 1月13日消息,工信部电子标准院近日公布第二批通过开源项目成熟度评估的开源项目名单,阿里巴巴主导的Flink、Dubbo、龙蜥操作系统、Seata、Nacos等多个开源项目获得“优秀”评级。 电子标准

[转帖]50个应知必会的Linux常识和操作

1.存放用户账号的文件在哪里? /etc/passwd 1 2.如何删除一个非空的目录? rm -rf 目录名 1 3.查看当前的工作目录用什么命令? pwd 1 4.创建一个文件夹用什么命令? mkdir 1 5.哪个Linux命令可以一次显示一页内容?上一页和下一页使用什么命令? more Sp

[转帖]CentOS-7-x86_64-DVD-2009 rpm包列表(centos7.9)

https://www.cnblogs.com/hiyang/p/14803391.html 文件数 4071 个,共3.8G 复制389-ds-base-1.3.10.2-6.el7.x86_64.rpm 389-ds-base-libs-1.3.10.2-6.el7.x86_64.rpm Cen

[转帖]CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9)

CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9) 共10073个文件 复制389-ds-base-1.3.10.2-6.el7.x86_64.rpm 389-ds-base-devel-1.3.10.2-6.el7.x86_64.rpm 389-ds

[转帖]MySQL pid 和 socket 文件说明

2021-10-13 11:595110转载MySQL 1 pid-file文件 MySQL 中的 pid 文件记录的是当前 mysqld 进程的 pid ,pid 亦即 Process ID 。可以通过 pid-file 参数来配置 pid 文件路径及文件名,如果未指定此变量,则 pid 文件默认

[转帖]Linux 磁盘I/O 调度算法 说明

2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

[转帖]Goproxy.cn

用法 Go 1.13 及以上(推荐) 打开你的终端并执行 $ go env -w GO111MODULE=on $ go env -w GOPROXY=https://goproxy.cn,direct 完成。 macOS 或 Linux 打开你的终端并执行 $ export GO111MODULE

[转帖]Redis 性能优化的 13 条军规!史上最全

https://zhuanlan.zhihu.com/p/118532234 Redis性能优化实战方案 Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O