自从我开始进行任何后端开发工作以来,我一直使用docker,而且我猜一直认为它的性能几乎与在主机上运行它的水平相同。我几乎所有后端REST类型api都使用python,并且最近开始学习go,因为它似乎达到了易于编写和维护的优点,同时更易于获得并发性,并行度和速度。
因此,由于从未在主机系统上运行python(最近我使用的是Mac),所以我从未检查过将其放在docker或主机中的区别,但是使用golang,我实际上首先将其安装在系统上,然后导致我是出于我发布此问题的原因;
性能差异很大,因此在python或golang上运行apache bench,并在我的主机系统上通过一个非常简单的程序返回了hello world json,
ab -T application/json -c 100 -n 5000 http://192.168.1.5:8080/test
对于python,我有一个13359.20 [#/sec] (mean)
和一个golang 16940.54 [#/sec] (mean)
。
但是随后用相同的代码进行了相同的测试,但是在docker上,我得到了python 2838.99 [#/sec] (mean)
和golang 2987.05 [#/sec] (mean)
。
我的第一个想法是由于docker没有足够的资源,但是上述测试是在将8个内核,8个ram内存和分配给docker的4gb交换(最大数量)下完成的,这是否就是因为代码在一个卷上,所以我提交了包含代码的容器,然后在没有卷且只使用端口的情况下运行了容器,这没有什么区别,所以我不知道为什么会有如此大的差异这样吗?
我希望这只是一个Mac问题,因为我使用Mac的时间并不长。稍后,我将在Linux服务器上测试相同的东西,但是,即使是这种情况,我仍然想知道为什么会有如此大的差异。
我使用的两个测试代码是:
# python3
from japronto import Application
async def hello(request):
return request.Response(json={"japronto": "hello world!"})
app = Application()
app.router.add_route('/test', hello)
app.run(debug=True)
和
# golang
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
gin.SetMode(gin.ReleaseMode)
r := gin.New()
r.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{
"golang": "hello world!",
})
})
r.Run(":8080")
}