没想到啊

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  6 随笔 :: 379 文章 :: 97 评论 :: 24万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
我们开发自己的存储引擎页面缓存替换策略的过程中主要是参考了InnoDB与LRU-K算法。InnoDB缓存替换策略使用分代与LRU相结合的方式。分为old和young两个分代,系统维护old分代占总buffer大小的3/8左右。当一个页面第一次被访问时,是加入到old分代的lru头。并不是每次访问一个页面时就将这个页提到lru的头部,而是在这个页面在LRU中的位置调整后,是否有很多页面已经被替换出去,若有,则将这个页面移到LRU头。系统在每个页记录调整该页在lru中位置当前系统总共替换了多少个数据页,比较页中记录的这个计数与系统全局页替换计数,就可以发现上次调整这个页在lru链表中位置后,系统中又有多少个页被替换,若比较多,则再次调整该页在lru中的位置。由于第一次访问的页被加入到old分代中,因此一次表扫描不会导致young分代中的页被替换出去。

 

    总的来说InnoDB的缓存替换策略非常简单,性能开销很低,但不知道其效果如何,因此今天进行了测试。测试时的表每条记录包含一个INT和两个CHAR(200)类型的字段,共20万条记录,其访问概率使用screw为1.2的Zip-f分布生成,这样访问概率最高的10%的记录的总访问概率为95%。表大小约占7000个页面,测试时设置InnoDB可用于存储数据的缓存页为730(InnoDB缓存大小必须设置为64个页的整数倍,无法精确控制到700个),约为数据量的10%。这时,理论上最优的缓存失配率应为5%。

    使用10个线程进行测试,每个进行100000次随机操作,每个操作根据概率随机访问一条记录。测试之前先进行了一次全表扫描来预热。

    

    测试之前各类读操作统计如下

| Innodb_buffer_pool_reads          | 77        |

 

    | Innodb_data_reads | 7004 |

    | Innodb_pages_read | 6994 |

    

    测试之后各类读操作统计如下

| Innodb_buffer_pool_reads          | 72055      |

 

    | Innodb_data_reads | 95197 |

    | Innodb_pages_read | 95187 |

    

如果按Innodb_buffer_pool_reads计算,即不考虑预读时,测试期间读取的页面数为72000左右,失配率为7.2%。如果按Innodb_pages_read计算,即考虑预读时,测试期间读取的页面数为88200左右,失配率为8.8%。如理想的5%相比两者都还是有一定距离的。若能优化到理想状态,大致可以减少40%的IO。

 

    同样的条件对比测试了一下,我们的存储引擎测试期间产生的读操作为62100次,稳定时的失配率为6.1%左右。目前还不清楚为什么我们的存储引擎为什么表现会比InnoDB要好,因为两者的策略是类似的。可能是因为InnoDB中的预读机制在这类纯随机的负载下反而会影响到缓存的命中率。由于Innodb_pages_read明显的超过Innodb_buffer_pool_reads的增长,可以看出测试过程中InnoDB也在不定的进行预读,有可能预读进来无用的页面,导致有用的页面被替换出去。我们的存储引擎的预读检测机制有所不用,在测试期间没有发生预读。

 

