Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我们的服务器每秒不能处理超过20个请求_Mysql_Go - Fatal编程技术网

Mysql 我们的服务器每秒不能处理超过20个请求

Mysql 我们的服务器每秒不能处理超过20个请求,mysql,go,Mysql,Go,因此,经过3个月的艰苦工作,我发现我们的Go服务器不能处理超过每秒20个请求 因此,我们的API基本上是如何工作的: 接受请求 验证请求 使用MYSQL从数据库中获取数据 把数据放在地图上 以JSON格式将其发送回客户端 因此,在编写了大约30个API之后,我决定对它进行一番研究,看看它在负载测试下的性能如何 测试1:ab-n1-c1结果是每个请求的时间:平均72.623[ms] 测试2:ab-n100-c100结果是每个请求的时间:4548.155[ms]表示没有MYSQL错误 在第二次测试中

因此,经过3个月的艰苦工作,我发现我们的Go服务器不能处理超过每秒20个请求

因此,我们的API基本上是如何工作的:

接受请求 验证请求 使用MYSQL从数据库中获取数据 把数据放在地图上 以JSON格式将其发送回客户端 因此,在编写了大约30个API之后,我决定对它进行一番研究,看看它在负载测试下的性能如何

测试1:ab-n1-c1结果是每个请求的时间:平均72.623[ms]

测试2:ab-n100-c100结果是每个请求的时间:4548.155[ms]表示没有MYSQL错误

在第二次测试中,这个数字是如何突然从72.623上升到4548毫秒的?。我们预计每天会有数千个请求,所以我需要在最终发布之前解决这个问题。当我看到这些数字时,我很惊讶;我简直不敢相信。我知道围棋可以做得更好

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

使用GO 1.5 16GB内存 GOMAXPROCS正在使用全部8个内核 db.setMaxidlecons1000 db.SetMaxOpenConns1000还确保我们正在使用 连接 通过unix套接字连接到MYSQL 系统在Ubuntu下运行 我们正在使用的外部库:

github.com/go-sql-driver/mysql

github.com/gorilla/mux

github.com/elgs/gosqljson


你知道这是什么原因吗。我看了一下这个,但没有工作,正如我上面提到的,我从来没有得到任何MYSQL错误。提前感谢您提供的任何帮助。

您的帖子没有足够的信息来说明为什么您的程序没有达到预期效果,但我认为仅此问题就值得回答:

在第二次测试中,这个数字是如何突然从72.623上升到4548毫秒的

在第一次测试中,您只执行了一个请求-n1。在第二次测试中,您在飞行中同时执行了100个请求-C100-N100

如果您提到您的程序与外部数据库通信,那么您的程序必须等待该资源响应。当您同时向数据库发送1000个请求时,您是否了解数据库的性能?你没有提到这件事。Go当然可以在一秒钟内处理数百个并发请求,而不费吹灰之力,但这取决于您正在做什么以及如何做。如果您的程序不能像请求进来时那样快地完成请求,它们会堆积起来,导致很高的延迟


您告诉我们的这些测试对于了解服务器在正常情况下的性能都没有帮助,您说每天会有数千个请求,这不是很具体,但我的意思是,几秒钟。然后看看-c 4-n 1000,或者一些在较长时间内运行服务器的东西,以及一些更像您期望得到的并发请求,会更有趣。

我不熟悉gosqljson包,但是你说你的查询本身并不复杂,你是在一个结构良好的DB表上运行它的,所以我建议删除gosqljson并将你的查询结果绑定到结构,然后将这些结构编组到json。这应该比使用map[string]接口{}来处理所有事情更快,并且产生更少的内存波动

但我不认为gosqljson可能会那么慢,所以它可能不是罪魁祸首

你做第二个基准的方式是没有帮助的

测试2:ab-n 100-c 100


这并不是测试您处理并发请求的速度,而是测试您连接MySQL的速度。您只需要执行100个查询,使用100个请求,这意味着Go可能要花费大部分时间来建立多达100个到MySQL的连接。考虑到它为满足每个查询所做的所有其他工作,Go可能甚至没有时间重用任何db连接,然后,boom,测试结束了。您需要将max connections设置为50,并运行10000个查询,以查看一旦建立了数据库连接池,并发请求需要多长时间;现在,您基本上正在测试建立一个数据库连接池需要多长时间。

我相信您理解,如果不了解更多关于正在做什么的信息,我们几乎无话可说。你描述它的方式听起来太简单了,不会那么慢。database/sql已经有了连接池,所以如果你在上面写了某种类型的池,它会伤害你。您应该只需要在流程的生命周期中调用sql.Open一次。如果您的sql非常重要,那么您可能无法从MySQL获得更多的吞吐量。MySQL在并发复杂查询方面并不总是有很好的性能。当你说把它放到一个映射中时,这可能意味着什么。为什么不分析一下子组件并更好地解决它呢查询本身就是
不太复杂。只需从结构良好的DB表中选择查询。需要0.06才能运行而不是缓存。当然,当DB缓存这个数字时,这个数字会下降。常见问题包括:为每个请求创建新的数据库池,而不是重复使用池成员;b将数千行复制到新地图/切片中;c反映太多。这么说来,4548ms是一个很大的问题,很可能是由于网络级别的某种原因造成的。MySQL是否配置为允许超过100个CONN?谢谢您的输入,先生。但是,我能够使用Mock DB response精确定位问题。不调用DB函数,我每秒收到7000个请求。然而,当我调用QueryDbToMap时,该数字下降到每秒20个请求。我试着自己运行这个查询,它需要0.06才能运行而不是缓存。我用模拟数据库响应运行了相同的测试,每秒得到5821个请求。如果你不得不猜测你每秒可以处理多少个请求;一个结构良好的DB表将是什么?