每天进步一点点————磁盘I/O问题

来源:互联网 发布:网络上玄学是什么意思 编辑:程序博客网 时间:2024/05/29 09:09

一、           磁盘I/O问题

1.   使用磁盘阵列

RAID(廉价的磁盘冗余阵列)

如何选择RAID:

         数据读写都很频繁,可靠性要求也很高,那么最好选择RAID10

         数据读很频繁,写相对较少,对可靠性有一定要求,可以选择RAID5

         数据读写都很频繁,但是可靠性要求不高,可以选择RAID0

使用symbolic links 分布I/O

         默认情况下创建的数据库和表都存放在datadir目录下,这样如果不使用RAID 所有表都存放在一个磁盘设备上,无法发挥多次盘并行读写的优势。这种情况下可以利用操作系统的符号链接(symbolic links)将不同的数据库、表或索引指向不同的物理磁盘,而达到分布磁盘I/O的目的

         (1)将一个数据库指向其他磁盘物理磁盘

 

[root@localhost/]# ln -s  /back/databses/test98/usr/local/mysql/data3/test98

 

         (2)将MyISAM表的数据文件或索引文件指向其他物理磁盘。

 

 

mysql> create table test99(id int) engine=myisamdata directory='/back/test99' index directory='/back/test99index';

 

Query OK, 0 rows affected (0.00 sec)

 

 

         (3)在Winodws下使用符号链接

 

在windows下,需要使用.sym的文本文件来实现

创建个文件c:\mysql\data\foo.sym  然后在里面输入D:\DATA\foo,这样数据库foo创建的表都会存储在D盘的data\foo目录中。

禁止操作系统更新文件的atime属性

         atime是Linux/Unix系统下的一个文件属性,每当读取文件时,操作系统都会将度操作发生的时间会写到磁盘上。但是对于读写频繁的数据库为念来说,记录文件访问时间没有任何用处,却会增加磁系统的负担,影响I/O性能。

 

修改文件系统配置文件/etc/fstab指定noatime选项                 

 

[root@localhost /]# vim /etc/fstab

/dev/mapper/VolGroup-lv_root/                       ext4    noatime        1 2

 

重新mount文件系统

 

[root@localhost /]# mount -oremount /

使用裸设备(Raw Device)存放InnoDB的共享表空间

         MyISAM存储引擎有子集的索引缓存机制,但是数据文件的读写完全以来操作系统,操作系统磁盘I/O缓存对MyISAM表存取很重要。但是InnoDB存储引擎与MyISAM存储引擎不同,它采用类似Oracle的数据缓存机制来Cache索引和数据,操作系统的磁盘I/O缓存对其性能不仅没有帮助,甚至还有反作用。因此,InnoDB缓存充足的情况下,可以考虑使用Raw Device来存放InnoDB存放表空间

 

具体方法如下:

         (1)修改MySQL配置文件,在innodb_data_file_path参数中增加裸设备文件名并制定newraw属性

 

[mysql]

innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw

 

 

         (2)启动MySQL,使其完成分区初始化工作,然后关闭MySQL。此时还不能创建或者修改InnoDB表。

         (3)将innodb_data_file_path中的newraw改成raw

 

[mysql]

innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw

 

         (4)重新启动即可使用。

2.   调整I/O调度算法

      Linux实现的4种I/O算法,分别为NOOP算法(NOOperation)、最后期限算法(Deadline)、完全公平队列算法(CFQ)以及预期算法(Anticipatory)

         NOOP算法:不对I/O请求排序,除了合并请求也不会进行其他优化,最简单的先进先出FIFO队列提交I/O请求。

         最后期限算法:除了为何一个用友合并和排序功能的请求队列外,额外维护两个队列,分别是读请求队列和写请求队列,它们都是带有超时的FIFO队列,当新来一个请求,会被插入普通杜列和读/写队列,然后I/O调度器正常处理普通队列的请求。当调度器发现读/写请求队列中的请求超时的时候,会有线处理这些请求,保证尽量不产生饥饿请求。当系统存在大量的顺序请求的时候,Deadiline可能导致请求无法很好的排序,引发频繁寻道。

         预期算法:是基于预测的I/O算法,它和Deadline很类似,也维护三个请求队列,区别在于,预期算法处理完一个I/O请求之后不会直接返回处理下一个请求,而是等待片刻(默认6ms),等待期间如果有新来的相邻扇区请求,会直接处理新的请求,当等待时间结束后,调度才返回处理下一个队列请求。

         完全公平队列:把I/O请求按照进程分别放入进程对应的队列中。CFQ的公平是针对进程而言,每个提交I/O请求的进程队会有子集的I/O队列,CFQ以时间片算法为前提,轮转调动队列,默认从当前队列中取出4个请求处理,然后处理下一个队列的4个请求,确保每个进程享有的I/O资源是均衡的。

 

         在完全随机访问环境下,CFQ和Deadline心更难差异性很小,但是在有大的连续的I/O队列,CFQ可能会造成较小的I/O的响应延时增加,所以建议MySQL数据库环境设置为Deadiline算法,这样更稳定。对于ssd等设备,采用Noop或者Deadline通常也是可以获取比默认调度器更好的性能。

 

 

查看当前设备(/dev/sda)使用的调度算法

[root@localhost/]# more /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

修改当前块设备(/dev/sda)使用的调度算法

[root@localhost/]# echo "deadline">/sys/block/sda/queue/scheduler

永久修改I/O调度算法,

[root@localhost~]# more /boot/grub/menu.lst

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grubafter making changes to this file

# NOTICE: You have a /boot partition.  Thismeans that

#         all kernel and initrd paths are relative to /boot/, eg.

#         root (hd0,0)

#         kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root

#         initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux(2.6.32-358.el6.x86_64)

       root (hd0,0)

       kernel /vmlinuz-2.6.32-358.el6.x86_64 roroot=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swapcrashkernel=128M LANG=zh_CN.UTF-8 rd_LVM

_LV=VolGroup/lv_root  elevator=deadline KEYBOARDTYPE=pc KEYTABLE=usrd_NO_DM rhgb quiet

       initrd /initramfs-2.6.32-358.el6.x86_64.img

0 0
原创粉丝点击