当前位置: 首页 > news >正文

国外网站备案吗 上软件下载app

国外网站备案吗, 上软件下载app,阿里服务器怎么做网站服务器,六安市城乡和建设局官方网站1 前言 平时的工作中#xff0c;不知道大家有没有遇到过这样的场景#xff0c;一条SQL语句#xff0c;正常执行的时候特别快#xff0c;但是有时也不知道怎么回事#xff0c;它就会变得特别慢#xff0c;并且这样的场景很难复现#xff0c;它不只随机#xff0c;而且持…1 前言 平时的工作中不知道大家有没有遇到过这样的场景一条SQL语句正常执行的时候特别快但是有时也不知道怎么回事它就会变得特别慢并且这样的场景很难复现它不只随机而且持续时间还很短。 看上去这就像是数据库“抖”了一下。今天我们就一起来看一看这是什么原因。 2 你的SQL语句为什么变“慢”了 在前面的文章MySQL进阶45讲【2】日志系统一条SQL更新语句是如何执行的中介绍了WAL机制。InnoDB在处理更新语句的时候只做了写日志这一个磁盘操作。这个日志叫作redo log重做日志也就是《孔乙己》里咸亨酒店掌柜用来记账的粉板在更新内存写完redo log后就返回给客户端本次更新成功。 做下类比的话掌柜记账的账本是数据文件记账用的粉板是日志文件redo log掌柜的记忆就是内存。 掌柜总要找时间把账本更新一下这对应的就是把内存里的数据写入磁盘的过程术语就是flush。在这个flush操作执行之前孔乙己的赊账总额其实跟掌柜手中账本里面的记录是不一致的。因为孔乙己今天的赊账金额还只在粉板上而账本里的记录是老的还没把今天的赊账算进去。 当内存数据页跟磁盘数据页内容不一致的时候我们称这个内存页为“脏页”。内存数据写入到磁盘后内存和磁盘上的数据页的内容就一致了称为“干净页”。 不论是脏页还是干净页都在内存中。在这个例子里内存对应的就是掌柜的记忆。 接下来我们用一个示意图来展示一下“孔乙己赊账”的整个操作过程。假设原来孔乙己欠账10文这次又要赊9文。 回到文章开头的问题大家可以想一想平时执行很快的更新操作其实就是在写内存和日志而MySQL偶尔“抖”一下的那个瞬间可能就是在刷脏页flush。 那么什么情况会引发数据库的flush过程呢 我们还是继续用咸亨酒店掌柜的这个例子想一想掌柜在什么情况下会把粉板上的赊账记录改到账本上 第一种场景是粉板满了记不下了。这时候如果再有人来赊账掌柜就只得放下手里的活儿将粉板上的记录擦掉一些留出空位以便继续记账。当然在擦掉之前他必须先将正确的账目记录到账本中才行。这个场景对应的就是InnoDB的redo log写满了。这时候系统会停止所有更新操作把checkpoint往前推进redo log留出空间可以继续写。第二讲画了一个redo log的示意图这里改成环形便于大家理解。 checkpoint可不是随便往前修改一下位置就可以的。比如图2中把checkpoint位置从CP推进到CP’就需要将两个点之间的日志浅绿色部分对应的所有脏页都flush到磁盘上。之后图中从write pos到CP’之间就是可以再写入的redo log的区域。 第二种场景是这一天生意太好要记住的事情太多掌柜发现自己快记不住了赶紧找出账本把孔乙己这笔账先加进去。这种场景对应的就是系统内存不足。当需要新的内存页而内存不够用的时候就要淘汰一些数据页空出内存给别的数据页使用。如果淘汰的是“脏页”就要先将脏页写到磁盘。有些小伙伴可能会疑问这时候难道不能直接把内存淘汰掉下次需要请求的时候从磁盘读入数据页然后拿redo log出来应用不就行了这里其实是从性能考虑的。如果刷脏页一定会写盘就保证了每个数据页有两种状态 一种是内存里存在内存里就肯定是正确的结果直接返回另一种是内存里没有数据就可以肯定数据文件上是正确的结果读入内存后返回。这样的效率最高。 第三种场景是生意不忙的时候或者打烊之后。这时候柜台没事掌柜闲着也是闲着不如更新账本。这种场景对应的就是MySQL认为系统“空闲”的时候。当然MySQL“这家酒店”的生意好起来可是会很快就能把粉板记满的所以“掌柜”要合理地安排时间即使是“生意好”的时候也要见缝插针地找时间只要有机会就刷一点“脏页”。 第四种场景是年底了咸亨酒店要关门几天需要把账结清一下。这时候掌柜要把所有账都记到账本上这样过完年重新开张的时候就能就着账本明确账目情况了。这种场景对应的就是MySQL正常关闭的情况。这时候MySQL会把内存的脏页都flush到磁盘上这样下次MySQL启动的时候就可以直接从磁盘上读数据启动速度会很快。 接下来分析一下上面四种场景对性能的影响。 其中第三种情况是属于MySQL空闲时的操作这时系统没什么压力而第四种场景是数据库本来就要关闭了。这两种情况下不会太关注“性能”问题。所以这里我们主要来分析一下前两种场景下的性能问题。 第一种是“redo log写满了要flush脏页”这种情况是InnoDB要尽量避免的。因为出现这种情况的时候整个系统就不能再接受更新了所有的更新都必须堵住。如果从监控上看这时候更新数会跌为0。 第二种是“内存不够用了要先将脏页写到磁盘”这种情况其实是常态。InnoDB用缓冲池buffer pool管理内存缓冲池中的内存页有三种状态 第一种是还没有使用的第二种是使用了并且是干净页第三种是使用了并且是脏页。 InnoDB的策略是尽量使用内存因此对于一个长时间运行的库来说未被使用的页面很少。而当要读入的数据页没有在内存的时候就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉如果要淘汰的是一个干净页就直接释放出来复用但如果是脏页呢就必须将脏页先刷到磁盘变成干净页后才能复用。 所以刷脏页虽然是常态但是出现以下这两种情况都是会明显影响性能的 一个查询要淘汰的脏页个数太多会导致查询的响应时间明显变长日志写满更新全部堵住写性能跌为0这种情况对敏感业务来说是不能接受的。 所以InnoDB需要有控制脏页比例的机制来尽量避免上面的这两种情况。 3 InnoDB刷脏页的控制策略 接下来就说说InnoDB脏页的控制策略以及和这些策略相关的参数。 首先要正确地告诉InnoDB所在主机的IO能力这样InnoDB才能知道需要全力刷脏页的时候可以刷多快。 这就要用到innodb_io_capacity这个参数了它会告诉InnoDB系统的磁盘能力。这个值建议设置成磁盘的IOPS。磁盘的IOPS可以通过fio这个工具来测试下面的语句是我用来测试磁盘随机读写的命令 fio -filename$filename -direct1 -iodepth 1 -thread -rwrandrw -ioenginepsync -bs16k -size500M其实因为没能正确地设置innodb_io_capacity参数而导致的性能问题也比比皆是。举一个例子如果一个库的性能出现问题说MySQL的写入速度很慢TPS很低但是数据库主机的IO压力并不大。经过一番排查发现罪魁祸首就是这个参数的设置出了问题。 主机磁盘用的是SSD但是innodb_io_capacity的值设置的是300。于是InnoDB认为这个系统的能力就这么差所以刷脏页刷得特别慢甚至比脏页生成的速度还慢这样就造成了脏页累积影响了查询和更新性能。 虽然我们现在已经定义了“全力刷脏页”的行为但平时总不能一直是全力刷吧毕竟磁盘能力不能只用来刷脏页还需要服务用户请求。所以接下来我们就一起看看InnoDB怎么控制引擎按照“全力”的百分比来刷脏页。 根据前面提到的知识试想一下如果来设计策略控制刷脏页的速度会参考哪些因素呢 这个问题可以这么想如果刷太慢会出现什么情况首先是内存脏页太多其次是redo log写满。 所以InnoDB的刷盘速度就是要参考这两个因素一个是脏页比例一个是redo log写盘速度。 InnoDB会根据这两个因素先单独算出两个数字。 参数innodb_max_dirty_pages_pct是脏页比例上限默认值是75%。InnoDB会根据当前的脏页比例假设为M算出一个范围在0到100之间的数字计算这个数字的伪代码类似这样 F1(M) { if Minnodb_max_dirty_pages_pct then return 100; return 100*M/innodb_max_dirty_pages_pct; }InnoDB每次写入的日志都有一个序号当前写入的序号跟checkpoint对应的序号之间的差值我们假设为N。InnoDB会根据这个N算出一个范围在0到100之间的数字这个计算公式可以记为F2(N)。F2(N)算法比较复杂大家只要知道N越大算出来的值越大就好了。 然后根据上述算得的F1(M)和F2(N)两个值取其中较大的值记为R之后引擎就可以按照innodb_io_capacity定义的能力乘以R%来控制刷脏页的速度。上述的计算流程比较抽象不容易理解可以看一下下图的流程图。图中的F1、F2就是上面我们通过脏页比例和redo log写入速度算出来的两个值。 因此InnoDB会在后台刷脏页而刷脏页的过程是要将内存页写入磁盘。所以无论是查询语句在需要内存的时候可能要求淘汰一个脏页还是由于刷脏页的逻辑会占用IO资源并可能影响到了更新语句都可能是造成从业务端感知到MySQL“抖”了一下的原因。 要尽量避免这种情况就要合理地设置innodb_io_capacity的值并且平时要多关注脏页比例不要让它经常接近75%。 其中脏页比例是通过Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total得到的具体的命令参考下面的代码 mysql select VARIABLE_VALUE into a from global_status where VARIABLE_NAME Innodb_buffer_pool_pages_dirty; select VARIABLE_VALUE into b from global_status where VARIABLE_NAME Innodb_buffer_pool_pages_total; select a/b;接下来我们再看一个有趣的策略。 一旦一个查询请求需要在执行过程中先flush掉一个脏页时这个查询就可能要比平时慢了。而MySQL中的一个机制可能让查询会更慢在准备刷一个脏页的时候如果这个数据页旁边的数据页刚好是脏页就会把这个“邻居”也带着一起刷掉而且这个把“邻居”拖下水的逻辑还可以继续蔓延也就是对于每个邻居数据页如果跟它相邻的数据页也还是脏页的话也会被放到一起刷。 在InnoDB中innodb_flush_neighbors 参数就是用来控制这个行为的值为1的时候会有上述的“连坐”机制值为0时表示不找邻居自己刷自己的。找“邻居”这个优化在机械硬盘时代是很有意义的可以减少很多随机IO。机械硬盘的随机IOPS一般只有几百相同的逻辑操作减少随机IO就意味着系统性能的大幅度提升。 而如果使用的是SSD这类IOPS比较高的设备的话最好把innodb_flush_neighbors的值设置成0。因为这时候IOPS往往不是瓶颈而“只刷自己”就能更快地执行完必要的刷脏页操作减少SQL语句响应时间。 在MySQL 8.0中innodb_flush_neighbors参数的默认值已经是0了。 4 小结 今天这篇文章延续MySQL进阶45讲【2】日志系统一条SQL更新语句是如何执行的中介绍的WAL的概念然后解释了这个机制后续需要的刷脏页操作和执行时机。利用WAL技术数据库将随机写转换成了顺序写大大提升了数据库的性能。 但是由此也带来了内存脏页的问题。脏页会被后台线程自动flush也会由于数据页淘汰而触flush而刷脏页的过程由于会占用资源可能会让更新和查询语句的响应时间长一些。在文章里也介绍了控制刷脏页的方法和对应的监控方式。
http://www.pierceye.com/news/355322/

