首页 > 其他分享 >OpenResty压测工具界的 “悍马”

OpenResty压测工具界的 “悍马”

时间:2024-09-01 10:36:32浏览次数:12  
标签:OpenResty 压测 悍马 worker wrk ms 请求

在上篇文章 每个后端都应该了解的 OpenResty 入门以及网关安全实战 中,我向大家介绍了 OpenResty 的入门使用是 WAF 防御实战,这篇文章将给大家继续介绍 OpenResty 入门之性能测试 篇。

性能测试是软件开发中不可或缺的一环,它可以帮助我们评估系统的性能、稳定性、可扩展性等指标,为优化和改进提供依据。但是,性能测试也是最容易失准的一种测试,因为它受到很多因素的影响,例如网络环境、服务器配置、压测工具、压测场景等。如果我们选择了不合适的压测工具或者没有设计好压测场景,那么我们得到的结果可能会与实际情况相差甚远,甚至导致错误的判断和决策。

俗话说工欲善其事必先利其器,那么如何选择一款合适的压测工具呢?首先 OpenResty 是 fork 自 Nginx 开发,基于 Nginx 原有的强悍性能(协程 + IO 多路复用 Epoll),其性能就不会差。所以我们需要的是一款自身性能足够强悍,可以最大程度榨干 OpenResty 程序性能、服务端 cpu 资源的压测工具。

这里给大家介绍一款压测工具界的“悍马” —— wrk。wrk 是一款针对 HTTP 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。wrk 支持 Lua 脚本来创建复杂的测试场景(这一点与 OpenResty 支持 Lua 脚本相同),也可以输出详细的响应时间统计信息。wrk 的优点有以下几点:

高性能:wrk 可以利用多核 CPU 的并行计算能力,同时使用多个线程和连接来发送请求,并且使用高效的 I/O 模型来处理响应。这样,wrk 可以在单机上产生高达数十万甚至数百万级别的 QPS(每秒请求数),远超过其他常见的压测工具,如 ab、siege、jmeter 等。
灵活:wrk 支持使用 Lua 脚本来定制压测场景,例如自定义 HTTP 方法、动态生成请求参数、修改请求头等。这样,我们可以模拟各种复杂和真实的用户行为和业务逻辑,使得压测结果更加贴近实际情况。
简洁:wrk 的安装和使用都非常简单,只需要几条命令就可以完成。wrk 的输出也非常清晰和直观,可以显示每个线程和总体的响应时间和每秒请求数,并且可以打印出响应时间的分布情况,方便我们分析系统的性能瓶颈。
wrk 的安装
wrk 只能被安装在类 Unix 系统上,所以我们需要一个 Linux 或者 MacOS 环境。Windows 10 安装需要开启自带的 Ubuntu 子系统。

Linux 安装
对于 Ubuntu/Debian 系统,可以通过以下命令安装 wrk:

sudo apt-get install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git wrk
cd wrk
make

将可执行文件移动到 /usr/local/bin 位置

sudo cp wrk /usr/local/bin
对于 CentOS / RedHat / Fedora 系统,可以通过以下命令安装 wrk:

sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git
git clone https://github.com/wg/wrk.git wrk
cd wrk
make

将可执行文件移动到 /usr/local/bin 位置

sudo cp wrk /usr/local/bin
MacOS 安装
Mac 系统也可以通过先编译的方式来安装,但是更推荐使用 brew 的方式来安装, 步骤如下:

安装 Homebrew,安装方式参考官网 https://brew.sh (也就一行命令的事);
安装 wrk: brew install wrk;
Windows 10 安装
Windown 10 需要在 Windows 功能 里勾选 适用于 Linux 的 Windows 子系统, 然后通过 bash 命令切换到 Ubuntu 子系统。接下来,参考 Linux 安装 的操作步骤,安装 wrk。

压测前准备
在开始压测前,我们还需要对测试环境进行一番调整,已配合压测工具 wrk 榨干 OpenResty 程序的性能。

