MariaDB-5.5 线程池性能
MariaDB-5.5.21-beta 是第一个包含新线程池的 MariaDB 版本。Oracle 为 MySQL Enterprise 提供了一个商业线程池插件,但现在 MariaDB 将线程池实现带到了社区!
如果您不熟悉这个术语,请阅读关于它的知识库文章。
线程池的主要设计目标是提高 MariaDB 服务器在大量并发连接下的可伸缩性。为了测试和演示这一点,我使用多达 4096 个线程运行了 sysbench OLTP RO 基准测试,以比较新的 pool-of-threads 和传统的 thread-per-connection 调度器
基准测试描述
- sysbench 多表 OLTP,只读
- 16 张表,总计 4000 万行(约 10G 数据)
- 16G 缓冲池 – 结果与磁盘性能无关
- mysqld 绑定到 16 个 CPU 核心,sysbench 绑定到其他 8 个
读/写 OLTP 基准测试结果将在可用时尽快发布。
原始基准测试结果和使用的脚本可以在这里下载
附注
让我再补充几点关于绑定 CPU 核心和线程池配置的信息。
用于此基准测试的 Sysbench-0.5 结果发现非常占用 CPU 资源;尤其是在高并发级别下。如果允许 mysqld 和 sysbench 都运行在所有 CPU 核心上,它们会争夺资源 – 这将导致在许多线程下出现人为的糟糕结果。给 sysbench 分配 4 个核心、给 mysqld 分配 20 个核心时,sysbench 本身成了瓶颈。所以我最终给 sysbench 分配了 8 个核心(这里留了一些余地),给 mysqld 分配了 16 个核心。
在 UNIX 上,MariaDB 线程池通常不需要配置,因为它会自动将 thread-pool-size 配置为 CPU 核心的数量(这取决于 sysconf(3) 实现 _SC_NPROCESSORS_ONLN),这在几乎所有情况下都是最佳大小。如果将 mysqld 绑定到 CPU 核心的子集,则应手动将 thread-pool-size 设置为分配给 mysqld 的 CPU 核心数量。
还可以……不算了不起的事
使用了哪种操作系统?Linux、Unix 还是 Windows?
这些结果来自一台 Linux 机器(pitbull,24 核心,24G 内存)。这里还有一些结果,包括 Windows 的:http://kb.askmonty.org/en/threadpool-benchmarks
它是 Linux。在几个月前我进行的初步测试中,Windows 的扩展性实际上甚至更好:http://kb.askmonty.org/en/threadpool-benchmarks
非常棒。
说实话,我以为线程池在大多数数据库中是标配..你是说通常情况下每个连接都会创建和销毁一个线程?真奇怪。
不要将此与已经存在的线程缓存混淆...
线程池并非关于创建或销毁线程,而是关于如何将请求(传入的 SQL 查询)映射到工作线程。请查看MariaDB 知识库了解详情。
即使是传统的每连接一线程模型,也不一定为新连接创建一个新线程,因为存在线程缓存。也可在此处查看 MySQL/MariaDB 如何处理连接和映射工作线程。
...或者与客户端的连接池混淆...
你的程序是什么
这与 MySQL Enterprise 的线程池在性能方面相比如何?
很遗憾这不能公开。您可以下载企业试用版,但许可协议禁止未经 Oracle 事先书面批准发布任何测试或基准测试结果。因此,如果您需要这种比较,您需要自己运行基准测试(并且切勿公开讨论结果;)