NLB压力测试的方法

NLB具备超高性能和自动弹性能力。实际业务场景中如您有NLB压力测试需求,可参考本文进行压力测试。

压测拓扑

以下为您介绍标准压测拓扑和单VIP压测拓扑。通常情况下,默认使用标准压测流程,在少数场景中可选择单VIP压测流程,具体请查看压测方法可能导致压测性能低的原因

  • 标准压测拓扑

    image
  • 单VIP压测拓扑

    image

压测方法

压测指标说明

NLB有三个关键指标:新建连接数、并发连接数和处理数据量(请求和响应)。每一个指标的压测方法不一样。

  • 压测新建连接数指标建议使用短连接,用于测试负载均衡服务与后端服务器的新建处理能力。

    建议使用简单的心跳服务测试,减少过多的带宽消耗带来的影响。使用短连接测试时,需要注意客户端端口不足的问题。

  • 压测并发连接数指标建议使用长连接,用于测试负载均衡服务与后端服务器的并发处理能力。

    每一条长连接建议使用简单的心跳服务测试,起到保活会话的作用。使用长连接测试高并发能力时,同样需要注意客户端端口不足的问题。

  • 压测处理数据量建议使用长连接,用于测试带宽上限或特殊业务。

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

监听配置建议

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

性能测试服务的5000并发规格能够提供5个及5个以上的公网IP。

服务器组配置建议

压测时,服务器组配置建议如下。

  • 不建议使用基于源地址的一致性哈希调度算法,否则压力会集中在个别后端服务器上。如果需要会话保持,可以选择四元组哈希(源IP地址、目标IP地址、源端口、目标端口),以增加哈希值的多样性。调度算法请参考负载均衡调度算法介绍

  • 建议关闭健康检查功能,减少健康检查对后端服务器的访问请求。

  • 开启“客户端源地址保持”功能时,建议使用单VIP压测拓扑。若使用标准压测拓扑,当压测使用的客户端数量较少或使用基于源地址的一致性哈希调度算法时,会增加后端服务器会话冲突的可能性。

  • 关闭“客户端源地址保持”功能时,此时NLB会使用自身IP与后端服务器建立连接,因为系统为每个NLB实例提供的源地址有限,需要保证足够的后端压测服务器数量,避免并发连接数受限。

压测工具建议

  • 建议您使用阿里云PTS:可以设置足够高的并发,PTS会分配来自全国各地的公网IP,压力来源足够分散,并且可以在PTS中集成云监控,实时查看端到端的全部性能数据。

  • 不建议您使用Apache ab作为压力测试工具:Apache ab在大量并发场景下存在3秒、6秒、9秒阶梯式停顿的现象。Apache ab会通过判断content length来确定请求是否成功,而NLB挂载多台后端服务器时,返回的content length会不一致,导致测试结果有误。

使用PTS简单压测示例

创建一个NLB实例,并为该NLB实例添加一个TCP 80监听和TCPSSL 443监听,TCP监听和TCPSSL监听均添加了两台ECS实例作为后端服务器,后端端口均设置为80。

ECS服务器的配置为CPU 2核,内存2 GiB且使用CentOS 7.9 64位的操作系统。分别登录这两台ECS实例,执行以下步骤安装Web服务并完成压测。关于如何登录ECS,请参见ECS远程连接操作指南

  1. 执行以下命令,安装Apache Web Server提供Web服务。

    sudo yum install -y httpd
  2. 执行以下命令,初始化默认首页index.html。

    sudo echo "testvm" > /var/www/html/index.html
  3. 执行以下命令,启动HTTP服务。

    sudo systemctl start httpd
  4. 执行以下任意一条命令,访问80端口确认Web服务可用。

    curl http://localhost

    curl http://127.0.0.1:80
  5. 在PTS中创建测试场景,开始压力测试。具体操作请参见如何在一分钟内发起压测?

可能导致压测性能低的原因

若发现压测性能低,可能是以下原因造成的:

  • 客户端端口不足

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

    解决方法:客户端使用长连接代替短连接。使用RST报文断开连接,即socket设置SO_LINGER属性。

  • 后端服务器accept队列满

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

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

  • 后端服务器数量较少

    关闭服务器组的客户端地址保持功能,NLB会使用自身地址与后端服务器建立连接,默认情况下一个后端服务器支持12万并发连接,如果后端服务器数量较少,也会限制并发连接的压测性能。

    解决方法:如果是TCP或UDP监听,建议打开服务器组的客户端地址保持功能;如果是TCPSSL监听,建议增加NLB后端服务器数量或搭配弹性伸缩。

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

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

    解决方法:根据实际情况清理后端服务器上不需要的应用。

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

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

    解决方法:建议关闭健康检查功能,减少健康检查对后端服务器的访问请求。

  • 后端服务器会话冲突

    若使用标准压测拓扑,当压测使用的客户端数量较少或使用基于源地址的一致性哈希调度算法时,会提升后端服务器会话冲突的可能性,从而出现后端服务器频繁使用RST报文断开连接的情况,如下图所示。

    image

    解决方法:建议使用单VIP压测拓扑。单VIP压测拓扑图,请参见压测拓扑