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

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

我正在尝试在 go 中对一个简单的“hello world”HTTP 服务器进行基准测试。 我做了 2 个测试:

  1. 使用亚马逊 ec2 - m3.medium 实例
  2. 使用 amazon elastic beanstalk - 也使用 m3.medium 单实例

在第一个设置中,我可以获得高达 18k 请求/秒。 在第二个,1.6k 请求/秒。

源代码:(来自: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)
}

如此巨大的性能差异有什么解释吗?

附言: 基准工具:https://github.com/wg/wrk
此外,一件重要的事情是:Elastic beanstalk 总是添加 nginx 作为其应用程序的反向代理(对于 Go 应用程序,我无法删除它) 在第一个设置中,根本没有 nginx。

最佳答案

简短的回答:你测量的不是同一件事。在您自己的实例上,您测量了 native Go Web 服务器,而在 Beanstalk 上,您测量了 Nginx 以及后面的 native Go Web 服务器。

长答案:

如果您在单实例配置中使用 AWS Elastic Beanstalk,您将收到与使用 EC2 时完全相同的实例。 您不会在单实例 Beanstalk 环境前收到 Elastic Load Balancer。

如果您使用的是 Beanstalk,您将获得一个预部署的 nginx(正如您已经说过的)。 Nginx 对性能有重大影响,尤其是在 m3.medium 实例的单 CPU 配置中。

您测量的性能影响绝不是由 Beanstalk 直接造成的,而是由您的部署配置造成的。 为避免这种性能下降,您可以选择使用 native Go Web 服务器。


为了支持我的推理,我运行了一些测试来演示性能。 以下数字是通过运行 wrk 生成的在与工作负载位于同一数据中心的 EC2 m3.medium 实例上。

我在 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

关于performance - 在 elastic beanstalk 上运行 Golang 应用程序时是否存在任何性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232925/

相关文章:

go - 如何删除golang上 slice 之间的重复元素

Android 在水平和垂直方向上适合所有设备布局的正确方法

macos - OS X 上的 Docker 和文件共享

c++ - Arpack++ 稀疏特征求解器比等效的 Matlab eigs() 慢很多倍

postgresql - 在 RDS Postgres 上禁用触发器

go - 如何在 go 中实现碎片化的配置文件验证

c - 优化这个将在 C 中运行大量次的小函数

amazon-web-services - AWS ELB 终端问题背后的 Jupyter notebook

javascript - aws-serverless-express 连接到 mongo 并获取 mongo 文档

pointers - 带指针的 Golang 类型断言