我试图对一个简单的“你好世界”进行基准测试。 go
中的HTTP服务器。
我做了两次测试:
在第一次设置时,我可以达到18k req / sec。 在第二个,1.6k req / sec。
源代码:(来自:https://golang.org/doc/articles/wiki/)
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
对这种巨大的性能差异有什么解释吗?
PS:
基准工具:https://github.com/wg/wrk
另外,一个重要的事情是:Elastic beanstalk总是添加nginx作为它的应用程序的反向代理(对于Go应用程序我无法删除它)
在第一次设置时,根本没有nginx。
答案 0 :(得分:2)
简短的回答:你没有测量同样的事情。在您自己的实例上,您测量了本机Go Web服务器,而在Beanstalk上,您使用本机Go Web服务器测量了Nginx。
答案很长:
如果您在单实例配置中使用AWS Elastic Beanstalk,则会收到与使用EC2时完全相同的实例。 您不会在单个实例Beanstalk环境前收到Elastic Load Balancer。
如果您正在使用Beanstalk,您将获得预部署的nginx(如您所述)。 Nginx对性能有重大影响,特别是在单CPU配置中,与m3.medium实例一样。
您测量的性能影响决不是由Beanstalk直接引起的,而是由您的部署配置引起的。 为避免性能下降,您可以选择使用本机Go Web服务器。
为了支持我的推理,我运行了一些测试来证明性能。 通过在与工作负载所在的同一数据中心中的EC2 m3.medium实例上运行wrk来生成以下数字。
我在Beanstalk上安装了与本机EC2实例相同的Go应用程序,并且我安装了一个与Beanstalk使用的配置相同的NGINX服务器。
./wrk http://<server>/ --duration 20s --connections 300
Beanstalk m3.medium instance DIRECT: 9230.52 Requests / sec
Beanstalk m3.medium instance NGINX: 1502.14 Requests / sec
EC2 m3.medium instance DIRECT: 13649.46 Requests / sec
EC2 m3.medium instance NGINX: 2489.78 Requests / sec