linux 如何限制复制所使用该高速缓存,以便仍有内存可供其他缓存使用?

mepcadol  于 2022-12-22  发布在  Linux
关注(0)|答案(8)|浏览(287)

基本情况:

我正在openSUSE中复制一些NTFS磁盘,每个磁盘都是2 TB,当我这样做时,系统运行缓慢。

我猜

我相信这可能是由于缓存的原因。Linux决定丢弃有用的缓存(例如,KDE 4膨胀、虚拟机磁盘、LibreOffice二进制文件、Thunderbird二进制文件等),而是填充所有可用内存(总共24 GB),这些东西从复制磁盘,这将只读一次,然后写入,永远不会再使用。所以任何时候我使用这些应用程序(或KDE 4),磁盘需要再次读取,再次阅读磁盘上的膨胀会使事情冻结/打嗝。
由于该高速缓存消失了,而这些臃肿的应用程序需要大量的缓存,这使得系统非常慢。
由于它是USB,磁盘和磁盘控制器不是瓶颈,所以使用ionice并不能使它更快。
我相信这是该高速缓存,而不仅仅是主板去太慢,因为如果我停止一切复制,它仍然运行波涛汹涌了一段时间,直到它recaches一切。
如果我重新开始复制,它需要一分钟才能再次波动。但是,我可以将它限制在40 MB/s左右,它再次运行得更快(不是因为它缓存了正确的东西,而是因为主板总线有很多额外的带宽用于系统磁盘)我完全可以接受由于主板的I/O能力被完全消耗而导致的性能损失(这是100%的使用率,意味着0%的功耗浪费,这让我很高兴),但我不能接受这种缓存机制在这个特定用例中表现得如此糟糕。

# free
             total       used       free     shared    buffers     cached
Mem:      24731556   24531876     199680          0    8834056   12998916
-/+ buffers/cache:    2698904   22032652
Swap:      4194300      24764    4169536

我也在Ubuntu上做了同样的尝试,结果导致整个系统挂起。)
而且为了澄清,我问的不是如何为“系统”留出空闲内存,而是为“缓存”留出空闲内存。我知道缓存内存在需要时会自动给回系统,但我的问题是它不是为缓存特定的东西而保留的。
是否有某种方法可以告诉这些复制操作限制内存使用,以便一些重要的内容保持缓存,因此任何速度减慢都是正常磁盘使用的结果,而不是重新读取相同的常用文件?例如,是否有允许用作缓存/缓冲区的每个进程/用户/文件系统的最大内存设置?

lfapxunr

lfapxunr1#

nocache命令是这个问题的通用答案!Debian和Ubuntu 13.10(Saucy Salamander)中也有。
Peter,谢谢你提醒我们注意rsync中的--drop-cache”选项,但是它在上游(Bug 9560 – drop-cache option)被拒绝了,取而代之的是一个更通用的解决方案:基于rsync的新“nocache”命令与fadvice一起工作。
你只需要在任何你想要的命令前面加上“nocache”,它也有很好的工具来描述和修改文件该高速缓存状态,例如,下面是使用和不使用nocache的效果:

$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%)  [filesize=7776.2K, pagesize=4K]
$ ./nocache cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%)  [filesize=7776.2K, pagesize=4K]\
$ cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 1945/1945 (100.0%)  [filesize=7776.2K, pagesize=4K]

希望这也能适用于其他备份程序(rsnapshot、duplicity、rdiff-backup、阿曼达、s3 sync、s3 ql、tar等)和其他不想破坏缓存的命令。

7uzetpgm

7uzetpgm2#

Kristof Provost非常接近,但在我的情况下,我不想使用dd或编写自己的软件,所以解决方案是在rsync中使用“--drop-cache”选项。
自从创建这个问题以来,我已经用过很多次了,它似乎完全解决了这个问题。一个例外是当我使用rsync从FreeBSD机器复制时,它不支持“--drop-cache”。所以我写了一个 Package 器来替换 /usr/local/bin/rsync 命令,并删除了该选项,现在它也可以从那里复制。
它仍然使用大量的内存作为缓冲区,似乎几乎没有保留缓存,但无论如何它都工作得很顺利。

$ free
             total       used       free     shared    buffers     cached
Mem:      24731544   24531576     199968          0   15349680     850624
-/+ buffers/cache:    8331272   16400272
Swap:      4194300     602648    3591652
6jygbczu

