文章目录

  • 正文
  • 参考文档
正文

    每秒查询次数(Queries per second,QPS)可以衡量数据库的吞吐量,但不能反映MySQL的工作强度。后者由Threads_running度量,表示为量表(而QPS是速率)。在讨论Threads_running之前,让我们考虑一个类比:

    上图是来自汽车的数字仪表板。左边的大圆圈是车速表,右边的大圆圈是转速表。车速表是大多数人所熟悉的:它们显示汽车行驶的速度。在上面,车速表的读数为84 km/h。转速表很常见,但并不是每个仪表盘都包含转速表。它们显示了发动机的工作强度,以每分钟转数(RPM)为单位。在上面,转速表的读数接近3,000 RPM。(转速表中间的“ M3”是变速箱齿轮。我们可以忽略这一点)
    QPS与速度(84 km/h)类似,而Threads_running与RPM(〜3k RPM)类似。
    速度和RPM的变化受多种因素的影响:加速和减速,上坡或下坡,逆风或逆风,以及(在越来越多的新车中)计算机编程可优化燃油经济性。因此,在不同的转速下可以达到相同的速度,但是通常汽车在较低的转速下燃烧较少的燃料,而在较高的转速下燃烧较多的燃料。同样,较高的RPM意味着发动机上的应力更大,从而增加了机械故障的机会。我们关心燃烧燃料和机械故障,因为两者都使我们付出了金钱。这就是为什么汽车配备转速表的原因:RPM是一项重要指标。
    QPS 和 Threads_running 也因许多因素而有很大差异:硬件规格(CPU内核和速度,存储类型和IOPs等),查询类型(读或写),查询计划,表大小,行大小,表模式(列类型,索引-特别是索引),数据访问模式(全读或全写或混合),“嘈杂的邻居”,一天中的时间(例如营业时间),一年中的时间(例如纳税季节),特殊促销,糟糕的演员,等等-随便你说吧!因此,与汽车一样,相同的QPS可以在不同的Threads_running上实现,因此这是一个重要的指标。
    Threads_running表示MySQL的工作强度。我工作的几个数据库仅运行10个线程即可完成10,000 QPS。其他人则需要运行100个线程才能达到3,000 QPS。从前面的段落中,我们知道原因:各种变化的因素。
    仅QPS不能告诉我们MySQL是否在给系统施加压力,或者,形象的说,它是否开始烧油并停止运转。
监视和处理运行中的高Threads_running是至关重要的。转速表有一个最大值,你通常不能把车推到它之外,但是MySQL非常有野心:它没有最大值,它会根据需要运行尽可能多的线程。它会尝试,但会随着Threads_running的增加而变慢并最终失败:

Threads_running MySQL
0 - 10 Normal:几乎所有硬件都没问题
10 - 30 Busy:大多数硬件通常都可以,因为服务器多核
30 - 50 High:很少有工作负载需要运行这么多线程。它可以短期爆发(<5min),但如果持续时间较长,则响应时间很可能很慢
50 - 100 Overloaded:某些硬件可以处理此问题,但是不能期望在此范围内成功运行。对于我们的本地部署硬件而言,此范围内的瞬时突发(<5s)通常是可以的。
> 100 Failing:在极少数情况下,MySQL可以运行大于100个线程,但在此范围内可能会失败

    建议指导值:

  • Threads_running < 50
  • 1:1000 Threads_running:QPS

    让我们换个角度来阐明一个重要的问题:MySQL线程是一个数据库连接。Threads_running是活动查询的数据库连接数。请记住,每个应用程序实例都有其自己的数据库连接池,这一点很重要。因此,最大可能的连接(线程)为:

