问题:调度程序似乎不支持交互式进程:
在具有从一个 ( btrfs
) 磁盘到另一个 ( ) 磁盘的自动 cron 计划备份的桌面系统上ext4
。备份进程挂载空闲磁盘 ( /dev/sda<X>
),备份到它,最后卸载它。
每次备份过程启动时,系统都会变得不可用。调度程序似乎未能完成其支持交互式进程而不是批处理进程的最基本工作。在备份进程运行时,有很多 IO 正在进行,其他一切都冻结了。键盘和鼠标指针停止响应。在任何终端/外壳中按下按键时的回声会延迟几秒钟。
备份完成后,交互式响应将恢复正常。
有关设置和配置的更多详细信息:
备份过程使用rsnapshot
(调用rsync
and cp -al
)并以较低的优先级运行(备份作业前面是nice
),如下所示:
nice /usr/bin/rsnapshot -VD -c /etc/my-rsnapshot.conf daily
在下运行备份nice
似乎没有帮助。在备份期间,所有交互进程似乎都被rsync
andcp
进程的繁重 CPU 和 IO 饿死了。
这是一个 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 内核调度程序中存在已知问题/错误。
简短的总结是,在不同的情况下,即使进程队列中有可运行的进程,核心仍保持空闲状态。
参考:
从 btrfs 切换到 ext4 可以缓解这些问题:
我个人从 btrfs 切换回 ext4。I/O 性能显着提高。
切换到 SSD 可以进一步降低 IO 性能
SSD 的价格和可靠性大幅下降。2TB 的三星 SSD (EVO 850) 现在售价略高于 600 美元。现在,将系统(根和主目录)切换到 SSD 使得密集的备份活动完全不被注意到(系统 SSD 在对同一系统上的常规 ext4 格式磁盘进行大量写入时非常灵活)。
最后:对于 SSD,内核中复杂调度程序的好处似乎变得值得怀疑。我将默认设置更改为 noop,但性能没有明显下降。事实上,使用 noop 调度程序,我看到系统负载减少、CPU 扩展数量减少和硬件温度降低。
2021 年 12 月更新
Michael Larabel @ Phoronix运行了一些基准测试来确认底线:
虽然一些 Linux 发行版仍然默认使用 MQ-Deadline 或 Kyber 作为 NVMe SSD 存储,但不使用 I/O 调度程序仍然倾向于在整体上执行最佳...
noop
调度程序在 Linux 内核 5.x 中已更改名称。现在调用它,none
因此如果您的系统没有旋转磁盘并且您想切换到noop
调度程序,您可以使用它(必须在 root shell 中运行,并且必须确保您拥有正确的设备):