我正试图在go中对一个简单的’hello world’HTTP服务器进行基准测试.
我做了2次测试:
>使用amazon ec2 – m3.medium实例
>使用亚马逊弹性豆茎 – 也使用m3.medium单个实例
在第一次设置时,我可以达到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.
最佳答案 简短的回答:你没有测量同样的事情.在您自己的实例上,您测量了本机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