SLB 压力测试

2021/08/01 slb pressure test 共 1994 字,约 6 分钟

如何进行压力测试 {#concept_lqx_1fd_xdb .concept}

压力测试性能概述 {#section_rnj_cfd_xdb .section}

四层负载均衡采用开源软件 LVS(Linux Virtual Server)+ Keepalived 的方式实现负载均衡,七层负载均衡由 Tengine 实现。其中四层监听经过 LVS 后直接到达后端服务器,而七层监听经过 LVS 后,还需要再经过 Tengine,最后达到后端服务器。七层比四层多了一个处理环节,因此,七层性能没有四层性能好。

如果您使用七层监听进行压来测试,发现根本跑不上去,挂了两台 ECS 的七层负载均衡监听性能还不如一台 ECS 的性能,除了七层本身的性能比四层低外,以下情况也可能会造成七层测压性能低:

  • 客户端端口不足

尤其容易发生在压测的时候,客户端端口不足会导致建立连接失败,负载均衡默认会抹除 TCP 连接的 timestamp 属性,Linux 协议栈的 tw_reuse(time_wait 状态连接复用) 无法生效,time_wait 状态连接堆积导致客户端端口不足。

解决方法:客户端端使用长连接代替短连接。使用 RST 报文断开连接(socket 设置 SO_LINGER 属性),而不是发 FIN 包这种方式断开。

  • 后端服务器 accept 队列满

后端服务器 accept 队列满,导致后端服务器不回复 syn_ack 报文,客户端超时

解决方法:默认的 net.core.somaxconn 的值为 128,执行 sysctl -w net.core.somaxconn=1024 更改它的值,并重启后端服务器上的应用。

  • 后端服务器连接过多

由于架构设计的原因,使用七层负载均衡时,用户长连接经过 Tengine 后变成短连接,可能造成后端服务器连接过多,从而表现为压测性能上不去。

  • 后端服务器依赖的应用成为瓶颈

请求经过负载均衡达到后端服务器后,后端服务器本身负载都正常,但由于所有的后端服务器上的应用又依赖其它应用,比如数据库,数据库成为瓶颈,也会引起性能低。

  • 后端服务器的健康检查状态异常

尤其在压测的时候容易忽略后端服务器的健康检查状态,如果有后端服务器健康检查失败或者健康检查状态经常跳跃(好到坏,又从坏到好,反复变化)也会导致性能跑不上去。

压力测试建议 {#section_unj_cfd_xdb .section}

在进行压力测试,注意如下配置:

  • 压测负载均衡转发能力建议使用短链接

一般来说压测除了验证会话保持,均衡性等功能外,主要想验证的是负载均衡的转发能力,因此使用短链接比较合适,用于测试负载均衡和后端服务器处理能力。但使用短连接测试时注意上述的客户端端口不足问题。

  • 压测负载均衡吞吐量建议使用长连接,用于测试带宽上限或特殊业务

压测工具的超时时间建议设置为一个较小值(5 秒)。超时时间太大的话,测试结果会体现在平均 RT 加长,不利于判断压测水位是否已到达。超时时间调小,测试结果会体现在成功率上,便于快速判断压测水位。

  • 后端服务器提供一个静态网页用于压测,以避免应用逻辑带来的损耗

  • 压测时,监听配置建议如下:

    • 不开启会话保持功能,否则压力会集中在个别的后端服务器。
    • 监听关闭健康检查功能,减少健康检查请求对后端服务器的访问请求。
    • 用多个客户端进行进行压测最好多于 5 个,源 IP 分散,能够更好的模拟线上实际情况。

      压力测试工具建议 {#section_xnj_cfd_xdb .section}

      不建议您使用 Apache ab 作为压力测试工具。

Apache ab 在大量并发场景下存在 3s,6s,9s 阶梯式停顿的现象。Apache ab 会通过判断 content length 来确定请求是否成功,而负载均衡挂载多台后端服务器时,返回的 content length 会不一致,导致测试结果有误。

可以选择多个客户端作为压力测试源,测试结果清晰,并且可以通过配置监控,获取压力测试时后端服务器的性能数据。

使用 PTS 简单压测示例 {#section_ynj_cfd_xdb .section}

创建一个负载均实例,添加两台 ECS 实例作为后端服务器,分别创建一个 TCP 监听和 HTTP 监听,后端端口设置为 80。ECS 服务器的配置为 CPU 1 核,内存 512M 使用 CentOS 6.3 64 位的操作系统。

  1. 安装 Apache Web Server 提供 Web 服务。
    yum install -y httpd

  2. 初始化默认首页 index.html。
    echo "testvm" > /var/www/html/index.html

  3. 启动 HTTP 服务。
    service httpd start

  4. 访问本地的 80 端口,确认 Web 服务可用。
    curl localhost

  5. 在 PTS 中创建测试脚本,开始压力测试。
    注意关闭长连接和设置超时时间:

    • 设置超时时间为 5 秒: PTS.HttpUtilities.setTimeout(5000)
    • 关闭长连接: PTS.HttpUtilities.setKeepAlive(False)

文档信息

Search

    Table of Contents