mysql 性能调优之系统角度优化
作为应用系统的持久化层,不管数据库采取了什么样的cache机制,但数据库最终总是要将数据存储到可以长久保存的I/O设备-磁盘,对于比较大的数据库,磁盘I/O一般总会成为数据库的一个性能瓶颈。。
本文从磁盘阵列,符号链接,裸设备等底层的方面来简单介绍提高磁盘I/O能力的一些技术和方法。。
(yi)使用磁盘阵列
目前磁盘速度,一般来说(并不准确):
sata <150m/s
scsi <200m/s
sas 200m/s左右
ssd 500m/s左右
评判硬盘,1.硬盘速度2.iops
现代硬盘的缺陷:IO性能极弱、稳定性极差
raid:廉价磁盘冗余阵列技术是通过多磁盘并行运行来提高计算机的存储IO性能。控制器对磁盘进行集合。
1.提供冗余
2.提高访问速度
raid 0:读写性能
raid0使用最少两块硬盘,在读写时,将数据分开读写到多块硬盘的方式(并行写读)来提高读写性能。
空间利用率:所有硬盘空间之和
性能:所有硬盘速度之和,
冗余性:无冗余。一块盘坏,则全部损坏。适合:读写要求高,安全性不强调。
示例:DISK0(a1,a3),DISK1(a2,a4),操作系统往磁盘写数据,会平均的将数据写到两块磁盘。
raid 1(镜像):读写性能、冗余性
raid1使用最少2块硬盘,在写数据时,将数据复制写到多块硬盘。在读数据时,以提供冗余性。同时从多块硬盘读取数据,以提高读性能。
示例:DISK0(a1,a2,a3,a4)DISK1(a1,a2,a3,a4)
空间利用率:所有磁盘中最小的那块(浪费50%)
性能:读性能为所有硬盘速度之和,写性能会有所减弱
冗余能力:只要有一块正常,数据就正常。
数量:disk最好不要超过6块。
一般用在,对数据安全性要求较高的地方,对写性能不是很要求的。
raid 5:读写性能、冗余性(允许损坏1块硬盘)
raid 5最少使用3块硬盘,raid5与raid0类似,读写数据的时候会将数据分布式的读写在所有硬盘上,但是在读写数据的时候会对数据进行奇偶校验运算,将校验信息同时保存在硬盘上,校验信息可以进行数据恢复使用。
示例:DISK0(a1,b1,c1,dp),DISK1(a2,b2,cp,d1),DISK2(a3,bp,c2,d2),DISK3(ap,b3,c3,d3)
空间利用率:1-1/n
性能:读性能接近raid0,写性能较raid0弱一些
冗余能力:可接受1块硬盘损坏,当损坏一块硬盘后,整体raid5性能会严重下降。
raid 6:读写性能、冗余性(允许损坏2块硬盘)
raid6最少使用4块硬盘,raid6与raid5类似,读写数据的时候会将数据分布式的读写在所有硬盘上。并保存奇偶校验信息(写两份校验信息),但是会比raid5多保存一份校验信息。所以冗余性较raid5有所提升。
空间利用率:1-2/n
性能:读写性能接近raid5,读性能比raid5弱一点
冗余能力:可接受2块硬盘损坏。
raid 10
raid1:disk0(a1,a2),disk1(a1,a2);
raid1:disk0(a1,a2),disk1(a1,a2);
对两个raid1做raid0.
raid 01
raid 0:disk0(a1,a3),disk1(a2,a4);
raid 0:disk0(a1,a3),disk1(a2,a4);
对两个raid0做raid1.
1.读写性能高
2.冗余50%
生产环境,raid10和raid01性能都不错,均可使用。不建议使用raid1-6。
软件RAID
通过系统功能或raid软件实现raid,没有独立硬件和接口,需要占用一定的系统资源(cpu,硬盘接口速度),并且接受操作系统稳定性影响。
硬件RAID(生产环境)
通过独立的raid硬件卡实现,有些主板集成raid硬件,有些需要购买独立的raid硬件卡,硬件raid实现不需要占用其他硬件资源,稳定性和速度都比软件raid要强。
选择合适的RAID级别
1.数据读写都很频繁,可靠性要求也很高,最好选择RAID 10
2.数据读很频繁,写相对较少,对可靠性有一定要求,可以选择RAID 5
3.数据读写都很频繁,但可靠性要求不高,可以选择RAID 0
(er)使用 symbolic links 分布I/O
mysql 的数据库名和表名是与文件系统的目录名和文件名对应的,默认情况下,创建的数据库和表都存放在参数 datadir 定义的目录下。这样如果不使用RAID或逻辑卷,所有表都存放在一个磁盘设备上,无法发挥多磁盘并行读写的优势。在这种情况下,就可以利用操作系统的符合连接(symbolic links)将不同的数据库或表,索引指向不同的物理磁盘,从而达到分布磁盘I/O的目的。。
1.将一个数据库指向其他物理磁盘
先在目标磁盘上创建目录,然后再创建从mysql 数据目录到目标目录的符号链接:
shell>mkdir /otherdisk/databases/test
shell>ln -s /otherdisk/databases/test /path/to/datadir
2.在windows 下使用符号链接
在windows 下,是通过在mysql 数据文件目录下创建包含目标路径并以 .sym 结尾的文本文件来实现的。
示例:mysql 的数据文件目录是:C:\mysql\data ,要把数据库 wolihaito 存放到 D:\data\wolihaito
1.创建目录:D:\data\wolihaito
2.创建文件:C:\mysql\data\wolihaito.sym ,在其中输入D:\data\wolihaito这样在数据库foo 创建的表都会存储到D:\data\wolihaito目录下。
注意:使用symbolic links 存在一定的安全风险,如果不使用symbolic links ,应通过启动参数 skip-symbolic-links 禁用这一功能。
(san)禁止操作系统更新文件的atime 属性
atime 是Linux /unix 系统下的一个文件属性,每当读取文件时,操作系统都会将读操作发生的时间回写到磁盘上。对于读写频繁的操作系统文件来说,
记录文件的访问时间一般没有任何用处,却是会增加磁盘系统的负担,影响I/O 的性能。因此,可以通过设置文件系统的mount 属性,阻止操作系统写atime 信息,以减轻磁盘I/O 的负担
示例:linux 下调整
1.修改文件系统配置文件/etc/fstab,指定noatime 选项:
LABEL=/home /home ext3 noatime 1 2
2.重新mount 文件系统:
mount -oremont /home
(si)用裸设备(Raw Device) 存放innodb 的共享表空间
innodb 采用类似oracle 的数据缓存机制来cache 索引和数据,操作系统的磁盘I/O 缓存对其性能不仅没有帮助,甚至还有反作用。因此在innodb 缓存充足的情况下,可以考虑使用raw device 来存放innodb 共享表空间。
操作如下:
1.修改mysql 配置文件,在innodb_data_file_path 参数中增加裸设备文件名并指定newraw 属性
[mysqld]
......
innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
......
2.启动mysql ,使其完全分区初始化工作,然后关闭mysql 。此时还不能创建或修改innodb 表。
3.将innodb_data_file_path 中的newraw 改成raw:
......
innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
.....
4.重新启动即可开始使用。