当前位置: 首页 > 面试题库 >

去HTTP服务器测试AB vs WRK结果差异很大

唐高卓
2023-03-14
问题内容

我正在尝试查看go HTTP服务器可以在我的计算机上处​​理多少个请求,因此我尝试进行一些测试,但是两者之间的差异是如此之大,以至于我感到困惑。

首先,我尝试使用ab进行测试并运行此命令

$ ab -n 100000 -c 1000 http://127.0.0.1/

进行1000个并发请求。

结果如下:

Concurrency Level:      1000
Time taken for tests:   12.055 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      12800000 bytes
HTML transferred:       1100000 bytes
Requests per second:    8295.15 [#/sec] (mean)
Time per request:       120.552 [ms] (mean)
Time per request:       0.121 [ms] (mean, across all concurrent requests)
Transfer rate:          1036.89 [Kbytes/sec] received

每秒8295个请求,这似乎很合理。

但是然后我尝试使用以下命令在wrk上运行它:

$ wrk -t1 -c1000 -d5s http://127.0.0.1:80/

我得到这些结果:

Running 5s test @ http://127.0.0.1:80/
  1 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    18.92ms   13.38ms 234.65ms   94.89%
    Req/Sec    27.03k     1.43k   29.73k    63.27%
  136475 requests in 5.10s, 16.66MB read
Requests/sec:  26767.50
Transfer/sec:      3.27MB

每秒26767个请求?我不明白为什么会有如此大的差异。

运行的代码是最简单的Go服务器

package main

import (
    "net/http"
)

func main() {

    http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        w.Write([]byte("Hello World"))
    })

    http.ListenAndServe(":80", nil)
}

我的目标是查看随着我增加内核数量,go服务器可以处理多少个请求,但这在我什至开始增加更多CPU能力之前就相差太大了。有谁知道Go服务器在添加更多内核时如何扩展?还有为什么AB和WRK之间的巨大差异?


问题答案:

首先:基准测试通常是虚假的。一旦开始添加数据库调用,模板渲染,会话解析等,发送回几个字节将为您 带来 截然不同的结果(请注意数量级的差异)

然后解决本地问题-开发机器与生产之间的开放文件/套接字限制,基准测试工具(ab / wrk)与Go服务器之间的资源竞争,本地环回适配器或OS
TCP堆栈(以及TCP堆栈调整) ),等等。

此外:

  • ab 不被高度重视
  • 仅HTTP / 1.0,因此不执行keepalive
  • 您的其他指标差异很大-例如,查看每个工具报告的平均延迟-绝对延迟要高得多
  • 您的ab测试也可以运行,12s而不是5swrk测试。
  • 甚至8k req / s都是巨大的负载- 每小时2800 万个 请求。即使在进行数据库调用,整理JSON结构等之后降至3k / req / s,您仍然能够处理大量负载。尽早不要太拘泥于这些基准。

我不知道您使用的是哪种机器,但我的3.5GHz i7-4771的iMac可以在单线程上以每秒64k req / s的速度响应,并响应
w.Write([]byte("Hello World\n"))

简短答案:使用wrk并牢记基准测试工具存在很大差异。



 类似资料:
  • 测试这种服务的基本策略是验证请求的内容(正确的URL),并确保我们模拟到服务中的数据通过正确的方法正确返回。 wikisearch.ts 我们的测试策略是检查服务是否已请求正确的网址,一旦我们回复了模拟数据,我们就要验证它是否返回相同的数据。

  • 问题内容: 我使用了getests和gorilla mux,并且可以对我的http handlefunc处理程序进行单元测试,但是它们没有像在大猩猩mux下那样响应正确的http请求方法。如何进行“实时服务器”版本的测试? 这里的问题是该函数同时响应get和post请求,而没有考虑我的主路由器。这对于单元测试功能是很好的,但是我认为最好编写一个集成测试来测试整个事情并一次性解决所有问题。 问题答案

  • 不是只使用,我们使用来包装它并完成依赖并在异步过程中执行测试。 使用需要我们返回一个Promise,我们通过调用或者来解决我们的测试的competition ,这取决于我们测试的结果。

  • 我想从控制器和服务层测试相同的方法。问题是:为什么我必须在控制器中使用注释,为什么不为使用注释。对于服务,同样的问题是,为什么我需要存储库,为什么不使用?你能告诉我这两者的区别吗? 这里是控制器: 这里是服务类: 服务测试: 控制器测试:

  • ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。 语法 ab [ -A auth-username:password ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -g gnuplot-

  • 我在运行jsp文件时遇到这种错误。我已经使用MySQL连接器进行了连接。 HTTP状态500-javax。servlet。ServletException: com.mysql.jdbc.exceptions.jdbc4。未知数据库/test类型异常报告 消息javax。servlet。ServletException:com。mysql。jdbc。例外情况。jdbc4。MySQLSyntaxEr