更新

更新

我有一个/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”。

更新

感谢到目前为止大家的回答!

一旦一个人知道要搜索什么,就会发现一些东西。

我拉来的东西:

为什么现在还没有专家系统来处理 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

我查了一下,虽然文档没有提到,nocache 应该可以正常写入。虽然在复制小文件时它会运行得更慢,因为它需要 fdatasync()对每个文件进行调用。

(使用 Linux 特有的功能可以减少 大量fdatasync()/调用的影响。fsync()dpkg请参阅有关 IO 和缓存效果的相关答案中有关工作原理的注释“[1]”。然而,这需要更改nocache为 defer close(),并且在某些情况下这可能会产生不需要的副作用:-(。)


另一种想法是在 cgroup 中运行复制过程,可能使用systemd-run,并设置内存消耗限制。 cgroup 内存控制器控制缓存和进程内存。我找不到该systemd-run命令的一个很好的示例(也许有人会提供一个:-)。

相关内容