Max Connections = App 实例数 * 数据库连接池大小

    连接池大小为100是合理的,但是如果将应用程序部署到5个应用程序实例,则可能有500个数据库连接。通常是这样:应用程序通常具有数百个空闲数据库连接,这是连接池的用途。(对连接的线程,MySQL也有一个尺度)直到同时运行过多的连接(线程),这才成为问题。
    一个应用程序不止一次被扩展(即部署更多的应用程序实例)以处理更多的请求,但这样做会使数据库过载,运行的线程太多。没有快速或简单的解决方案来解决这种类型的数据库性能限制。原因很简单:如果您希望MySQL在相同的时间(每秒)内执行更多的工作(查询),则每个工作必须花费较少的时间,否则无法进行计算。如果每个查询花费100毫秒,则执行速度不可能超过10QPS。您问:“啊,但是要是使用更多的CPU内核呢?”
    明白了!使用另一个CPU内核意味着运行另一个线程,现在我们正朝着一个更低的上限快速前进:运行50个线程。但这正是MySQL试图做的。如前所述,MySQL非常雄心勃勃:它没有设置Threads_running的最大值,它将根据需要运行尽可能多的线程。QPS的上限(如果存在)非常高,而Threads_running的上限非常低。为什么是这样?
    运行50个线程是一个合理的要求。到2020年,甚至应该运行1,000个线程。让我用另一个问题回答这个问题:为什么丰田没有法拉利的速度和力量?丰田的最高时速为 200km/h,法拉利的最高时速为 340km/h。为什么丰田不能跑得更快呢?为什么MySQL不能走得更快?
    两者的答案在工程的每一个细节上。例如,法拉利跑得很快,因为它有一个非常强大的引擎,但你不能只关注这里。这辆车的每一个细节都设计得既能提供动力,又不会在动力之下断裂。例如,飞机可以以258公里/小时的速度起飞和飞行,因此一辆时速340公里的法拉利将能飞行,除非其车身的空气动力学使它保持在地面上。如果设计成这样,丰田汽车的时速可以达到340公里,而MySQL可以运行1000个线程。
    像丰田一样,MySQL构建良好、可靠,而且超出了您的需要,但它本身或其周围的任何硬件、操作系统和应用程序都不是设计成法拉利的。
    实际经验表明,对于运行50个线程以上的大多数应用程序,MySQL的性能不佳。早在2014年,MySQL专家Alexey Straganov就对MySQL5.6进行了基准测试,测试运行的Threads_running非常高:Percona Server: Improve Scalability with Percona Thread Pool。在运行64个threads running时性能达到峰值。这些是实验结果,实际的应用程序查询比综合基准查询更具挑战性。
    解决方案?通过分片扩展数据库。但这是另一个漫长的话题。
    让我们以积极的结尾结束。Vadim Tkachenko也许是全球MySQL性能方面的最杰出专家,他最近实现了100,000个线程的运行:MySQL Challenge: 100k Connections。

参考文档

[1]Daniel Nichter.MySQL Threads Running How Hard is MySQL Working?[EB/OL].https://hackmysql.com/post/mysql-threads-running-how-hard-is-mysql-working/,2020-04-25.
[2]Oracle Corporation.Server Status Variables[EB/OL].https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html,2021-01-01.