我们猜你喜欢:

  1. MySQL数据库InnoDB数据恢复工具使用总结 [2012-03-05 10:06:35]
  2. Row Cache For Innodb [2011-09-10 17:23:21]
  3. 快速预热Innodb Buffer Pool的方法 [2011-07-11 11:12:22]
  4. Innodb Crash Recovery恢复时间的飞跃 [2011-07-13 12:24:18]
  5. 存储方式与介质对性能的影响 [2011-06-10 15:49:58]
  6. InnoDB的多版本一致性读的实现 [2011-03-24 00:08:35]
  7. 动态加载Innodb Plugin [2010-11-12 16:37:40]
  8. 思考mysql内核之初级系列14---innodb的旧式记录结构 [2010-09-07 01:54:00]
  9. 思考mysql内核之初级系列13---innodb的簇页管理 [2010-08-27 23:14:00]
  10. 思考mysql内核之初级系列12---innodb的簇描述结构 [2010-08-22 23:54:00]
  11. Innodb Log写入方式分析 [2010-08-19 13:35:45]
  12. 思考mysql内核之初级系列11---innodb的页编号 [2010-08-15 15:10:00]
  13. InnoDB主键设计 [2010-08-03 16:08:33]
  14. 思考mysql内核之初级系列9---innodb动态数组的实现 [2010-08-01 20:54:00]
  15. 思考mysql内核之初级系列8---innodb的list算法 [2010-08-01 16:50:00]
  16. 思考mysql内核之初级系列7---innodb的hash表实现 [2010-07-25 16:59:00]
  17. 思考mysql内核之初级系列6---innodb文件管理 [2010-07-24 22:29:00]
  18. 思考mysql内核之初级系列5---information_schema不是innodb数据字典 [2010-07-18 23:50:00]
  19. 思考mysql内核之初级系列4--innodb缓冲区管理 [2010-07-13 00:23:00]
  20. XtraDB/Innodb内部结构示意图 [2010-05-03 18:14:54]
  21. InnoDB Double write [2010-02-08 16:26:00]
  22. Innodb 表和索引结构 [2010-01-20 22:11:44]
  23. InnoDB线程并发检查机制 [2010-02-05 22:37:41]
  24. Innodb 多版本实现 [2010-01-05 22:08:10]
  25. InnoDB线程并发检查机制 [2009-12-30 17:02:41]
  26. Innodb文件表空间结构 [2009-12-15 20:38:50]
  27. Innodb如何使用内存 [2009-12-12 23:17:12]
  28. 更改Innodb 数据页大小优化MySQL [2009-12-13 14:24:25]
  29. InnoDB的”替代品”:Percona XtraDB [2009-12-07 12:49:22]
  30. 推荐使用innodb_plugin [2009-11-07 21:13:10]
  31. Innodb共享表空间VS独立表空间 [2009-10-12 16:12:52]
  32. 多版本并发控制:PostgreSQL vs InnoDB [2009-11-07 22:15:44]
  33. InnoDB线程并发检查机制 [2009-11-07 21:52:02]
  34. MySQL InnoDB性能调整的一点实践 [2009-09-03 13:36:34]
  35. MyISAM和InnoDB的一些记录 [2009-09-05 17:03:32]
  36. Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 [2009-06-18 10:54:21]
  37. MyISAM和InnoDB的插入性能测试 [2009-07-13 15:20:41]
  38. InnoDB select性能拐点测试 [2009-07-26 23:19:25]
  39. InnoDB insert性能拐点测试 [2009-07-28 22:40:38]
  40. InnoDB之Dirty Page、Redo log [2009-08-18 10:01:22]
  41. 随机主键对InnoDB插入性能的影响 [2009-08-18 11:30:29]
  42. 使用memc-nginx和srcache-nginx构建高效透明的缓存机制 [2011-10-10 16:54:36]
  43. 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制 [2011-10-02 23:10:00]
  44. 缓存设计的一些思考 [2011-06-19 20:37:08]
  45. Linux高速缓存使用率调查 [2011-06-01 17:33:09]
  46. 强制刷新本地 DNS 缓存记录 [2011-02-01 12:36:21]
  47. 前端开发中的性能那点事(三)php的opcode缓存 [2010-12-31 11:47:33]
  48. 系统架构的一些思考 [2010-12-22 08:37:00]
  49. squid缓存失效之谜:一步步提高squid缓存命中率办法记录 [2010-11-30 13:44:10]
  50. 分布式缓存系统 Memcached 入门 [2010-11-25 11:32:30]
  51. PHP加速器 eaccelerator 缓存原理 [2010-11-02 23:57:27]
  52. 谈冷热数据 [2010-10-23 12:10:00]
  53. 一个cache的改造过程 [2010-10-18 18:38:26]
  54. MySQL的高速查询缓存强制要求使用高速缓存 [2010-10-07 18:36:07]
  55. javascript 缓存提供程序 [2010-07-13 09:25:01]
  56. 浏览器缓存机制 [2010-03-05 14:19:51]
  57. 小心对待query_cache_size [2010-01-08 14:25:19]
  58. PHP强制浏览器不缓存的方法 [2009-12-24 17:33:51]
  59. 控制浏览器是否缓存网页状态 [2009-10-09 14:59:00]
  60. 面向站长和网站管理员的Web缓存加速指南[翻译] [2007-09-06 00:28:05]
  61. 基于反相代理的Web缓存加速――可缓存的CMS系统设计 [2003-06-06 17:27:18]
  62. 清除Firefox下Flash(swf文件)缓存 [2009-05-08 22:59:34]
  63. Query Cache,看上去很美 [2009-08-27 13:57:04]
  64. mysql cache功能小记 [2009-10-09 14:15:00]
  65. Smarty之缓存操作 [2008-06-01 18:07:55]

http://blogread.cn/it/article.php?id=162&f=sa

posted on   没想到啊  阅读(691)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示