docker-compose - MySQL 5.7 Docker 版本的事务低于 localhost 版本
问题描述
我的虚拟机是 Ubuntu 18.04,我安装了 2 个 MySQL 5.7 实例。
第一个安装在 localhost(端口 3306)中,第二个通过 docker-compose 安装(端口 57306)。配置 cnf(来自 localhost 版本的默认安装)都是相同的。
Docker 版本只有1700 个事务,而 localhost 版本只有 4100 个事务。
我的问题是,为什么 docker 版本慢很多,配置都一样,可能是什么问题?
我通过以下命令使用 sysbench 测试本地主机(端口 3306):
# prepare
sysbench --table_size=1000000 --db-driver=mysql --mysql-db=sysbench --mysql-user=root --mysql-password=<pass> /usr/share/sysbench/oltp_read_only.lua prepare
# run
sysbench --table_size=1000000 --db-driver=mysql --mysql-db=sysbench --mysql-user=root --mysql-password=<pass> --time=60 --max-requests=0 --threads=8 /usr/share/sysbench/oltp_read_only.lua run
我得到了4100 笔交易
SQL statistics:
queries performed:
read: 3444602
write: 0
other: 492086
total: 3936688
transactions: 246043 (4100.43 per sec.)
queries: 3936688 (65606.81 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.0025s
total number of events: 246043
Latency (ms):
min: 0.88
avg: 1.95
max: 19.27
95th percentile: 3.13
sum: 479541.05
Threads fairness:
events (avg/stddev): 30755.3750/971.95
execution time (avg/stddev): 59.9426/0.00
接下来,我docker-compose.yml
在端口 57306 中使用此文件部署 docker 版本
version: "3"
services:
mysql57:
build: ./bin/mysql57
container_name: 'mysql-5.7'
restart: 'unless-stopped'
ports:
- "57306:3306"
volumes:
- ./config/mysql57:/etc/mysql
- ./data/mysql57:/var/lib/mysql
- ./logs/mysql57:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: <pass>
entrypoint: ""
command: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
该文件夹./config/mysql57
是从 localhost 配置中复制的(/etc/mysql)
然后我使用这个 sysbench 命令
#prepare
sysbench --table_size=1000000 --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=57306 --mysql-db=sysbench --mysql-user=root --mysql-password=<pass> /usr/share/sysbench/oltp_read_only.lua prepare
#run
sysbench --table_size=1000000 --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=57306 --mysql-db=sysbench --mysql-user=root --mysql-password=<pass> --time=60 --max-requests=0 --threads=8 /usr/share/sysbench/oltp_read_only.lua run
我预计至少交易像上面一样接近 4100,但这里只有 1700
SQL statistics:
queries performed:
read: 1431402
write: 0
other: 204486
total: 1635888
transactions: 102243 (1703.87 per sec.)
queries: 1635888 (27261.87 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.0047s
total number of events: 102243
Latency (ms):
min: 3.01
avg: 4.69
max: 14.64
95th percentile: 5.99
sum: 479794.64
Threads fairness:
events (avg/stddev): 12780.3750/11.56
execution time (avg/stddev): 59.9743/0.00
解决方案
鉴于您的两个测试的读取 tps 都很低,感觉 CPU 计数很低。你有多少个核心?当你运行测试时,你会卡在 100% cpu 吗?如果是这样,这是不切实际和不公平的基准。
您还在它出现的同一台机器上运行客户端,这会占用更多的 CPU。为什么 dockerized 版本的性能会更差?端口转发可能是一个原因。更好的是,您可以通过主机上的 unix 域套接字进行连接,并且知道这一点。
在 CPU 使用方面:Unix 域 > TCP > TCP over docker NAT
使用主机网络运行容器,例如:
docker run --rm -it --network host -e MYSQL_ROOT_PASSWORD=bob123 mysql:5.7 --port 5306
“--network host”表示容器看到与主机相同的网络。不涉及软件模拟虚拟网络。
消除 CPU 瓶颈并再次运行测试。
推荐阅读
- swift - 将 swift 字符串复制到固定大小的 char[][]
- python - 日志记录模块:StreamHandler 似乎没有附加到记录器
- google-chrome - Chrome中的“请求已发送”很长时间
- azure - Azure devops 中的 Docker 构建失败并显示消息无法加载文件或程序集“Microsoft.CodeAnalysis,
- .htaccess - 使用 SSL/HTTPS 始终将 URL 从 www 重定向到非 www
- iis - IIS 将规则全部重写到 index.php,除了 /edit 目录
- php - 如何修复 PHP laravel 中的“未定义变量”错误
- jenkins - Jenkins Active-Directory 插件尝试使用不存在的 user@my-domain 自动登录
- angular - 如何为 mat-step-header 绑定点击事件
- node.js - 致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 在生产中堆内存不足