在linux系统中I/O 调度的选择

i/o 调度算法再各个进程竞争磁盘i/o的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体i/o性能。
在linux下面列出4种调度算法cfq (completely fair queuing 完全公平的排队)(elevator=cfq):这是默认算法,对于通用服务器来说通常是最好的选择。它试图均匀地分布对i/o带宽的访问。在多媒体应用, 总能保证audio、video及时从磁盘读取数据。但对于其他各类应用表现也很好。每个进程一个queue,每个queue按照上述规则进行merge和sort。进程之间round robin调度,每次执行一个进程的4个请求。
deadline (elevator=deadline):这个算法试图把每次请求的延迟降至最低。该算法重排了请求的顺序来提高性能。
noop (elevator=noop):这个算法实现了一个简单fifo队列。他假定i/o请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样)。在有些san环境下,这个选择可能是最好选择。适用于随机存取设备, no seek cost,非机械可随机寻址的磁盘。
anticipatory (elevator=as):这个算法推迟i/o请求,希望能对它们进行排序,获得最高的效率。同deadline不同之处在于每次处理完读请求之后, 不是立即返回, 而是等待几个微妙在这段时间内, 任何来自临近区域的请求都被立即执行. 超时以后, 继续原来的处理.基于下面的假设: 几个微妙内, 程序有很大机会提交另一次请求.调度器跟踪每个进程的io读写统计信息, 以获得最佳预期.
linux中io调度方法的查看和设置的方法查看当前io
cat /sys/block/{device-name}/queue/scheduler cat /sys/block/sd*/queue/scheduler
例:输出结果如下
noop anticipatory deadline [cfq]
设置当前io
echo {scheduler-name} > /sys/block/{device-name}/queue/scheduler echo noop > /sys/block/hda/queue/scheduler
对io调度使用的建议deadline i/o scheduler 使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,oracle 10g 之类).
anticipatory i/o scheduler 假设一个块设备只有一个物理查找磁头(例如一个单独的sata硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)web,app等应用我们可以采纳as调度.
cfq i/o scheduler使用qos策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统
我在生产环境中测试过一台机器本来流量只有350m的样子,有时压力就不行了,流量也上不去了,因为读比较多,所以使用deadline后,流量上升了50m,从流量之类的图上也见到稳定很多.
linux启动时设置默认io调度让系统启动时就使用默认的io方法,只需在grub.conf文件中加入类似如下行
kernel /vmlinuz-2.6.24 ro root=/dev/sda1 elevator=deadline
有关io的几个内核参数/proc/sys/vm/dirty_ratio
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数 据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10。下面是增大的方法:
echo ‘40′> /proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio
这个参数控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该 降低其数值,一般启动上缺省是 5。下面是增大的方法:
echo ‘20′ > /proc/sys/vm/dirty_background_ratio
/proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。设置方法如下:
echo ‘200′ > /proc/sys/vm/dirty_writeback_centisecs
如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十m/次)且内存有比较多富裕,那么应该增大此数值:
echo ‘1000′ > /proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
这个参数声明linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致io提高太快。建议设置为 1500,也就是15秒算旧。
echo ‘1500′ > /proc/sys/vm/dirty_expire_centisecs
当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十m),那么这个值还是大些的好。

最新消息!三星电子OLED 技术再次获得了新突破
STV9379F场偏转推动器引脚功能及电压
嵌入式技术将成为未来机器市场的核心
前苹果工程师初代iPhone生产线照片曝光
直流电机的电枢电动势
在linux系统中I/O 调度的选择
讲真,魅族魅蓝Note6为何销售如此火爆?采用高通骁龙625芯片还有4000mAh大电池
德州仪器助力联想集团推出全新高级驾驶辅助系统(ADAS)平台
菜鸟无人机亮相:将物流技术运用到传统的茶叶运输环节
低压驱动RF MEMS开关设计与改进
续小米之后家电巨头创维集团宣布造车!
中国移动2020年光缆大单14家中标 华为拿下意大利电信5G订单
全新HarmonyOS 3.0系统即将推出
TPS6209x同步降压转换器简介
大族激光切割技术以智能制造赋能农业机械装备
华为要求增加供货的厂商,包括MLCC制造商村田制作所
无线温度传感器设计方案集锦
简单实用的人体接近探测器,Capacitance probe
非洲猪瘟快速筛查系统HM-PCR仪器的特点是什么
海能达推出数字防爆对讲机 配备高容量电池