我试图找到Go Web服务器的最大吞吐量。我在一台8核机器(Intel Xeon 2.5 Mhz)上运行了simplewebserver,并在另一台8核机器上运行了wrk工具。Iperf命令显示这些机器之间的速度约为8-10Gbps。最初,我犯了一个错误,使用apache ab工具只能提供16k个请求/秒。问题与link相同。现在当我切换到wrk工具时,我每秒获得约90k个请求和~11MB /秒。
在第一台8核机器上,我运行了simplewebserver.go。
我能否说该Golang Web服务器已达到最大吞吐量?我的基本程序只能获得11MB / sec,看起来非常小。如果在www.google.com页面上运行wrk工具,则获得约200MB / sec。即使对于像Kafka(Java服务器)这样的更大复杂计算系统,基准测试结果也可超过70MB / sec(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。如何才能使Golang服务器处理数百万次每秒的极端工作负载(最少100MB / sec)?我有任何错误的假设吗?
更新:
我在一个16核机器上用相同规格运行了相同的程序。我将maxprocs更改为16,结果提高到120k个请求/秒。我感觉已经达到了Golang http服务器的最大值,因此在请求/秒中没有找到任何显着的增加。
在第一台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 Web服务器已达到最大吞吐量?我的基本程序只能获得11MB / sec,看起来非常小。如果在www.google.com页面上运行wrk工具,则获得约200MB / sec。即使对于像Kafka(Java服务器)这样的更大复杂计算系统,基准测试结果也可超过70MB / sec(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。如何才能使Golang服务器处理数百万次每秒的极端工作负载(最少100MB / sec)?我有任何错误的假设吗?
更新:
我在一个16核机器上用相同规格运行了相同的程序。我将maxprocs更改为16,结果提高到120k个请求/秒。我感觉已经达到了Golang http服务器的最大值,因此在请求/秒中没有找到任何显着的增加。