wrk http压测工具安装及简单对比go、gin、php、lumen

提示:本文基于macos系统。

背景:wrk 是一个比较先进的 HTTP 压力测试工具,当在单个多核 CPU 上运行时,能够产生大量负载。它结合了多线程设计和可扩展的事件通知系统,例如 epoll 和 kqueue。

1. wrk压测工具的安装

	brew install wrk

在这里插入图片描述
在这里插入图片描述

2. wrk相关命令及含义

wrk只能直接使用get、delete请求;post请求需要用到lua脚本。

一般设置的线程数是电脑核数的2-4倍

get请求: wrk -c100 -t10 -d10s --latency http://www.baidu.com
# 100个请求分10个线程压10秒

命令解释如下 Options:
-c, --connections <N> 跟服务器建立并保持的TCP连接数量

-d, --duration <T> 压测时间

-t, --threads <N> 使用多少个线程进行压测

-s, --script <S> 指定Lua脚本路径

-H, --header <H> 为每一个HTTP请求添加HTTP头

--latency 在压测结束后,打印延迟统计信息

--timeout <T> 超时时间

-v, --version 打印正在使用的wrk的详细版本信息

<N>代表数字参数,支持国际单位 (1k, 1M, 1G)

<T>代表时间参数,支持时间单位 (2s, 2m, 2h)

结果说明:
Avg(平均值) 
Stdev(标准差) 
Max(最大值)
+/- Stdev (正负一个标准差所占比例) 
Latency(延迟)  
Req/Sec (每秒请求数)  
Requests/sec: 300.56 (QPS 300.56,即平均每秒处理请求数为300.56) 
Transfer/sec: 3.64MB (平均每秒流量2.64MB)

3. 测试机器配置

在这里插入图片描述

4. 测试场景一:go net/http

4.1 测试代码

package main

import (
	"io"
	"log"
	"net/http"
)

func helloWorld(wr http.ResponseWriter, r *http.Request) {
	wr.WriteHeader(200)
	io.WriteString(wr, "hello world")
}

func main() {
	http.HandleFunc("/", helloWorld)
	err := http.ListenAndServe(":9000", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

4.2 测试结果

go net/http服务 压测3次

5. 测试场景二:go gin 框架

5.1 gin debug 模式测试代码

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "hello world",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

5.2 gin debug 模式测试结果

go gin服务压测3次
注意:此模式下后台会打印日志如下:
在这里插入图片描述

5.3 gin release 模式测试代码

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	gin.SetMode(gin.ReleaseMode)
	r := gin.New()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "hello world",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

5.4 gin release 模式测试结果

在这里插入图片描述

6. 测试场景三:php -S

6.1 php测试代码

echo json_encode(['msg'=>"hello world"]);

6.2 php服务启动

php -S localhost:8080 -t ./      

6.3 php测试结果

在这里插入图片描述
注意:此模式下后台会打印日志如下:
在这里插入图片描述

7. 测试场景四:php lumen框架

7.1 lumen测试代码

namespace App\Http\Controllers\Test;

use App\Http\Controllers\Controller;

class TestController extends Controller
{
    public function index()
    {
        echo json_encode(['msg'=>'hello world']);
    }
}

7.2 lumen服务启动

php -S localhost:8080 -t public/   

7.3 lumen测试结果

在这里插入图片描述
注意:此模式下后台会打印日志如下:
在这里插入图片描述

8. 结论

提示:此测试方案和测试环境不够严谨和科学,只供大家学习和参考;php的生产模式和开发模式差异比较大

  • php使用fpm启动200个php进程,再进行nginx反向代理下,性能上2000qps应该不成问题;(4核8G Linux)
  • php lumen再同等环境下,再做一些优化,可能上到800qps;(4核8G Linux)
  • go net/http 轻松上到50000qps,但现实开发中大多数还是会用到框架;
  • go gin框架 居然也能到50000qps,其实底层还是net/http;
  • 阿根廷输了。

以上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小镇学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值