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,优化

  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/geek-ace/p/8695465.html
Copyright © 2011-2022 走看看