相关文章:

  • 那家财经网站做的好陕西网站建设公司哪有
  • 淄川网站建设中小型企业网站建设
  • phpcms 投资 网站源码wordpress主题网站
  • 聊城网站托管义乌外贸公司联系方式
  • 开发一个小程序对网站做综合搜索引擎优化分析
  • 网站开发自学网有哪些企业可以做招聘的网站有哪些
  • 网站怎么做百度推广网站开发者模式
  • 学校网站设计制作目的做网站推广方法
  • wordpress建站云平台小程序商城开发平台
  • pc网站转换成微网站网站建设开发哪家质量好
  • wordpress网站使用教程aspnet东莞网站建设多少钱
  • 网站地图提交给百度证券公司如何拉客户
  • 做外贸有哪些免费的网站win7优化大师好不好
  • 网站功能怎么写上海网站制作建设怎么样
  • 网站域名是网站架构吗成都网站搭建优化推广
  • 自己做的网站添加交费功能合肥有什么好的网站建设公司好
  • 做网站品牌龙岩新增病例行动轨迹
  • 任家房网站建设郑州百度网站推广
  • 深圳建设网站的公司简介WordPress多功能投稿
  • 简述织梦网站上传及安怎样在网站上做免费的推广
  • 关于信用体系建设的网站wordpress新闻类模板下载
  • 免费行情软件网站下载大全爱学校vi设计案例
  • 网站外包优化怎样做免费抽皮肤的网站
  • 东八区网站建设网站源码在哪里
  • 重点建设专业 专题网站搜狗官方网站
  • 微信营销工具有哪些使用最佳搜索引擎优化工具
  • 网站推广意识薄弱wordpress授权协议
  • 用php做高中数学题库网站阿里网站建设教程
  • 大兴网站建设公司电话东莞企业网站制作怎么做
  • 网站维护有啥用2021跨境电商最火的产品