我正在尝试构建一个实验来测量 ionice 的效果。我想做的是(根据serverfault 的另一个答案)导致足够频繁的 I/O,以至于足够“好的”进程缺乏任何 I/O。
基于serverfault上的另一个答案,我认为我需要每 250 毫秒对一个常见的 cfq 调度设备进行至少一个实际 I/O 操作。我的想法是编写一个简单的程序,它确实有一个循环
fsync()
(强制执行确定的 I/O 操作),usleep()
延迟可配置的时间量lseek()
截断文件(这样我就不会填满文件系统)然后我使用ionice -c3
(空闲调度类)针对公共设备上的一个文件启动程序的一个实例。我同时使用默认(尽力而为)调度类运行各种实例,在公共设备上指定不同的文件(改变延迟值)。
我的假设是,对于“尽力而为”过程中 250 毫秒或更多的延迟值,我会看到“空闲”过程取得的进展;对于小于 250 毫秒的值,我认为“空闲”过程几乎没有进展。
我的观察是这两个过程的性能没有差异。他们都取得了类似的进展。只是为了确定(以防挂钟指示“尽力而为”进程执行 I/O 的速度比每 250 毫秒快得多),我启动了“尽力而为”进程的多个同时实例,指定 no(零)延迟。尽管如此,我仍然没有看到两个调度类中的进程之间的性能差异。
可以肯定的是,我重新检查了调度程序类:
$ cat /sys/block/xvda/queue/scheduler
noop anticipatory deadline [cfq]
Run Code Online (Sandbox Code Playgroud)
关于 cfq 调度程序的工作方式,我缺少什么?
如果重要的话,这是在 2.6.18 内核上。
我已经测试ionice
命令一段时间了,idle
在大多数情况下似乎忽略了(3) 模式。
我的测试是同时运行这两个命令:
<big folder>
<another big folder>
如果我检查两个进程,iotop
我看不到每个进程的 io 利用率百分比有什么不同。
为了提供有关 CFQ 调度程序的更多信息,我使用的是 3.5.0 linux 内核。
我开始做这个测试是因为每次updatedb.mlocate
在我的 Ubuntu 12.10 机器上执行每日 cron 作业时我都在试验系统延迟。
如果您检查该/etc/cron.daily/mlocate
文件,您会发现该命令的执行方式如下:
/usr/bin/ionice -c3 /usr/bin/updatedb.mlocate
此外,有趣的是,每当我的系统出于某种原因开始使用交换内存时,updatedb.mlocate
io 进程的调度速度比kswapd0
进程快,然后我的系统就会卡住。
一些建议?
参考:
背景:
我在工作中使用计算集群(4 个从节点和 1 个头节点),它使用 SGE 作业调度程序。最近我们一直在运行一些执行大量 IO 的作业,它一直在减慢 shell/vim 的使用(小 IO,但我们需要它 24/7 平稳运行)。我找到了 ionice,它似乎是一台计算机的完美解决方案,但我不确定它对集群是否有帮助......
题:
如果我通过带有 ionice 设置(-c2 -n0)的头节点运行一个进程(比如 vim),它是否仍然比其他计算机上的进程(从属设备上的高 IO -c2 -n4)上的进程优先于共享 HD ?
谢谢你的时间!
我需要在 NFS 共享上递归删除数百万个目录,为了避免任何性能问题,我运行了以下命令:
ionice -c 3 -t find /dir -type f -exec rm {};
这将删除所有文件和剩余的空目录,我可以使用 rm -rf 删除。
但我无法说 ionice 对上述命令是否有任何影响。
来自 man,ionice 3 级:
仅当没有其他程序在定义的宽限期内请求磁盘 io 时,以空闲 io 优先级运行的程序才会获得磁盘时间。空闲 io 进程对正常系统活动的影响应该为零。
从源代码中,我看到 ionice set ioprio_set
。
那么,ioprio_set 是什么?
ioprio_get() 和 ioprio_set() 系统调用分别获取和设置一个或多个线程的 I/O 调度类和优先级。
这是否意味着进程线程带有额外的属性供 I/O 调度程序使用它们来调度进程的 I/O?
这向我提出了以下问题:
如果我完全错了,请纠正我。 …
ionice ×4
io ×2
nfs ×2
scheduler ×2
cluster ×1
gridengine ×1
linux ×1
scheduling ×1
storage ×1
ubuntu ×1