单进程最大文件数
Linux 系统默认对每个进程能够打开的文件数有一个限制,通常是 1024 个。这个限制会影响到服务器能够同时处理的连接数,因此需要增加这个限制。增加的方法是修改 /etc/security/limits.conf 文件,添加如下内容:

  • soft nofile 65535
  • hard nofile 65535
    其中 * 号表示修改所有用户的限制,soft 或 hard 指定要修改软限制还是硬限制,65536 则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

这样就可以将所有用户的单进程最大打开文件数限制设为 65535 个。如果还不够,可以继续增大这个值,但要注意不要超过系统级的最大打开文件数限制,可以通过 cat /proc/sys/fs/file-max 命令查看这个限制。

最大打开文件数
查看 Linux 系统级的最大打开文件数限制,使用如下命令:

[root@VM-16-5-centos ~]# cat /proc/sys/fs/file-nr
2112 0 369508
这里的最后一个数字,就是最大打开文件数。如果你的机器中这个数字比较小,那就需要修改 /etc/sysctl.conf 文件来增大:

fs.file-max = 1020000
net.ipv4.ip_conntrack_max = 1020000
net.ipv4.netfilter.ip_conntrack_max = 1020000
修改完以后,还需要重启系统服务来生效:

sysctl -p /etc/sysctl.conf
Nginx 工作进程数量以及连接数
最后,我们还需要对 Nginx 的配置文件做一些修改,如下:

配置工作进程数量

worker_processes 1;

...

events {
# 单个工作进程处理连接数量
worker_connections 1024;
}
默认情况下 Nginx 有 master 和 worker 两种进程,master 进程用于管理 worker 进程,worker 进程用于处理外部请求也就是对外提供服务。

worker_processes 1 的配置说明工作进程数默认为 1。在多核机器上我们可以设置为服务器 CPU 的核数以提升 Nginx 的连接处理数。

worker_connections 1024 的配置说明单个进程能处理的连接数量是 1024,在大压力场景下,我们可以提升这个值,改为 10240。

最后,优化的 Nginx 配置文件如下:

根据cpu核数自动设置工作进程数量

worker_processes auto;

...

events {
# 单个工作进程处理连接数量
worker_connections 10240;
}
wrk 的使用
wrk 的基本用法是:

wrk
其中, 是一些可选的参数,用来控制压测的配置, 是要压测的目标网址。

常用参数
wrk 支持以下常用参数:

-c, --connections :指定要保持打开的连接数;
-d, --duration :指定压测的持续时间;
-t, --threads :指定要使用的线程数;
-s, --script :指定要加载的 Lua 脚本文件;
-H, --header :指定要添加到请求中的 HTTP 头;
--latency:指定要打印响应时间统计信息;
--timeout :指定套接字/请求超时时间;
其中,数字参数可以使用 SI 单位(1k, 1M, 1G),时间参数可以使用时间单位(2s, 2m, 2h)。

压测示例
现在我们要对 OpenResty 程序的 hello 接口进行压测,我们可以使用以下命令:

wrk -c 100 -d 30s -t 4 --latency http://121.4.xxx.xx/hello
这条命令表示,利用 wrk 发起压力测试,连接数为 100,线程数为 4,持续 10 秒,并打印响应时间统计信息。

运行后,我们可以看到以下输出:

Running 30s test @ http://121.4.xxx.xx/hello
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 60.74ms 94.62ms 1.82s 88.81%
Req/Sec 710.91 118.29 1.02k 69.08%
Latency Distribution
50% 26.22ms
75% 32.99ms
90% 176.28ms
99% 475.41ms
84967 requests in 30.02s, 15.40MB read
Socket errors: connect 0, read 0, write 0, timeout 2
Requests/sec: 2829.91
Transfer/sec: 525.08KB
我们可以从输出中看到以下信息:

