zoukankan      html  css  js  c++  java
  • mysql线程池

    mysql连接池与线程池
    区别
        连接池是客户端进行设置
        线程池是db服务端设置

    连接池的作用
     控制客户端频繁连接DB服务器,和销毁连接线程

    线程池的优势
     1.防止雪崩
     2.提高性能,提升系统稳定性
    架构
     mysql_thread_pool被划分成一个线程(timer)和多个group,每个group又有对应的工作线程
     timer线程
      控制管理整个group,。。。
     group组成
      两个高低队列
      listener
      worker
    线程池简化工作流程
    1.客户端的请求根据threadid%thread_pool_size来决定落到哪个group
    2.group中的listener监听到有新请求,加入队列或者将其转换成worker线程
    3.group中的thread线程检查队列的请求,
     有,处理,没有,则休眠,一直没唤醒的话,超过thread_pool_idle_timeout后,则结束线程退出
     当然Group中running线程数超过thread_pool_oversubscribe+1的话,也会休眠
    4.timer线程会一直检查group是否被阻塞,如果有,就唤醒worker线程或者重建

    线程池的分配机制
     线程池会根据thread_pool_size的值来进行group的分配,每个group各自管理客户端发起的连接,根据threadid%thread_pool_size决定分配到哪个组?
       thread_pool_oversubscribe控制每个group的并发线程数
    相关参数 -- show variables like '%thread%'
       thread_handling = pool-of-threads 启用线程池
       thread_pool_size = cpu cores 设置线程池group的数量
       thread_pool_oversubscribe = 8 每个group的最大线程数 thread_pool_oversubscribe+1
       thread_pool_high_prio_mode 高优先级队列控制参数,默认transactions
       thread_pool_high_prio_tickets 每个连接分配来进入高优先级队列的ticket数,尽量设置大点。
       thread_pool_idle_timeout worker线程最大空闲时间,默认60秒,超过限制后会退出
       thread_pool_max_threads 限制线程池最大线程数,超过限制后将无法再创建更多线程,默认值10000. 
       thread_pool_stall_limit 设置timer线程的检测group是否异常的时间间隔,默认500ms

    配置文件配置 #其他参数默认即可
    #thread_pool
       thread_handling = pool-of-threads
       thread_pool_size = 36
       thread_pool_oversubscribe = 8
       performance_schema =off
    # extra_connection
    extra_max_connections = 8
    extra_port = 33333

    注意事项
       performance_schema=off如果performance_schema与thread_pool同时开启的话,会有内存泄漏的问题,5。7.21-20已修复改问题
       extra_connection防止连接池满无法登陆

    拨测异常问题
       启用线程池后,相当于限制了线程并发数,当并发连接达到mysql的最大线程数的时候,其他线程需要等待,新连接也会卡在连接验证的那一步
       这时候会造成拨测程序连接MySQL超时,拨测程序连接超时后,就会认为master出现了问题,在极端情况下,重试多次都有异常后,就会
       启动自动切换操作,将业务切到从机
    解决办法
       1.启用旁路端口,监控和高可用相关直接使用MySQL的旁路端口管理
       2.修改高可用探测脚本,将达到线程池最大活动线程数返回的错误做异常处理,当做超过最大连接数的场景来处理(只做告警,不进行自动切换)

    慢sql的引入问题
       因为慢sql的问题,导致group线程数不够 
       在没有阻塞的时候,每次都是4个线程,而后面有一个线程长时间运行的时候,就会出现那个长时间线程对应的group出现排队的情况,
       最后虽然有三个空闲的线程,但却只有一个线程在处理
    解决办法
       1.调大thread_pool_oversubscribe
       2.找到慢sql,优化

  • 相关阅读:
    jdk动态代理底层实现
    SpringMvc执行流程及底层代码流程
    JavaWeb02-JSP数据交互
    JavaWeb01-动态网页
    异常总结
    优雅代码
    flask 脚本迁移语句
    git 拉取分支合并master&&回滚
    创建型设计模式
    基于mybatis的一个分表插件
  • 原文地址:https://www.cnblogs.com/geek-ace/p/8695465.html
Copyright © 2011-2022 走看看