热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MariaDBthreadpool和oracleMySQLenterprise的对比

OracleMySQLEnterprise部分Thread_pool_algorithm:连接并发调度算法,默认值0使用一种保守低级别并发的算法,经测试表现结果不错。值为1的话,并发数量会增大,采用更激进的算法性能,在线程数量一定的时候性能得到5-10%的提升,随着更大的连接数,性
Oracle MySQL Enterprise 部分
Thread_pool_algorithm:
连接并发调度算法,默认值0 使用一种保守低级别并发的算法,经测试表现结果不错。 值为1的话,并发数量会增大,采用更激进的算法性能,在线程数量一定的时候性能得到5-10%的提升,随着更大的连接数,性能会随之下降。
Thread_pool_high_priority_connection:
该参数影响 如何安排语句的执行顺序,默认值为0,statement会使用 low priority 和 high-priority 两种队列,如果等于1的话,那只会使用high priority 一种队列。
Thread_pool_prio_kickup_timer:
statement 从low priority 队列 移到 high-priority的等待时间。单位为毫秒
Thread_pool_max_unused_threads
该参数限制了sleep thread 所使用的内存。默认值为0,即不限制,当值为N时(N>1),1个 consumer thread ,n-1 个 reserve threads。当处于sleeping 的thread 达到最大值,再有新的thread 将要 sleep 的时候,该线程只能直接退出。
一个sleeping thread 有两种角色 consumer 和 reserve ,thread pool只允许一个线程是 consumer thread,如果 有一个thread 将要sleep而此时 thread pool 中没有 consumer角色的线程,那该线程会成为 consumer thread;当需要唤醒某个线程的时候,consumer thread是首选,只有当consumer thread 这种角色的 线程不存在时 才会选择 reserve 角色的线程
Thread_pool_size :thread groups的数量
Thread_pool_stall_limit:thread执行下一个新的 statement的时间间隔。
参数推荐配置:
Thread_pool_size 只读的变量,
主要的存储引擎是:InnoDB, 取值为 16---36 最佳取值为 24---36 对于写密集型的应用,有时候要 低于 36.
主要的存储引擎是:MyISAM:最佳为 4—8,设置的太高 对性能没有显著的影响。
Thread_pool_stall_limit:对于 long-running statement 和 被blocked 的语句 有很大的影响。对于blocked的情况,如果thread pool 能检测到则会开启一个新的线程,针对thread pool 没有检测到该情况,只能通过 该参数来设置超时时间。
该值太高的话,会出现 long-running 的statement 阻挡 更多的短查询。
举例:
When a statement arrives, what is the maximum time it can be delayed before it actually starts executing? Suppose that the following conditions apply:
    There are 200 statements queued in the low-priority queue.
    There are 10 statements queued in the high-priority queue.
    thread_pool_prio_kickup_timer is set to 10000 (10 seconds).
    thread_pool_stall_limit is set to 100 (1 second).
In the worst case, the 10 high-priority statements represent 10 transactions that continue executing for a long time. Thus, in the worst case, no statements will be moved to the high-priority queue because it will always already contain statements awaiting execution. After 10 seconds, the new statement is eligible to be moved to the high-priority queue. However, before it can be moved, all the statements before it must be moved as well. This could take another 2 seconds because a maximum of 100 statements per second are moved to the high-priority queue. Now when the statement reaches the high-priority queue, there could potentially be many long-running statements ahead of it. In the worst case, every one of those will become stalled and it will take 1 second for each statement before the next statement is retrieved from the high-priority queue. Thus, in this scenario, it will take 222 seconds before the new statement starts executing.
This example shows a worst case for an application. How to handle it depends on the application. If the application has high requirements for the response time, it should most likely throttle users at a higher level itself. Otherwise, it can use the thread pool configuration parameters to set some kind of a maximum waiting time.