6jygbczu3#

你实际上有两个选择:
1.限制最大磁盘缓冲区大小:您看到的问题可能是由于默认内核配置导致的,该配置允许使用 * 巨大的 * RAM块进行磁盘缓冲,并且当您尝试向非常慢的设备写入大量内容时,您将最终使用大量宝贵的RAM进行磁盘缓存,从而降低设备的速度。
内核这样做是因为它假设进程在没有被慢速设备减慢的情况下可以继续运行,并且如果需要,只需将页面写入存储器(慢速U盘-但内核不考虑该进程的实际性能),就可以自动释放RAM。

# Wake up background writing process if there's more than 50 MB of dirty memory
 echo 50000000 > /proc/sys/vm/dirty_background_bytes
 # Limit background dirty bytes to 200 MB (source: http://serverfault.com/questions/126413/limit-linux-background-flush-dirty-pages)
 echo 200000000 > /proc/sys/vm/dirty_bytes

调整数字以匹配您愿意在磁盘写缓存上花费的RAM。合理的值取决于您的实际写性能,而不是您拥有的RAM量。您应该将目标放在仅具有足够的RAM用于缓存,以允许设备具有完整的写性能。请注意,这是一个全局设置,因此您必须根据您使用的最慢设备来设置此值。
1.为每个你想要快速运行的任务保留一个最小内存大小。实际上这意味着为你关心的东西创建cgroup,并为任何这样的组定义你想要拥有的 * 最小 * 内存。这样,内核就可以在它认为合适的时候使用 * 剩余 * 内存。详细信息,请参见下面的演示:* 一个月一次 *

    • 2022年更新日期:**

您也可以尝试创建包含以下内容的新文件/etc/udev/rules.d/90-set-default-bdi-max_ratio-and-min_ratio.rules

# For every BDI device, set max cache usage to 30% and min reserved cache to 2% of the whole cache
# https://unix.stackexchange.com/a/481356/20336
ACTION=="add|change", SUBSYSTEM=="bdi", ATTR{max_ratio}="30", ATTR{min_ratio}="2"

其思想是为最大缓存利用率设置 * 每个设备 * 的限制。(30%)您可以有两个完全停止的设备,但仍有40%的磁盘高速缓存可供系统的其余部分使用。如果您有4个或更多的并行停止设备,即使这个解决方案也不能单独帮助。这就是为什么我还为每个设备添加了2%的最小缓存空间,但我不知道如何检查这是否真的有效。我已经用这个配置运行了大约半年,我认为它工作得很好。
有关详细信息,请参见https://unix.stackexchange.com/a/481356/20336

a7qyws3x

a7qyws3x4#

内核不可能知道你不会再使用缓存的数据,这是你的信息优势。
但是您可以将交换性设置为0:sudo sysctl vm.swappiness=0。这将导致Linux在将库等写入交换之前删除该高速缓存。
它对我来说也很好用,尤其是与大量的RAM(16-32 GB)相结合时性能非常好。

6xfqseft

6xfqseft5#

如果您使用的是普通的cp,这是不可能的,但是如果您愿意自己重新实现或修补它,在输入和输出文件上设置posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE)可能会有所帮助。
posix_fadvise()告诉内核你想要的访问模式。在这种情况下,你只使用数据一次,所以缓存它没有任何意义。Linux内核遵循这些标志,所以它不应该再缓存数据。

hvvq6cgz

hvvq6cgz6#

尝试使用dd而不是cp
mount带有sync标志的文件系统。
我不完全确定这些方法是否会绕过交换,但可能值得一试。

p1iqtdky

p1iqtdky7#

我正在复制一些NTFS磁盘[...]系统运行缓慢。[...]由于它是USB [...]
减速是一个known memory management issue
使用较新的Linux内核。较旧的内核在USB数据和“透明大页”方面有问题。请参见这个LWN article。最近这个问题得到了解决-请参见LinuxChanges中的“内存管理”。

elcex8rz

elcex8rz8#

好了,现在我知道您使用的是rsync,我可以再深入了解一下:
看起来rsync在同时处理大量文件时是无效的。在他们的FAQ中有一个条目,这不是Linux/cache的问题。这是rsync消耗太多内存的问题。
在网上搜索。

相关问题