江湖传言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