Почему докер намного медленнее, чем работает на хосте для нескольких языков? - PullRequest
0 голосов
/ 23 июня 2019

С тех пор, как я начал выполнять какую-либо бэкэнд-разработку, я всегда использовал docker, и я полагаю, всегда предполагал, что его производительность была почти на том же уровне, что и запуск на хосте.Я в основном использовал python для всех API-интерфейсов типа REST бэкэнда, и недавно начал изучать go, так как кажется, что это приятная черта простоты написания и поддержки, и в то же время намного проще получить параллелизм, паралели и скорость.

Поэтому, так как я никогда не запускал python на моей хост-системе (я недавно использовал Mac), я никогда не проверял разницу с тем, что он находится в докере или хосте, но с golang я фактически сначала установил его в своей системе, что затем привело меня кпричина, по которой я задаю этот вопрос;

Разница в производительности огромна, поэтому при запуске apache bench на python или golang, с очень простой программой, возвращающей привет-мир 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).

Но затем, выполняя те же тесты с тем же кодом, но на докере, я получил для python 2838.99 [#/sec] (mean)и Голанг 2987.05 [#/sec] (mean).

Моя первая мысль была из-за того, что у докера не было достаточно ресурсов, но вышеописанные тесты были выполнены с полными 8 ядрами, 8 гигабайтами оперативной памяти и 4-гигабайтным свопом, выделенным для докера (в значительной степени максимальные суммы), затем это былобыло ли это потому, что код был в томе, поэтому я зафиксировал контейнер с кодом внутри, затем запустил контейнер без тома и просто использовал порты, что не имело никакого значения, поэтому я не понимаю, почему существует такойогромная разница, как эта?

Я надеюсь, что это просто проблема 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")
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...