Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1422433
  • 博文数量: 122
  • 博客积分: 340
  • 博客等级: 一等列兵
  • 技术积分: 2967
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 11:50
个人简介

说点什么呢

文章分类

全部博文(122)

文章存档

2018年(2)

2017年(1)

2015年(2)

2014年(30)

2013年(81)

2011年(5)

2009年(1)

分类: LINUX

2013-12-10 10:08:30

1. 数据块层

数据块大小

在系统中,对块设备的操作是以数据块为单位进行的,也就是操作系统是以数据块的形式来操作块设备的。所以,对不同的应用,数据块的大小对系统的性能有很大的影响。对像WEB这类主要是由较小文件组成的系统,在建立文件系统时,我们可以适当的将块的大小调小就可以提升系统的整体性能,而对天数据库这类以大文件存放的应用系统,我们就需要调大数据块的大小。指定数据块的大小可以用命令mkfs  -t ext3 -b 4096 /dev/sda1 来完成。经验证,在2.6.18的内核里,这个大小的范围是从1024~4096 之间。只有在创建文件系统时才能指定块的大小,数据块的大小一经指定,就不能再修改,否则数据会丢失。

I/O调度器

之前的2.4的内核在I/O调度方面,只有一种通用的调度算法,而到.2.6内核中,内核提供四种I/O调度算法供选择,它们各自己适合于不同的场景:

Anticipatory调度器:

anticipatory曾经一度是 Linux 2.6 Kernel 的 标准IO 调度器 。Anticipatory 的中文含义是"预料的预想的", 这个词的确揭示了这个算法的特点,简单的说,有个 IO 发生的时候,又有进程请求 IO 操作,则将产生一个默认的 毫秒猜测时间,猜测下一个进程请求IO是要干什么的,一旦这两个先后的I/O请求是相似的,系统将合并这两个I/O,以减少磁头来回寻址的时间。所以该调度器在写数据的时候会有6ms的等待时间。这对于绝大部分应用有很好的性能,如文件服务器和WEB服务器,但是对于数据库服务器的效果却很糟糕!

完全公平队列调度器(Complete Fair Queuing , CFQ): CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到I/O带宽.I/O调度器每次执行一个进程的4次请求在最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器也是最好的选择.CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,deadlineas调度器的折中.CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择.CFQ赋予I/O请求一个优先级,I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级.

截止时间调度器(deadline)它是一个带有截止时间算法的循环调度器。即对于一个I/O请求,deadline确保在一个截止时间之前服务它,个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.Deadline调试器对于数据库环境(Oracle, Mysql)是最好的选择,同时它也非常适合于实时要求很高的环境,以及大磁盘吐吞量的环境下。

NOOP调度器:这个调度器只是一个简单的先进先出(FIFO) 队列调度器,它不对I/O数据做任何的排序,仅仅只简单的合并相邻的数据请求。NOOP调度器假设块设备有自己的调度算法,如SCSITCQ,或才对应的块设备不需要来回移动磁头寻址,如闪存或RAM等。所以,NOOP调度器也是这类设备的最好选择。

I/O调度器的查看和修改

查看当前系统可以支持的I/O调度器命令:

# dmesg | grep -i scheduler  输出类似:

io scheduler noop registered

io scheduler anticipatory registered (default)

io scheduler deadline registered

io scheduler cfq registered

查看当前系统正在使用的调度器命令:

# cat /sys/block/sda/queue/scheduler 输出类似于:

noop [anticipatory] deadline cfq  则表示当前使用的是anticipatory调度器

临时更改调度器命令:

# echo cfq >/sys/block/sda/queue/scheduler

永久更改调度器方法:

# vi /boot/grub/grub.conf 在对应内核后面添加参数elevator=[调度器名称anticipatory] 如类似如下内容:

kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/md0 elevator=anticipatory rhgb quiet

然后重启系统即可。

2. 使用ionice设置IO的优先级

CFQ 调度算法的一个新的特性就是可以从进程的级别上设置IO的优先级。使用ionice工具可以限制指定的进程使用磁盘系统的利用率。当前,使用ionice工具可以设置三个优先级,它们是:

Idle: 如果一个进程的IO优先级被设置成Idle的话,那么即表示只有当没有IO优先级高于best-effort级别的进程访问磁盘时才被允许访问磁盘。这个设置对于设置那些仅需在系统资源空闲时才运行的任务非常有用,如updatedb任务。

Best-effor:这个是所有进程的默认IO级别;

Real time:这是IO最高的优先级。如果进程被设置成这个优先级则意味着进程总是能优先获取访问磁盘的机会。这个优先级有8个优先级。

ionice工具有以下选项:

-c<#>  I/O的优先级 1表示 real time 2代表best-effort ,3代表idle

-n<#>  I/O优先级的等级,范围为0~7

-p<#> 进程号

下例表示将PID113的进程的优先级设置为Idle

ionice -c3 -p113

阅读(894) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~