乐趣区

关于mysql:万答6MySQL最多只能用到128个逻辑CPU是真的吗

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。

江湖传言 MySQL 最多只能用到 128 个逻辑 CPU,是真的吗?

共事从客户现场回来,冤屈巴巴的说,某 PG 服务商通知客户“MySQL 最高只能反对 128 个逻辑 CPU,更多就用不上了,还是用 PG 吧”。

作为从 MySQL 3.23 时代就开始一路陪跑过来的我,必定不能忍啊。。。

在晚期以 MyISAM 引擎为主的年代,确实有相似的限度。MyISAM 存在泛滥限度,这个也是家喻户晓的,不赘述了。

但自从 InnoDB 成为 MySQL 默认引擎后,这个状况应该是不复存在了。尤其是自从 MySQL 引入 innodb_autoinc_lock_mode、innodb_io_capacity、innodb_read_io_threads、innodb_write_io_threads 等多个可控参数选项后,对于高并发的业务场景,基本上都能把所有逻辑 CPU 跑满。

口说无凭,间接测试验证下吧。

测试环境:

# 查看 CPU,共有 176 个逻辑 CPU
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                176
On-line CPU(s) list:   0-175
Thread(s) per core:    2
Core(s) per socket:    22
Socket(s):             4
...

#OS 环境
$ cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
$ uname -a
Linux3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

下载 MySQL 5.5.62 版本的二进制包,批改上面几个参数选项:

innodb_io_capacity = 20000
innodb_autoinc_lock_mode = 2
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_thread_concurrency = 0

实例启动后,在另外的客户机上运行 sysbench 进行压测(sysbench 不要和 MySQL 服务器跑在同一个服务器上):

#128 个测试表,每个表 10 万行记录,并发 256 个线程
$ sysbench /usr/share/sysbench/oltp_read_write.lua  --mysql-host=172.16.10.10 --mysql-port=3306 --mysql-user=xx --mysql-password=xx --mysql-db=sbtest  --db-driver=mysql  --tables=128  --table_size=100000 --threads=256 --report-interval=1 --db-ps-mode=disable --time=0 run

而后运行 htop 察看所有 CPU 的状态,肉眼即可见所有逻辑 CPU 上都有负载:

P.S,MySQL 5.1 版本中的并发度的确无限,不倡议应用该版本,不过当初用 5.1 的应该很少了吧。

最初,借用微信朋友圈一位同学的留言:talk is cheap, show your test。

Enjoy GreatSQL :)

本文由博客一文多发平台 OpenWrite 公布!

退出移动版