全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
负载均衡

如何进行压力测试

更新时间:2017-07-06 16:29:42

压力测试性能概述

负载均衡四层采用开源软件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后变成短连接,可能造成后端服务器连接过多,从而表现为压测性能上不去。

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

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

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

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

压力测试建议

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

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

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

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

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

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

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

    • 不开启会话保持功能,否则压力会集中在个别的后端服务器。

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

    • 用多个客户端进行进行压测最好多于5个,源IP分散,能够更好的模拟线上实际情况。

压力测试工具建议

不建议使用Apache ab。

ab在大并发场景下存在问题,会存在3s,6s,9s阶梯式停顿的现象。ab会通过判断content length来确定请求成败,在负载均衡挂载多台后端服务器的时候,返回的content length不一致,会干扰到测试结果

建议使用阿里云PTS

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

使用PTS简单压测示例

创建一个负载均实例,添加两台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)

本文导读目录