高性能MySQL笔记(下)
来自Alex's wiki
相关文章:高性能MySQL笔记(上)
目录
第九章操作系统和硬件优化
9.1什么限制了MySQL的性能
最常见的两个瓶颈是CPU和I/O
9.2如何选择CPU
快速CPU还是多CPU,有两个目标:
- 低延时(快速响应)
- 要做到这一点就需要高速CPU
- 高吞吐
- 如果能同时运行很多查询,则可以从多CPU中受益
MySQL复制,也能在高速CPU下工作的非常好,而多CPU对复制的帮助不大。而备库的瓶颈通常是I/O子系统而不是CPU(因为在备库上已经被简化成了串行化任务)
9.3平衡内存和磁盘资源
- 顺序I/O比随机I/O快
- 内存随机访问比磁盘随机访问快了2500倍,但顺序读只比磁盘快了10倍左右
- 假设每次读取100字节:
- 磁盘 随机寻道:100次/S ; 50M/S的顺序读
- 内存 随机访问:25万次/S; 顺序访问:500万次/S。内存的顺序读写速度一般都在10G/S以上
- 缓存命中率
- 缓存命中率实际上也会决定使用了多少CPU,所以评估缓存命中率的最好方法是看CPU的使用率。
- 例如,若CPU使用了99%的时间工作,用了1%时间等待I/O,那缓存命中率还是不错的。(REF: 7.12节论述了查询缓存,不要和这里的概念混了)
9.4固态存储
闪存最重要的两个特性:1、提升随机I/O;2、提高并发操作
写放大及垃圾收集 对性能影响较大(尤其是空间快满了的时候)
9.4.2闪存技术
有两种闪存类型:
- 单层单元(SLC):每个单元存储一个比特(0或1)。SLC相对更昂贵,但非常快,并且擦写寿命高达100000个写周期(20年左右)缺点是存储密度相对较低
- 多层单元(MLC):每个单元存储2个比特(3个比特设置也正在进入市场中)。这使得存储密度提高了,但速度和耐擦写性能降低了。一个不错的MLC设备可能被定为10000个写循环周期(2年)
9.4.3闪存的基准测试
闪存的三阶段模式,我们称为A-B-C模式:
- A:开始阶段,通常运行比较快
- B:过度状态状态,此时垃圾回收开始工作
- C:稳定状态,此时最慢
作者的基准测试:
http://www.ssdperformanceblog.com http://www.mysqlperformanceblog.com
9.4.4固态硬盘
SSD是否配置电容或者电池是我们必须关注的特性
9.4.5PCIe设备
没有什么能比得上PCIe设备上获得的性能。缺点是它们太贵了。
9.4.6什么时候应该使用闪存
- 一些事务或插入繁忙的工作负载
- 单线程负载是另一个闪存的潜在应用场景。MySQL复制是单线程工作的典型例子,它可以从低延迟中获得很多收益
- 闪存也可以为服务器整合提供巨大的帮助,尤其是PCIe方式的。我们已经看到了机会,把很多实例整合到一台物理服务器——有时高达10或15倍的整合都是有可能的(详见11章)
然而缓存也可能不一定是你要的答案。一个很好的例子是,像InnoDB日志文件这样的顺序写的工作负载,闪存不能提供多少性能优势,因为这种情形下,闪存连续写方面不比标准硬盘快多少。这样的工作负载也是高吞吐的,会耗尽缓存的寿命。在标准硬盘上存放日志文件通常是一个更好的主意,用具有电池保护的写缓存的RAID控制器。
有时答案在内存/磁盘的比例,而不只是磁盘。
9.4.7使用Flashcache
Flashcache创建了一个块设备,并且可以被分区,也可以像其他块设备一样创建文件系统,特点是这个块设置是由闪存和磁盘共同支撑的。闪存设备用作读取和写入的告诉缓存。
- 尽管理论上Flashcache可能更高效,但最终性能并不如低层闪存那么好。
- 从测试来看,尚不清楚对写负载有多大好处,但对读肯定有好处。于是它适合这样的情况:有大量的读I/O,并且工作集比内存大的多。
- 除了实验,这里有个生产环境的实例经验:有个4T的数据库,这个数据库遇到了很大的复制延迟。我们给系统加了半个TB的Virident PCIe卡作为存储。然后安装了Flashcache,并且把PCIe作为绑定设备的闪存部分,复制速度就翻了一倍
- 关于磁盘的IOPS
- 7200 rpm的磁盘 IOPS = 1000 / (9 + 4.17) = 76 IOPS
- 10000 rpm的磁盘IOPS = 1000 / (6+ 3) = 111 IOPS
- 15000 rpm的磁盘IOPS = 1000 / (4 + 2) = 166 IOPS
- 参考 磁盘性能指标--IOPS 理论