- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已经尝试了几种方法来找到这个问题的根源,但我一无所知。
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/
我是一个使用 Python 和 PyGTK 的 Linux 软件项目的开发人员。我们正在编写的程序依赖于许多第三方包,这些包可通过所有 mayor 发行版存储库获得。其中之一是 python 绑定(b
我是一名优秀的程序员,十分优秀!