添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

My guesses:

我相信这很可能是由于缓存的原因。Linux决定丢弃有用的缓存(例如。 KDE 4 臃肿,虚拟机磁盘。 LibreOffice 二进制文件、Thunderbird二进制文件等),而是用复制磁盘的东西填满所有可用的内存(共24GB),这些东西只被读取一次,然后写入,不再使用。因此,当我使用这些应用程序(或KDE 4)时,需要再次读取磁盘,而再次从磁盘上读取这些臃肿的东西会使事情冻结/打嗝。

由于缓存没有了,而且这些臃肿的应用程序需要大量的缓存,这使得系统变得非常缓慢。

由于是USB,磁盘和磁盘控制器不是瓶颈,所以使用 ionice 并不能使它更快。

我相信是缓存的问题,而不仅仅是主板速度太慢,因为如果我停止一切复制,它仍然会运行不稳定一段时间,直到它重新缓存一切。

而如果我重新启动复制,需要一分钟后才会再次出现不稳定。但同时,我可以把它限制在40MB/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上试过同样的东西,反而导致系统完全挂起。 ;)

澄清一下,我不是在问如何为 "系统 "留出内存,而是为 "缓存 "留出内存。我知道缓存内存在需要的时候会自动还给系统,但我的问题是,它没有被保留给特定的东西的缓存。

是否有一些方法可以告诉这些复制操作限制内存的使用,使一些重要的东西保持缓存,因此任何减速都是正常磁盘使用的结果,而不是重读相同的常用文件?例如,是否有一个设置,允许每个进程/用户/文件系统的最大内存被用作缓存/缓冲区?

2 个评论
顺便说一下,我正在使用rsync,并且有很多磁盘(目前有8个)。 有些在本地传输,有些用USB 3.0。有些是通过1Gbps网络传输的。
当复制没有什么。 # free total used free shared buffers cached Mem: 24731556 24474096 257460 0 16478072 6342668 -/+ buffers/cache: 1653356 23078200 Swap: 4194300 22564 4171736 似乎缓冲区有一个内存泄漏。
linux
caching
filesystems
usb
file-copying
Peter
Peter
发布于 2012-04-11
8 个回答
nealmcb
nealmcb
发布于 2012-04-11
已采纳
0 人赞同

The 缓存命令是这个问题的一般答案!它也在Debian和Ubuntu 13.10(Saucy Salamander)。

谢谢你,Peter,提醒我们注意rsync中的-drop-cache "选项。 但这在上游被拒绝了 (Bug 9560--drop-cache选项), in favor of a more general solution for this: the new "缓存" command based on the rsync work with fadvise.

You just prepend "缓存" to any command you want. It also has nice utilities for describing and modifying the cache status of files. For example, here are the effects with and without 缓存:

$ ./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、diplicity、rdiff-backup、amanda、s3sync、s3ql、tar等)和其他你不希望破坏你的缓存的命令会起作用。

@Peter 我认为nealmcb的回答 "nocache "更合适,因为不是所有的rsync都有drop-cache选项,而nocache的使用更为广泛。
从我的角度来看,我测试的每个Linux发行版(除了Manjaro,也没有FreeBSD)都对rsync打了补丁......而nocache在我使用openSUSE时并不在其中,在arch/manjaro的主仓库中也没有。我更喜欢nocache的想法(就像我喜欢nice、ionice、trickle等一样),但除非我在更多的主仓库中看到它,否则对每个人来说哪个是最好的解决方案还有点主观性。
@Peter Debian没有这个功能
@krzyk nocache不在哪个debian中? 看起来它是在 wheezy-backports, jessie, stretch 和 sid 中。packages.debian.org/sid/utils/nocache
我正在回复@Peter关于rsync中的-drop-cache的问题
Peter
Peter
发布于 2012-04-11
0 人赞同

克里斯托夫-普罗沃斯特非常接近但在我的情况下,我不想使用dd或者写我自己的软件,所以解决方案是在rsync中使用"--drop-cache "选项。

