为什么Docker比在主机上运行多种语言要慢得多?

时间:2019-06-23 09:05:50

标签: python performance docker go

自从我开始进行任何后端开发工作以来,我一直使用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")
}

0 个答案:

没有答案