MySQL工作有多努力--了解MySQL Threads Running相关推荐

  1. MySQL工作笔记-使用JPA映射mysql数据库要注意的地方

    这个笔记很简单,主要记录了昨天(2019年12月8日)本人用Spring Boot框架. 此处的刚刚版本如下: java:1.8 Spring Boot:2.1.10.RELEASE mysql-co ...

  2. 超详细的MySQL工作原理 体系结构

    超详细的MySQL工作原理 体系结构 妖精的杂七杂八 2020-08-13 13:54:12 了解MySQL(超详细的MySQL工作原理 体系结构) 1.MySQL体系结构 2.MySQL内存结构 3 ...

  3. 了解MySQL(超详细的MySQL工作原理 体系结构)

    了解MySQL(超详细的MySQL工作原理 体系结构) 1.MySQL体系结构 2.MySQL内存结构 3.MySQL文件结构 4.innodb体系结构 一.了解MySQL前你需要知道的 引擎是什么: ...

  4. lampp mysql未启动,lampp1.7中mysql无法启动问题

    网站环境升级,由于dedecms版本中php5.4中经常中文白页,只有选择低版本的lampp,决定使用lampp1.7.7,解压缩后在启动lampp时提示mysql无法启动. 查看/opt/lampp ...

  5. 如何用mysql运行程序_如何在MySQL工作台中创建和执行程序

    我在 MySQL工作台中使用SQL编辑器创建了一个Spatial表.要填写此表, 以下是我正在使用的代码. CREATE PROCEDURE fill_points( IN size INT(10) ...

  6. Mysql工作原理介绍

    Mysql 工作原理图 Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的. mysql原理图各个组件说明: connectors 与其他编程语言中的sql 语句进行交互,如php.jav ...

  7. 腾讯云TVP大佬十年心血MySQL工作笔记,看完还不懂MySQL来打我!

    TVP简介(腾讯云最具价值专家) TVP(Tencent Cloud Valuable Professional),腾讯云最具价值专家,是腾讯云授予云计算领域技术专家的一个奖项.而今天小编分享的这份资 ...

  8. Linux工作笔记039---CentOS8.2卸载mysql

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 卸载 移除mariadb程序文件 yum remove -y mariadb* 查询mysql相关 ...

  9. 数据库工作笔记009---Centos中导出mysql数据库

    JAVA技术交流QQ群:170933152 首先linux 下查看mysql相关目录 root@ubuntu14:~# whereis mysql mysql:  /usr/bin/mysql---- ...

  10. mysql 迁移到tidb_通过从MySQL迁移到TiDB来水平扩展Hive Metastore数据库

    mysql 迁移到tidb Industry: Knowledge Sharing 行业:知识共享 Author: Mengyu Hu (Platform Engineer at Zhihu) 作者: ...

最新文章

  1. svg鼠标响应事件的四种方法(其中两种可支持火狐)
  2. jsoup 多个 class Selector 怎么写?
  3. 如何学好Java?你应该躲开这几个坑
  4. SAP CRM WebClient UI calculated fields的工作原理
  5. VmWare下安装CentOS6
  6. 成吉思汗的子孙:中国游牧蒙古人
  7. ffmepg 命令提取音视频数据
  8. springmvc+swagger构建Restful风格文档
  9. 马哥学习李洋个人笔记之-----正则表达式
  10. FPGA学无止境(目录篇)
  11. 环形数组求最大子数组之和
  12. 数据结构与算法python—3.数组(顺序表)双指针Leetcode刷题总结
  13. python辗转相除法求最大公约数_vb编程实现用辗转相除法求两个数a和b的最大公约数...
  14. 爬取Google网站的图片
  15. Element组件--Upload文件/图片上传
  16. webhook小试水(无需外网服务器)
  17. 【dsPIC33】振荡器与定时器
  18. Docker参数 -i -t 的作用
  19. 没有捷径!没有捷径!没有捷径!
  20. Cannot read property bindings of null 解决方法

热门文章

  1. 谷歌身份验证器在手机间转移教程
  2. android 百度地图定位图标素材,百度地图定位开发图标大全 百度地图开发可以用到的一些实用标注/图标(baidu map development) - 下载 - 搜珍网...
  3. 【NLP】文本分类算法-基于字符级的无词嵌入双向循环神经网络(双向 GRU)
  4. 部分手机虚拟键盘的适配问题
  5. 1.17英文题面翻译
  6. 《SPEA2: Improving the Strength Pareto Evolutionary Algorithm》阅读笔记
  7. Linux基础3-实用进阶
  8. 双稳态电路的两个稳定状态是什么_一文为你详解继电器的工作原理及电路
  9. 英语学习详细笔记(十七)间接问句
  10. php微信公众号报修系统,微信公众号报修系统使用流程