gpt4 book ai didi

performance - 使用 Docker 对简单的 Go 服务器造成巨大的性能影响

转载 作者:IT王子 更新时间:2023-10-29 01:44:18 26 4
gpt4 key购买 nike

我已经尝试了几种方法来找到这个问题的根源,但我一无所知。

Here's the Go program.它只是一个文件,并且有一个接受 POST 请求的 /api/sign 端点。这些 POST 请求在正文中有三个字段,它们被记录在一个 sqlite3 数据库中。非常基本的东西。

I wrote a simple Dockerfile to containerize it.使用 golang:1.7.4 构建二进制文件并将其复制到 alpine:3.6 以获得最终图像。再一次,没什么特别的。

我使用 wrk基准性能。 8 个线程和 1k 个连接,持续 50 秒(wrk -t8 -c1000 -d50s -s post.lua http://server.com/api/sign)和 a lua script为了创建发布请求,我测量了不同情况下每秒的请求数。在所有情况下,我都从我的笔记本电脑上运行 wrk,服务器位于离我很近的 DigitalOcean VPS(2 个 vCPU、2 GB RAM、SSD、Debian 9.4)中。

  • 直接运行二进制文件产生 2979 个请求/秒

  • Docker(docker run -it -v $(pwd):/data -p 8080:8080 image)产生了179 个请求/秒。。

如您所见,Docker 版本比直接运行二进制文件慢 16 倍以上。在这两个实验中,其他一切都是一样的。

我尝试了以下方法,但 Docker 版本的性能几乎没有任何改进:

  • 尝试使用主机网络而不是网桥。略有增加,大约 190 个请求/秒,但仍然很糟糕。

  • 尝试使用 --ulimit nofile=262144:262144 增加容器版本中文件描述符的数量限制。没有改善。

  • 尝试了不同的 go 版本,没有。

  • 尝试使用 debian:9.4 而不是 alpine:3.7 作为最终图像,希望 musl 的表现非常出色。这里也没有。

  • (编辑)尝试在没有安装卷的情况下运行容器,但性能仍然没有提高。

我现在没主意了。任何帮助将不胜感激!

最佳答案

使用内存中的 sqlite3 数据库完全解决了所有性能问题!

db, err = sql.Open("sqlite3", "file=dco.sqlite3?mode=memory")

我知道 Docker 的抽象会导致磁盘 I/O 损失(甚至在 Linux 上;我听说在 macOS 上更糟),但我不知道会达到 ~16 倍。

编辑:在大多数情况下,使用内存数据库并不是真正的选择。所以我找到了另一个特定于 sqlite 的解决方案。在所有数据库操作之前,执行此操作以将 sqlite 切换到 WAL 模式而不是默认的回滚日志:

PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;

这显着提高了 Docker 版本的性能,超过 2.7k 请求/秒!

关于performance - 使用 Docker 对简单的 Go 服务器造成巨大的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50686570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com