performance - Go http 服务器基准测试性能慢

标签 performance http go webserver

我试图找出 go 网络服务器的最大吞吐量。我在一台 8 核机器(Intel Xeon 2.5 Mhz)上运行 simplewebserver 并在另一台 8 核机器上运行 wrk 工具。 Iperf 命令显示这些机器之间大约有 8-10Gbps。最初,我犯了一个错误,使用每秒仅提供 16k 请求的 apache ab 工具。问题与 link 相同.现在,当我切换到 wrk 工具时,我每秒收到大约 90k 个请求,大约 11MB/秒。

在第一个 8 核机器上,我运行了 simplewebserver.go

package main

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

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!")
}

 func main() {
    runtime.GOMAXPROCS(8)
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8000", nil)
 }

在不同的 8 核机器上,我运行

 ./wrk -t8 -c1000 -d10s http://10.0.0.6:8000/

结果:

Running 10s test @ http://10.0.0.6:8000/
8 threads and 1000 connections
Thread Stats   Avg      Stdev     Max   +/- Stdev
Latency    42.65ms  114.89ms   1.96s    91.33%
Req/Sec    11.54k     3.01k   25.10k    74.88%
923158 requests in 10.10s, 113.57MB read
Socket errors: connect 0, read 0, write 0, timeout 20
Requests/sec:  91415.11
Transfer/sec:     11.25MB

我可以说我已经达到了 golang 网络服务器的最大吞吐量吗?我得到 11 MB/秒,这对于基本程序来说看起来很小。如果我在 www.google.com 页面上运行 wrk 工具,我将获得大约 200 MB/秒的速度。即使对于像 kafka(java 服务器)这样的大型复杂计算系统,基准测试结果也超过 70 MB/秒(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。 golang 服务器如何处理每秒数百万个请求的极端工作负载(至少超过 100MB/秒)?我的任何假设都错了吗?

更新:

我在具有相同规范的 16 核机器上运行相同的程序。我将 maxprocs 更改为 16,结果提高到 120k 请求/秒。我觉得我已经达到了 golang http 服务器的最大值,因此我没有发现请求/秒有任何显着增加。

最佳答案

Golang net/http 相当慢。如果目标是最大化请求率,则还有其他实现。例如https://github.com/valyala/fasthttp在我的测试中,fasthttp 使查询率翻了一番。我的测试是一个简短的请求和简短的回复。

该库有一些限制,例如不支持 HTTP/2。如果您需要 REST API 的 HTTP 并且您不寻求互操作性,fasthttp 将非常适合

关于performance - Go http 服务器基准测试性能慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37714210/

相关文章:

java - 执行乘法最有效的方法是什么?

tsql - IN或OR哪个更快?

java - 如何发送带有 json 正文和 url 参数的 http 帖子?

asp.net-mvc - '以另一个用户身份登录' MVC 4 Windows 身份验证

rest - 通过 REST 上传/下载大文件

go - 使用 go-git 获取文件的平面列表

java - Java 世界中的一毫秒有多长?

java - 在Java中将大写字母转换为小写字母并将小写字母转换为大写字母的最快方法

go - 为什么go module伪版本有特定的版本?

string - Golang中的Scanln不接受空格