MariaDB部分
在mariadb 中使用 threadpool (以Linux为主)
在配置文件中添加:thread_handling=pool-of-threads
Threadpool server variables 都是可以动态调整的。
在unix上推荐的参数:
Thread_pool_size 建议采用默认
Thread_pool_stall_limit;毫秒单位,默认值500 (0.5s)当达到这种限制的时候 threadpool会wake up 或者创建一个新的thread来执行新的statement,这种抢占机制哪种long-running query 霸占 这个pool,临时允许多个线程并行执行,当线程的总量达到 thread_pool_max_threads 规定的总量时,就不会创建新的线程,甚至时间已经超过了thread_pool_stall_limit规定的时间。
Thread_pool_max_threads:默认值为500
Thread_pool_idle_timeout:默认60s空闲的线程退出时间间隔
Thread_pool_oversubscribe:默认值为3,这是对让每个CPU都有超过1个同时运行的线程与让线程sleep awake 的折中,值越高,会同时运行很多的线程,值越低,会出现更多的sleep 和 wake up
监控 thread pool 的状态;
Thread_threads pool 当前的线程数
Threadpool_idle_threads :当前不活跃的线程数,只涉及到unix,处于idle的状态:wait for new work,blocked due to disk io,row or table lock
Troubleshooting blocking situations
尽管讲 thread_pool_max_threads 调的很高,遇到全局锁的情况可能会导致整个pool 被block,假设一种情况 一个client 执行:flush tables with read lock 并暂停,此时有500个其他的client进行write操作, 最大线程数已经达到,此时在也不能执行 unlock table操作。
针对上述情况,mariadb 允许你使用专用的连接,并且设置 extra_port(不等于一般连接的 port),连接后可以增加 thread_pool_max_threads 或者kill 掉不必要的连接。
这里需要在配置文件中添加如下两项:
Extra-port=0 (默认为0)
Extra-max-cOnnections=1 (默认为1)
当extra-port >0的时候,可以进行super user 的连接,连接方式使用的是one-thread-per-connection method.
Mysql --port=’number-of-extra-port’ --protocol=tcp

MariaDB threadpool vs Oracle MySQL Enterprise Threadpool 相似地方:
1、 两者同样会将client connections 分组,thread_pool_size 都代表 thread group的个数,
2、 两者对于thread stalls 使用相似的 schema checking。只是单位不一致, MariaDB使用的是毫秒,官方使用的是 10ms。
不同点:
1、 windows的实现方式完全不同,MariaDB 使用windows本地的 threadpool,oracle 使用WSAPoll() 方法来实现。而且对于管道或者共享内存连接是不起作用的
2、 MariaDB使用最有效的I/O multiplexing facilities 对于每一个os,windows(the I/O completion port is used internally by the native threadpool),linux(epoll),Solaris(event port),FreeBSD 和 OSX(kevent),Oracle 只对linux 使用 epoll,其他的全部是 poll()
3、 相比于Oracle MySQL Enterprise,MariaDB threadpool 不会限制最小的并发事务。
4、 MariADB是 嵌入到server内,不是以plugin的形式存在。
测试数据:
taskset -c 0,1,2,3,4,5,6,7 ./sysbench --num-threads=100 --test=oltp --oltp-table-size=10000000 --mysql-table-engine=innodb --mysql-user=root --mysql-socket=/tmp/mariadb.sock --mysql-password=ws123 --mysql-db=test  --mysql-port=3308 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark
官方版本 未启用 threadpool
transactions: 10002 (298.79 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190038 (5676.92 per sec.)
other operations: 20004 (597.57 per sec.)
mariadb 启用 threadpool:
transactions: 10000 (382.11 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (7260.16 per sec.)
other operations: 20000 (764.23 per sec.)

推荐阅读
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 2012年7月30日,语言岛团队宣布其智能记单词软件V0.3.4.554版本正式开源。该版本不仅支持跨平台使用,还引入了多项创新功能,旨在帮助用户更高效地记忆单词。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
  • 本文档详细介绍了2017年8月31日关于MySQL数据库备份与恢复的教学内容,包括MySQL日志功能、备份策略、备份工具及实战演练。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • CentOS 7 默认安装了 MariaDB,作为 MySQL 的一个分支。然而,出于特定需求,我们可能仍需在系统中安装 MySQL。本文将详细介绍如何通过 Yum 包管理器在 CentOS 7 上安装 MySQL,并提供一些常用的 MySQL 命令。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 在2015年1月的MySQL内核报告中,我们详细探讨了性能优化和Group Commit机制的改进。尽管网上已有大量关于Group Commit的资料,本文将简要回顾其发展,并重点分析MySQL 5.6及之前版本中引入的二进制日志(Binlog)对性能的影响。此外,我们还将深入讨论最新的优化措施,如何通过改进Group Commit机制显著提升系统的整体性能和稳定性。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • 如何在Linux系统上部署MySQL 5.7.28
    本文详细介绍了在Linux系统上部署MySQL 5.7.28的具体步骤。通过官方下载页面获取最新安装包后,按照提供的指南进行配置和安装。文章内容实用性强,适合初学者和有经验的管理员参考。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文详细介绍了如何解决 Microsoft SQL Server 中用户 'sa' 登录失败的问题。错误代码为 18470,提示该帐户已被禁用。我们将通过 Windows 身份验证方式登录,并启用 'sa' 帐户以恢复其访问权限。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
author-avatar
我爱投资理财
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有