调度程序:如何调整cfq以支持交互式进程

问题:调度程序似乎不喜欢交互式进程:

在具有从一个( btrfs )磁盘到另一个磁盘( ext4 )的自动cron预定备份的桌面系统上。 备份过程将空闲磁盘( /dev/sda )挂载,备份到它,最后卸载它。

每次备份过程启动时,系统都会变得无法使用。 调度程序似乎未能完成支持交互式进程而不是批处理进程的最基本工作。 当备份进程运行时,会有很多IO正在进行,其他一切都会冻结。 键盘和鼠标指针停止响应。 在任何终端/shell中按下按键时的回声会延迟几秒钟。

备份完成后,交互式响应将恢复正常。

有关设置和配置的更多详细信息:

备份过程使用rsnapshot (调用rsynccp -al )并以较低的优先级运行(备份作业前面是nice ),如下所示:

 nice /usr/bin/rsnapshot -VD -c /etc/my-rsnapshot.conf daily 

nice下运行备份似乎没有帮助。 在备份期间,所有交互式进程似乎都被rsynccp进程的繁重CPU和IO所rsync

这是一个IA-64,iCore-7系统,它应该能够并行运行8个进程。 内存为16GB,其中一些是免费的。 修剪下mount输出(安装附加磁盘时)为:

 /dev/sdb2 on / type btrfs (rw,relatime,subvol=@,thread_pool=4) /dev/sdb3 on /home type btrfs (rw,relatime,subvol=@home,thread_pool=4) /dev/sda2 on /media/idisk/root ext4 (rw,relatime) /dev/sda3 on /media/idisk/home ext4 (rw,relatime) none on /sys/fs/cgroup type tmpfs (rw) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset,release_agent=/run/cgmanager/agents/cgm-release-agent.cpuset,clone_children) cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu,release_agent=/run/cgmanager/agents/cgm-release-agent.cpu) cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,relatime,cpuacct,release_agent=/run/cgmanager/agents/cgm-release-agent.cpuacct) cgroup on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory,release_agent=/run/cgmanager/agents/cgm-release-agent.memory) cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices,release_agent=/run/cgmanager/agents/cgm-release-agent.devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer,release_agent=/run/cgmanager/agents/cgm-release-agent.freezer) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,relatime,blkio,release_agent=/run/cgmanager/agents/cgm-release-agent.blkio) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,relatime,perf_event,release_agent=/run/cgmanager/agents/cgm-release-agent.perf_event) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,relatime,hugetlb,release_agent=/run/cgmanager/agents/cgm-release-agent.hugetlb) 

这是一个最新的14.04 LTS系统。 默认情况下,调度程序设置为完全公平队列( cfq ):

 # cat /sys/block/sda/queue/scheduler noop deadline [cfq] # cat /sys/block/sdb/queue/scheduler noop deadline [cfq] 

我找到了一个相关的问题。 调度程序饿死了建议使用nice 进程 ,但我已经这样做了。

与相关信息相关的另一个问题是: 如何更改noop调度程序

如何在备份运行时使键盘,鼠标和交互式shell更具响应性?

提前致谢。

只是部分答案,做了更多的研究和实验,因为询问哪些解决了我的问题,并且看到没有回应

截至2016年初,Linux内核调度程序中存在已知问题/错误。

简短的总结是,在不同的情况下,即使进程队列中存在可运行的进程,核仍然处于空闲状态。

参考文献:

  • Linux Scheduler,十年浪费的核心
  • github存储库,包含对调度的实验性修复

从btrfs切换到ext4可以缓解这些问题:

我亲自从btrfs切换回ext4。 I / O性能明显提高。

切换到SSD可以进一步缓解IO性能

SSD的价格和可靠性大幅下降。 2TB三星SSD(EVO 850)现在售价略高于600美元。 将系统(root和home)切换到SSD现在使密集备份活动完全不明显(系统SSD在同一系统上对常规ext4格式磁盘进行大量写入时很快)。

最后:使用SSD,内核中复杂调度程序的好处似乎变得有问题。 我将默认值更改为noop,但性能没有明显下降。 事实上,使用noop调度程序,我发现系统负载减少,CPU缩放数量减少,硬件温度降低。

 $ cat /sys/block/sda/queue/scheduler [noop] deadline cfq $ cat /proc/cpuinfo | grep Hz model name : Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz cpu MHz : 836.308 model name : Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz cpu MHz : 990.253 ... similar low actual frequency scaling for all cores ...