我们的服务器无法处理超过20个请求/秒

时间:2015-08-29 22:14:36

标签: mysql go

经过3个月的努力开发&将公司API从PHP切换到Go我发现我们的Go服务器无法处理超过20 req /秒。

基本上我们的API如何运作:

  • 接受请求
  • 验证请求
  • 使用MYSQL从数据库中提取数据
  • 将数据放入地图
  • 以JSON格式将其发送回客户端

因此,在编写了大约30个API之后,我决定将其用于旋转,并了解它在负载测试下的性能。

测试1: ab -n 1 -c 1 http://localhost:8000/sales/report结果为"每次请求的时间:72.623 [ms](平均值)" 。

测试2: ab -n 100 -c 100 http://localhost:8000/sales/report结果为"每次请求的时间:4548.155 [ms](平均值)" (没有MYSQL错误)。

在第二次测试中,这个数字是如何从72.623突然增加到4548毫秒?我们预计每天会有数千个请求,因此我需要在最终发布之前解决此问题。当我看到数字时,我很惊讶;我无法相信。我知道GO可以做得更好。

有关服务器和设置的基本信息:

  • 使用GO 1.5
  • 16GB RAM
  • GOMAXPROCS正在使用所有8个核心
  • db.SetMaxIdleConns(1000)
  • db.SetMaxOpenConns(1000)(也确保我们正在使用池 连接)
  • 通过unix socket连接到MYSQL
  • 系统在Ubuntu下运行

我们正在使用的外部库:

  • github.com/go-sql-driver/mysql

  • github.com/gorilla/mux

  • github.com/elgs/gosqljson

任何可能导致此问题的想法? 。我看了一下这个post但是没有像我上面提到的那样工作我从来没有得到任何MYSQL错误。提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

您的帖子没有足够的信息来说明您的计划未按预期执行的原因,但我认为这个问题值得回答:

  

在第二次测试中,这个数字是如何从72.623突然增加到4548毫秒?

在第一次测试中,您执行了一个请求(-n 1)。在第二次测试中,您同时执行了100次飞行请求(-c 100 -n 100)。

您提到您的程序与外部数据库通信,您的程序必须等待该资源响应。当您同时向其发送1,000个请求时,您是否了解数据库的执行情况?你没有提到这个。 Go一定可以一秒钟处理数百个并发请求而不会出汗,但这取决于您正在做什么以及您是如何做的。如果你的程序无法以最快的速度完成请求,它们就会堆积起来,导致高延迟。

您告诉我们的这些测试都没有用于了解您的服务器在“正常”情况下的表现 - 您说这将是“每天数千个请求”(这不是非常具体,但我会采取意思是“几秒钟”)。那么看一下-c 4 -n 1000或者在更长的时间内运行服务器的东西会更加有趣,其中包含许多并发请求,这更像是你期望得到的。

答案 1 :(得分:0)

我不熟悉gosqljson包,但是你说你的“查询本身并不是很复杂”而且你是针对“结构良好的数据库表”运行的,所以我建议删除gosqljson和绑定您的查询结果为结构,然后将这些结构编组到json。与使用map [string] interface {}相比,这应该更快并且引起更少的内存抖动。

但我不认为gosqljson可能 慢,所以它可能不是主要罪魁祸首。

您进行第二次基准测试的方式没有帮助。

  

测试2:ab -n 100 -c 100 http://localhost:8000/sales/report

这不是测试你可以多快地处理并发请求,而是测试你连接到MySQL的速度有多快。您只需要执行100次查询并使用100个请求,这意味着Go可能会花费大部分时间与MySQL建立100个连接。 Go可能甚至没有时间重用任何数据库连接,考虑到它为满足每个查询而做的所有其他事情,然后,繁荣,测试结束了。您需要将最大连接数设置为50并运行10,000次查询,以查看一旦建立了数据库连接池后并发请求需要多长时间;现在你基本上测试了构建数据库连接池需要多长时间。