自从创建这个问题以来,我已经使用了很多次,它似乎完全解决了这个问题。一个例外是当我使用rsync从FreeBSD机器上拷贝时,它不支持"--drop-cache"。所以我写了一个包装器来代替/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
    
Drop-cache在官方rsync中不可用。
Mikko Rantalainen
Mikko Rantalainen
发布于 2012-04-11
0 人赞同

你实际上有两个选择。

  • 限制最大的磁盘缓冲区大小:你所看到的问题可能是由默认的内核配置引起的,它允许使用huge当你试图把大量的东西写到一个非常慢的设备上时,你会把很多宝贵的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数量。你的目标应该是有勉强足够的内存用于缓存,以使你的设备有充分的写入性能。注意,这是一个全局设置,所以你必须根据你所使用的最慢的设备来设置。

  • 为每个你想保持快速发展的任务保留一个最小的内存大小。在实践中,这意味着为你关心的东西创建cgroup,并定义了minimum你想为任何这样的组拥有的内存。这样一来,内核就可以用剩余的它认为合适的内存。详情请见本演讲。SREcon19亚太会议 - Linux内存管理的规模。在引擎盖下

    更新年份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"
    

    我们的想法是,把限制per device以达到最大的缓存利用率。在上述限制下(30%),你可以有两个完全停滞的设备,但仍有40%的磁盘缓存可用于系统的其他部分。如果你有4个或更多的停滞设备并存,即使这个解决方法也不能单独帮助你。这就是为什么我还为每个设备增加了2%的最小缓存空间,但我不知道如何检查这是否真的有效。我已经用这个配置运行了大约半年,我认为它运行得很好。

    See https://unix.stackexchange.com/a/481356/20336详情请见下文。

  • MPW
    MPW
    发布于 2012-04-11
    0 人赞同

    内核不可能知道你不会再使用复制出来的缓存数据。这是你的信息优势。

    但你可以把swapiness设置为0:sudo sysctl vm.swappiness=0。 这将导致Linux在库等被写入swap之前放弃缓存。

    它对我来说也很好,尤其是与大量内存(16-32GB)结合使用时,性能非常好。

    Kristof Provost
    Kristof Provost
    发布于 2012-04-11
    0 人赞同

    如果你使用普通的cp是不可能的,但如果你愿意自己重新实现或打补丁,在输入和输出文件上都设置posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE)可能会有帮助。

    替换代码2】告诉内核你的预期访问模式。在这种情况下,你只使用一次数据,所以缓存它没有任何意义。 Linux内核尊重这些标志,所以它不应该再缓存这些数据了。

    KurzedMetal
    KurzedMetal
    发布于 2012-04-11
    0 人赞同

    Try using dd instead of cp.

    或者用mount标志对文件系统进行sync

    我不完全确定这些方法是否绕过了互换,但可能值得一试。

    根据我的经验,使用rsync(没有破坏一切的-u选项)总是一个好主意。否则,当传输中断时,我就会出现未检测到的部分文件。
    第一次尝试,它在远程拷贝上不起作用,因为服务器不支持这个选项。(两者都有rsync 3.0.9协议版本30;Linux支持它,但FreeBSD 8.2不支持)而在本地传输上,它似乎对速度有相当大的限制。
    @Peter 是的,我通常会尽量避免dd,我忘了rsync......这么多实用程序 :D。
    在第2条评论之前插入这条评论......不知为何被删除了。 谢谢你的建议。这让我开始阅读rsync手册,在其中我发现了"--drop-cache "选项,这个选项对于本地传输似乎很有效。
    看看另一个答案,你甚至可能会加快同步的速度。
    Turbo J
    Turbo J
    发布于 2012-04-11
    0 人赞同

    我正在复制一些NTFS磁盘[...],系统运行缓慢。[...] 因为它是USB [...] 。

    放缓是一个已知的内存管理问题.