我有一个/dev/mydisk
基于功能堆栈的设备:LUKS 加密的软件 RAID-1。
我有时会将/dev/mydisk
内容备份到外部 USB 磁盘,该磁盘本身使用 LUKS 进行加密。需要传输几个 100 GiB。这个操作不是简单的dd
而是递归的cp
(我还需要改成使用rsync
)
备份开始一段时间后,整个系统的交互性大幅下降。 KDE 界面显然是在等待内存请求被授予。等待提示 2 分钟的情况并不罕见。等待网络 I/O 同样需要很大的耐心。这与启动并决定解压每个 zip 并为每个文件内容建立索引以用于未知目的时发生的行为类似baloo
:系统变成沼泽独木舟。
内核似乎将所有 RAM 都提供给了复制进程,并且不愿意将其交还给交互进程以提供机会。 RAM 也不差:23 GiB。还有 11 GiB 的交换空间,以防万一,但它随时都会被几个 MiB 占用。
是否可以确保交互进程优先于复制进程获取 RAM?如果是这样,怎么办?
版本信息:
- 这是 Fedora 29 (4.19.15-300.fc29.x86_64) 系统,但我知道我在早期的 Fedora 系统中也遇到过这个问题。
- KDE 版本基于“KDE Frameworks:5.53.0”。
更新
感谢到目前为止大家的回答!
一旦一个人知道要搜索什么,就会发现一些东西。
我拉来的东西:
- 2018-10:U&LSE 条目显然正是关于我的问题:在外部磁盘上执行大量读/写操作时系统滞后。正如提问者使用的那样
dd
,补救措施是使用该标志oflag=direct
来绕过页面缓存。 - 2018-11:U&LSE 关于写入速度减慢的相对普遍的问题为什么 2013 年会出现“U 盘失速”问题?为什么现有的“无 I/O 脏节流”代码不能解决这个问题?。这是相当令人困惑的,我们必须与谣言和现象作斗争。
- 2013-11:乔纳森·科贝特 (Jonathan Corbet) 在 LWM.net:有害的 USB 记忆棒停滞问题。这是《2013年报告问题》这篇文章。然而,2018-11问题的回答说这篇文章是错误的,并且基于不正确的前提。
- 2011-08: U&LSE 条目关于如何强制清除页面缓存,这可能会恢复响应能力:设置 /proc/sys/vm/drop_caches 以清除缓存
- 2016年1月:U&LSE关于如何限制大小的条目缓冲区高速缓存:限制Linux中缓冲区缓存的大小
- 关于 I/O 调度程序和写回限制的讨论。
- 2018-10:U&LSE 对此问题:“写回限制”是解决“USB 盘停滞问题”的方法吗?
- 2016-04:乔纳森·科贝特在 LWM.net:减少烦人的后台写回。
- 我也在考虑: 2017-05:通过 I/O 调度程序调整提高 Linux 系统性能,2009 年 6 月:选择 Linux I/O 调度程序
为什么现在还没有专家系统来处理 I/O 调整..?
答案1
我会 nice -n 19
备份进程(它为CPU 提供低优先级),也许还有ionice -c 3
(空闲时的I/O)。
rsync 也将是一个重大改进(它不会每次都复制 100Gb)。例如,我的备份脚本如下所示:
SOURCE=/whatever/precious/directory
DESTINATION=/media/some_usb_drive/backup
nice -n 19 rsync --verbose --archive --compress --delete --force --recursive --links --safe-links --rsh ssh --exclude-from=$EXCLUDEFILE $SOURCE $DESTINATION
# or
nice -n 19 ionice -c 3 rsync --verbose --archive --compress --delete --force --recursive --links --safe-links --rsh ssh --exclude-from=$EXCLUDEFILE $SOURCE $DESTINATION
(exclude-from 用于避开 .cache 目录、.o 文件等)
答案2
我查了一下,虽然文档没有提到,nocache
应该可以正常写入。虽然在复制小文件时它会运行得更慢,因为它需要 fdatasync()
对每个文件进行调用。
(使用 Linux 特有的功能可以减少 大量fdatasync()
/调用的影响。fsync()
dpkg
请参阅有关 IO 和缓存效果的相关答案中有关工作原理的注释“[1]”。然而,这需要更改nocache
为 defer close()
,并且在某些情况下这可能会产生不需要的副作用:-(。)
另一种想法是在 cgroup 中运行复制过程,可能使用systemd-run
,并设置内存消耗限制。 cgroup 内存控制器控制缓存和进程内存。我找不到该systemd-run
命令的一个很好的示例(也许有人会提供一个:-)。