likes
comments
collection
share

第九章-操作系统和硬件优化

作者站长头像
站长
· 阅读数 39

——「高性能MYSQL」读书笔记(第九章)

高性能****MYSQL

MYSQL经典书籍,常读常新。

一、硬件优化

在任何一个架构中,硬件服务是服务质量的基础,只有在硬件上足够好,才能提高高质量的服务。对于运行数据库服务的设备而言,首先需要考虑的是在硬件上对设备进行优化。主要是以下四个方面:

1、CPU

CPU应该选用64位,64位操作系统可以给单个进程分配更多的内存,计算较快,高主频、高缓存、高并行处理能力的。

2、内存

内存应该空间足够大,并且主频较高,尽量不用/swap分区来实现内存交换。

3、硬盘

硬盘在保证空间足够的情况下,转速应该够快,这样在硬盘数据的查询速度应该较快,并且可以采用RAID技术来提升存储系统的效能。

4、网络

设备的网卡应该选用标准的千兆网卡,并且在架构上web前端的主机和数据库服务的主机尽量处于同一个局域网内,可以考虑采用端口绑定技术提升安全性混合速度。数据查询流量在保证安全的前提下,可以考虑关闭防火墙等设备,以避免额外的开销。

二、磁盘I/O优化

对于MySQL数据库而言,磁盘I/O的效能直接决定了数据操作的效率。

如果数据库内部数据比较多,可以考虑将数据库的数据单独存放在一个磁盘分区上。

同时,磁盘I/O还与文件系统有关,因此,也要合理的选择磁盘分区的文件系统。并且在挂载时,可以选择noatime选项,不记录访问时间,从而增强访问效率。

在MySQL架构中,大多采用的是读写分离和主从同步的模式,在这种情况下,由于binlog日志操作比较频繁,因此可以将其放在SSD或者是一个单独的磁盘分区上。

三、操作系统优化

由于数据库运行在操作系统之上,因此,操作系统也会对数据库运行造成一些影响,因此,如果是在一个系统上单独运行数据库服务时,可以关闭其他的不必要服务,以免消耗系统资源。同时,还要做好数据库和操作系统的资源分配,既要给给数据库预留大部分系统资源,以保证服务的正常提供,同时还要确保数据库服务不会占用过多系统资源,以免操作系统由于得到的资源过少,而间接的导致数据库服务质量下降。

总结:

  • Mysql服务器性能受制于系统最薄弱的环节,磁盘大小,可用内存,cpu资源网络以及连接他们的组件,都会限制住Mysql的性能。

  • mysql中一方面的缺陷常常会将压力施加在另一个系统之上。例如没有内存的时候,可能会刷出缓存来腾出空间,这时候会导致io过高,所以再发现问题的时候,要尽量注意深沉次的问题。

  • 低延时收益于更快的cpu,高吞吐收益于更多的cpu。

  • mysql还有很多后台工作,那些工作也能受益于多cpu。

  • 备库更多需要io而不是cpu,因为主库备份到备库会使串行任务。

  • cpu的电源管理技术会根据cpu的压力而动态的改变CPU的时钟速度,但是有突发的短查询,会有一段时间来决定cpu是否应该变化,从而导致查询变慢,性能波动。

  • 配置大量内存的最大原因不是因为内存中可以保存大量的数据,而是为了减少io。

  • 随机io从缓存中的收益更大。因为顺序io比随机io快,相比之下,随机读写来说,使用内存比使用io快得多。存储引擎中,一个随机读意味着存储引擎必须执行索引操作,通常从b树查找,而连续通常遍历一个简单的数据结构如链表。

  • 如果有足够的内存,就可以完全的避免磁盘读取操作,但是写操作是必须的,但是可以延迟写操作,集中处理,减少io。如多次写入,一次刷新,io合并。这也是预写日志策略的原因,通过连续写来优化随机io。

  • 工作集是程序真正使用的数据。MySQL中的工作集包括数据和索引,以缓存单位来计数,一个缓存单位是存储引擎工作的数据最小单位。

  • Innodb在默认情况下是16kb,如果要缓存单行数据,事实上,他是缓存了存在该列的页,也就是缓存了16kb的数据。加上索引,可能达到32kb甚至更多。

  • 增加内存并不能真正解决所有的问题,有时候需要加强io,比如存在大量写操作。

从传统磁盘读取数据的过程分为3步

  1. 移动读取磁头到磁盘表面的正确位置上。

  2. 等待磁盘旋转,所有所需的数据在读取磁头下。

  3. 等待磁盘旋转过去,读取磁头读取所需数据。

顺序读主要集中在第3步,而随机读主要集中在1,2步。

  • 固态存储虽然有更好的随机读写和顺序读写,也更加支持并发,但是也存在缺陷,需要经常GC而且写入前需要擦除操作还会磨损整个块(SLC技术100000个写周期存储小,MLC10000个写周期存储大)。

  • 闪存一开始使用特别快,后面会因为垃圾回收而逐渐变慢,最后稳定下来。

  • 像innodb日志文件这样的顺序写的工作负载,闪存不能提供多少成本和性能优势。

  • 如果将mysql的磁盘换成固态,需要调整的配置有:

  1. 增加io线程数,增加并发。

  2. 加大日志。

  3. 禁止预读。

  4. 配置刷新算法。

  5. 禁用双写,因为有些闪存设备支持原子写入。保证数据不会出错。

mysql创建了多种类型的文件:

  1. 数据和索引文件。

  2. 事务日志文件。

  3. 二进制日志文件。

  4. 常规日志。

  5. 临时文件和临时表。

  • 使用多个卷存放这些数据能帮助解决io负载高的问题。但是需要额外的磁盘,成本太高而效果一般。

  • 二进制日志和数据文件分离的真正又是可以减少同时丢失数据和日志文件的可能性。

  • 如果存储系统能保证足够安全,利用多磁盘建立一个RAID比使用多磁盘要好得多。

  • 运行不正常的网络也是主要的性能瓶颈之一。

  • 有用的服务器监控工具

  1. vmstat 注意swap两列应该都是0,说明没有进行内存交换,cpu中的us是cpu使用率。system中的cs是上下文切换次数。不超过100000不担心。procs中的r代表多少进程在等cpu,b多少进程在等io。超过5个需要注意。

  2. iostat 查看io

  3. mpstat 查看cpu

注:通过对操作系统的观察,如资源的使用情况和报错日志,在某些情况下更容易发现程序的性能问题。 本书介绍的许多知识都只是“泛泛而谈”,笔者自己也很少对操作系统或硬件进行调优,读者如果有兴趣深入研究操作系统和硬件,那么建议多阅读相关领域的专门著作。