首页 > 解决方案 > 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

标签: docker-composetransactionsmysql-5.7sysbench

解决方案


鉴于您的两个测试的读取 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 瓶颈并再次运行测试。


推荐阅读