vlambda博客
学习文章列表

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.重新启动即可开始使用。