压测的配置和目标网址,
Running 30s test @ http://121.4.xxx.xx/hello
4 threads and 100 connections
每个线程的平均、标准差、最大和正负一个标准差占比的响应时间(Latency),
Latency 60.74ms 94.62ms 1.82s 88.81%
这个数据和 QPS 一样重要,表示系统的响应速度,这个值越小越好。

响应时间的分布情况:即有多少比例的请求在某个时间内完成,延时的分布百分比详细打印也就是下面展示信息,
Latency Distribution
50% 26.22ms
75% 32.99ms
90% 176.28ms
99% 475.41ms
总的请求数,
Requests/sec: 2829.91
这个数据表示服务端每秒钟处理了多少请求,这个值越大越好。

从这些信息中,我们可以看出 OpenResty 程序的性能还是很不错的,响应时间都在几毫秒级别,QPS 也很高。

鉴于我的 OpenResty 服务器配置只有 2核4g内存5MB带宽,测试结果大家理性看待,欢迎大家自己测试。

Lua 脚本
wrk 支持使用 Lua 脚本来定制压测场景,例如自定义 HTTP 方法、动态生成请求参数、修改请求头等。这样,我们可以模拟各种复杂和真实的用户行为和业务逻辑,使得压测结果更加贴近实际情况。wrk 的源码中提供了一些示例脚本,可以参考 https://github.com/wg/wrk/tree/master/scripts。

要使用 Lua 脚本,我们需要在命令行中指定 -s 参数,并给出脚本文件的路径。例如我们可以使用 post.lua 脚本来发送 POST 请求:

wrk -c 100 -d 10s -t 4 -s post.lua http://121.4.xxx.xx/hello
其中,post.lua 的内容如下:
//代码效果参考:https://www.xx-ph.com/sitemap/post.xml
wrk.method = "POST"
wrk.body = "name=tom"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
这样,我们就可以模拟发送 POST 请求携带表单数据的场景。

一些常见问题
如何选择合适的参数?
wrk 的参数会影响压测的结果,因此我们需要根据实际情况选择合适的参数。一般来说,我们可以参考以下步骤:

先使用单线程不断增加连接数,直到 QPS(每秒请求数)保持稳定或响应时间超过业务要求限制。在当前数值取得单线程最优连接数。
单个连接线程数保持不变,不断增加线程数(建议到 CPU 核心数为止即可),直到整体出现 QPS 水平。
如果 QPS 没有出现随着线程数增长则是目标服务器性能已经达到瓶颈,wrk 单线程即可压测出目标机器最优 QPS 值。
如果 QPS 随着线程数增长则是 wrk 本机性能达到瓶颈,需要增加 wrk 机器数或者更换更高性能的 wrk 机器。
如何解决压测过程中出现的错误?
wrk 在压测过程中可能会出现一些错误,例如连接超时、连接拒绝、连接重置等。这些错误可能是由于目标服务器的性能不足、网络环境不稳定、防火墙限制等原因造成的。我们可以尝试以下方法来解决或减少错误:

调整 wrk 的参数,例如减少连接数、增加超时时间等;
检查目标服务器的资源使用情况,例如 CPU、内存、磁盘、网络等,优化服务器的配置或扩容服务器;
检查网络环境,例如带宽、延迟、丢包等,优化网络设备或更换网络线路;
检查防火墙设置,例如端口开放、流量限制等,放开 wrk 的访问权限或关闭防火墙;
总结
wrk 在对 OpenResty 程序的压测过程中,不失所望表现出了强大压测性能。希望通过本篇文章能让大家对 wrk 性能测试工具有一个较为全面的认识。

标签:OpenResty,压测,悍马,worker,wrk,ms,请求
From: https://www.cnblogs.com/longshao2024/p/18391074

