nice(1)很多人都知道,它主要是影响CPU调度的.而ionice则主要是影响磁盘调度的.
使用ionice基本上在下面两种情况:
1)虽然不需要太多磁盘IO,但是希望反应快速.
2)有大量的磁盘IO需求,但是对时间没有太多要求,也就是不着急完成.
我们举一些例子来看:
1)在高速网络上下载大容量的视频文件等.
2)拷贝大文件
3)执行系统备份
4)系统更新
ionice(1)man手册 说的比较详细,他把磁盘IO调度分为了三类:
idle: 空闲磁盘调度,这类调度策略是当系统没有其他进程需要做磁盘IO时,它就开始做,因此他对系统其他进程的影响基本上是0,他另外设有0-7 八个优先级别,数字越小,优先级越高.
best effort: 这是缺省的磁盘IO调度策略,默认继承系统的IO磁盘调度.
real-time: 实时的磁盘IO调度,从名字看就知道,设置这个级别,表示这个进程立刻开始访问磁盘,不管系统中其他进程是不是有磁盘IO,它很有可能让其他有磁盘IO需求的进程处于等待状态.
这三个类型分别用数字3,2,1表示.也符合数字越小,优先级越高的原则.
比如,我现在安装了google桌面,这是一个典型的大量磁盘IO需求的进程,于是我采用下面的方式
#ionice -c3 -n7 -p2684 这里的2684是进程号.
当然你可以#ionice -c3 -p$$来将当前的进程(就是shell)磁盘IO调度设置为idle类型.
不过这个程序有一些”怪癖”的要求:
1)它仅仅工作在2.6.13及以上内核版本上,并且采用了CFQ的IO调度方式.感觉CFQ是刚刚推出的,而这个程序2005年就出来了,那也就是说CFQ调度策略2005年之前就有了?
通过下面的命令可以得知你的系统采用了什么样的调度算法:
#cat /sys/block/[sh]d[a-z]*/queue/scheduler
比如我的系统输出如下:
cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]
你可以在启动时,给内核参数加上elevator=cfq来设置缺省的IO调度方式是CFQ.
2)idle优先级会让块设备处于idle状态,如果你的后台任务正在使用磁盘,那么你会发现后台进程明显变得缓慢起来.所以设置这个参数的时候还是小心一点.
3)有些文件系统,特别是reiserfs和XFS,他们似乎不太遵循这个标准,因此不建议使用.