提示:本文基于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 测试结果
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 模式测试结果
注意:此模式下后台会打印日志如下:
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;
- 阿根廷输了。
以上。