经过3个月的努力开发&将公司API从PHP切换到Go我发现我们的Go服务器无法处理超过20 req /秒。
基本上我们的API如何运作:
因此,在编写了大约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可以做得更好。
有关服务器和设置的基本信息:
我们正在使用的外部库:
github.com/go-sql-driver/mysql
github.com/gorilla/mux
github.com/elgs/gosqljson
任何可能导致此问题的想法? 。我看了一下这个post但是没有像我上面提到的那样工作我从来没有得到任何MYSQL错误。提前感谢您提供的任何帮助。
答案 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次查询,以查看一旦建立了数据库连接池后并发请求需要多长时间;现在你基本上测试了构建数据库连接池需要多长时间。