Nei*_*ski 5 linux io kernel scheduler linux-kernel
我们正在使用一个相当繁忙的网络服务器。我们想使用 rsync 进行一些数据移动,这显然会影响磁盘,因此我们曾经ionice将 rsync 进程放在空闲类中。系统 (SSD+HDD) 上两个磁盘的队列都设置为使用 CFQ 调度程序。结果……磁盘被彻底砸烂,网站性能惨不忍睹。
我已经做了一些挖掘,看看是否有任何调整可能对此有所帮助。手册页ionice说:
Idle: A program running with idle I/O priority will only get disk time
when no other program has asked for disk I/O for a defined grace period.
The impact of an idle I/O process on normal system activity should be zero.
Run Code Online (Sandbox Code Playgroud)
在谷歌的帮助下,我在任何可以找到的地方都没有清楚地解释这个“定义的宽限期”。一个帖子表明它的价值,fifo_expire_async但我找不到任何真正的支持。
然而,在我们的系统上,fifo_expire_async和fifo_expire_sync都设置得足够长(250 毫秒、125 毫秒,这是默认值),空闲类实际上根本不应该获得磁盘带宽。即使认为宽限期是由设置的人fifo_expire_async是完全错误的,在“空闲 I/O 进程对正常系统活动的影响应该为零”这句话中也没有太多的回旋余地。
显然这不是我们机器上发生的事情,所以我想知道 CFQ+idle 是否只是坏了。
有没有人设法让它工作?非常感谢提示!
更新:
我今天做了更多的测试。我编写了一个小型 Python 应用程序来读取整个磁盘中的随机扇区,中间有短暂的睡眠。我在没有 ionice 的情况下运行了这个副本,并将其设置为每秒执行大约 30 次读取。然后,我用不同的ionice类运行了应用程序的第二个副本,以查看空闲类是否按照盒子上的说明进行操作。当我使用类 1、2、3(实时、尽力而为、空闲)时,我发现结果之间根本没有区别。尽管事实上我现在绝对确定磁盘很忙。
因此,我现在确定 - 至少对于我们的设置 - CFQ+idle 不起作用。[请参阅下面的更新 2 - 与其说是“不起作用”,不如说是“没有按预期工作”...]
仍然非常欢迎评论!
更新 2: 今天更多地探讨。发现当我显着提高 I/O 速率时,空闲类进程实际上开始变得饥饿。在我的测试中,发生这种情况的 I/O 速率远高于我的预期——基本上是每秒数百次 I/O。我仍在努力弄清楚调整参数的作用......
我还发现了一个相当重要的事实,即异步磁盘写入根本不包括在 I/O 优先级系统中!ionice我上面引用的手册页没有提到这个事实,但是系统调用的手册页很有帮助ioprio_set()地指出:
读取和同步(O_DIRECT、O_SYNC)写入支持 I/O 优先级。异步写入不支持 I/O 优先级,因为它们是在弄脏内存的程序上下文之外发出的,因此程序特定的优先级不适用。
这极大地改变了我处理性能问题的方式,我将提议对ionice联机帮助页进行更新。
有关内核和 iosched 设置的更多信息(sdb 是 HDD):
Linux 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23) x86_64 GNU/Linux
/etc/debian_version = 9.3
(cd /sys/block/sdb/queue/iosched; grep . *)
back_seek_max:16384
back_seek_penalty:2
fifo_expire_async:250
fifo_expire_sync:125
group_idle:8
group_idle_us:8000
low_latency:1
quantum:8
slice_async:40
slice_async_rq:2
slice_async_us:40000
slice_idle:8
slice_idle_us:8000
slice_sync:100
slice_sync_us:100000
target_latency:300
target_latency_us:300000
Run Code Online (Sandbox Code Playgroud)
小智 2
AFAIK,解决您的问题的唯一机会是使用 CGroup v2(内核 v.4.5 或更高版本)。请参阅以下文章:
https://andrestc.com/post/cgroups-io/
另请注意,您可以使用 systemd 的包装器基于每个服务配置 CGroup 限制:
http://0pointer.de/blog/projects/resources.html
| 归档时间: |
|
| 查看次数: |
1462 次 |
| 最近记录: |