相关文章

  • 性能测试教程3:性能测试执行教程从数据准备到压测执行
    性能测试环境准备一、操作系统--生产环境常用Linux前置--学习《Linux计算机操作系统基础知识》Linux_测试媛小七的博客-CSDN博客没有合适资料的同学可以跟着我的linux专栏内容学习1、Centos72、非Linux-可以安装虚拟机二、性能测试环境:服务器配置1、硬件型号测试环境于......
  • jmeter压测组件bzm-Arrivals Thread Group使用Jenkins运行配置
    jmeter脚本设置Jenkins设置运行代码设置cd/home/jmeterWorkplace/performceTps/script/home/app/apache-jmeter-5.4.3/bin/jmeter-n-tjenkins_test.jmx-Jtarget_rate=${target_rate}-Jramp_up_time=${ramp_up_time}-Jramp_up_step_count=${ramp_up_step_count}-Jh......
  • 一次实战压测流程及问题梳理
    1、背景及目的在动手之前,先要想清楚我们期望从压测中获取的价值是什么。这次压测的背景,主要是为了应对旺季到来,避免旺季的大量流量和高并发造成服务不可用,提升稳定性。而在稳定性建设中,也会从事前、事中及事后来看,包含的维度包含风险识别、监控告警、应急流程及故障复盘等不同的......
  • jmeter做分布式压测时的注意事项
    分布式压测注意事项:1、保持Contorller和Agent机器的JDK、jmeter以及插件等配置版本一致;2、如果测试数据有用到CSV或者其他方式进行参数化,需要将data?pools在每台Agent上复制一份,且读取路径必须保持一致;否则会出现取不到数据的情况,造成压测失败;3、确保Contorller和Agent机器在同一......
  • 吉利星越L满载30吨侧翻顶压测试疑似“翻车”
    近日,一台星越L挑战满载30吨侧翻顶压,疑似“翻车”,但让人没想到的是,相关专家竟然按照稿子宣读挑战成功。从视频看,这台参与挑战的星越L被标注满载30吨的大货车侧翻后压顶,然而从视频里很明显能够看出,伴随着女主持人的尖叫声,星越L的驾驶位一侧的A、B柱均有明显的变形。这样......
  • openresty通过lua实现ip地址hash
    实验环境:root@paas-test-ubuntu:/opt/openresty#bin/openresty-Vnginxversion:openresty/1.25.3.2builtbygcc11.4.0(Ubuntu11.4.0-1ubuntu1~22.04)builtwithOpenSSL3.0.215Mar2022TLSSNIsupportenabledconfigurearguments:--prefix=/opt/openresty/n......
  • 谷粒商城实战笔记-145-性能压测-性能监控-jvisualvm使用-解决插件不能安装
    文章目录jvisualvm的作用安装查看gc相关信息的插件解决jvisualvm不能正常安装插件的问题1,查看java版本2,打开网址3,修改jvisualvm的设置jvisualvm的作用JVisualVM是一个集成在JavaDevelopmentKit(JDK)中的多功能工具,它提供了一种可视化的方式来监控和分析Java应用......
  • 安规测试-耐压测试
    一、为什么要测电介质强度电力系统在运行中由于雷击、操作不当、故障或电气设备的参数配合不当等原因,引起系统中某些部分的电压突然升高,大大超过其额定电压,这就是过电压。过电压按其发生的原因可分为两大类,一类是由于直接雷击、雷电感应等由雷而引起的过电压,称为外部过电压。雷电......
  • 家用仪器血压测量仪电子方案
    血压仪,又称血压测量仪,是一种专门用于测量人体血压水平的医疗设备。现代化血压测量仪设备已深度融合了智能技术,其利用先进的传感器和通信技术,测量和检测用户的血压值,为临床诊断、疾病预防、健康管理提供关键数据。血压测量仪的工作原理是通过检测血管内血液对血管壁的压力来测......
  • locust多进程实现分布式压测遇到的问题
    多进程分布式的实现:locust分布式时,需借助命令locust一个一个启动worker,在使用中有点繁琐,下面借助于多进程,按既定worker数量,一键启动;fromlocustimportFastHttpUser,task,User,events,HttpUser#classWebsiteUser(FastHttpUser):错误的使用!!!classWebsiteUser(......