在弹性beanstalk上运行Golang应用程序时是否存在任何性能问题?

时间:2017-02-14 17:50:07

标签: performance amazon-web-services go elastic-beanstalk

我试图对一个简单的“你好世界”进行基准测试。 go中的HTTP服务器。 我做了两次测试:

  1. 使用amazon ec2 - m3.medium实例
  2. 使用亚马逊弹性豆茎 - 也可以使用m3.medium单个实例
  3. 在第一次设置时,我可以达到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。

1 个答案:

答案 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