С тех пор, как я начал выполнять какую-либо бэкэнд-разработку, я всегда использовал 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")
}